From 753a6c60f47f3ac4f270005b65e9d6481de8eb68 Mon Sep 17 00:00:00 2001 From: Ashlee Young Date: Fri, 23 Oct 2015 10:00:02 -0700 Subject: [PATCH] Adding maven and ant source trees Change-Id: I0a39b9add833a31b9c3f98d193983ae2f3a5a445 Signed-off-by: Ashlee Young --- build.sh | 36 +- framework/src/ant/apache-ant-1.9.6/CONTRIBUTORS | 417 ++ framework/src/ant/apache-ant-1.9.6/INSTALL | 2 + framework/src/ant/apache-ant-1.9.6/KEYS | 1497 +++++ framework/src/ant/apache-ant-1.9.6/LICENSE | 272 + framework/src/ant/apache-ant-1.9.6/NOTICE | 9 + framework/src/ant/apache-ant-1.9.6/README | 97 + framework/src/ant/apache-ant-1.9.6/WHATSNEW | 6263 ++++++++++++++++++++ framework/src/ant/apache-ant-1.9.6/bootstrap.bat | 138 + framework/src/ant/apache-ant-1.9.6/bootstrap.sh | 167 + framework/src/ant/apache-ant-1.9.6/build.bat | 40 + framework/src/ant/apache-ant-1.9.6/build.sh | 57 + framework/src/ant/apache-ant-1.9.6/build.xml | 2037 +++++++ .../src/ant/apache-ant-1.9.6/contributors.xml | 1671 ++++++ framework/src/ant/apache-ant-1.9.6/fetch.xml | 335 ++ framework/src/ant/apache-ant-1.9.6/get-m2.xml | 121 + framework/src/ant/apache-ant-1.9.6/lib/README | 3 + .../ant/apache-ant-1.9.6/lib/libraries.properties | 65 + .../lib/optional/hamcrest-core-1.3.jar | Bin 0 -> 45024 bytes .../apache-ant-1.9.6/lib/optional/junit-3.8.2.jar | Bin 0 -> 120640 bytes .../apache-ant-1.9.6/lib/optional/junit-4.11.jar | Bin 0 -> 245039 bytes .../manual/Integration/anttool1.gif | Bin 0 -> 4211 bytes .../manual/Integration/jext-plugin.html | 56 + .../apache-ant-1.9.6/manual/Integration/remacc.gif | Bin 0 -> 10931 bytes .../manual/Integration/toolmenu.gif | Bin 0 -> 17569 bytes framework/src/ant/apache-ant-1.9.6/manual/LICENSE | 203 + .../manual/Tasks/BorlandEJBTasks.html | 143 + .../manual/Tasks/BorlandGenerateClient.html | 90 + .../src/ant/apache-ant-1.9.6/manual/Tasks/ant.html | 413 ++ .../ant/apache-ant-1.9.6/manual/Tasks/antcall.html | 201 + .../ant/apache-ant-1.9.6/manual/Tasks/antlr.html | 200 + .../manual/Tasks/antstructure.html | 100 + .../apache-ant-1.9.6/manual/Tasks/antversion.html | 95 + .../ant/apache-ant-1.9.6/manual/Tasks/apply.html | 499 ++ .../src/ant/apache-ant-1.9.6/manual/Tasks/apt.html | 179 + .../ant/apache-ant-1.9.6/manual/Tasks/attrib.html | 167 + .../ant/apache-ant-1.9.6/manual/Tasks/augment.html | 83 + .../apache-ant-1.9.6/manual/Tasks/available.html | 160 + .../apache-ant-1.9.6/manual/Tasks/basename.html | 92 + .../apache-ant-1.9.6/manual/Tasks/bindtargets.html | 92 + .../apache-ant-1.9.6/manual/Tasks/buildnumber.html | 74 + .../src/ant/apache-ant-1.9.6/manual/Tasks/cab.html | 167 + .../src/ant/apache-ant-1.9.6/manual/Tasks/ccm.html | 272 + .../apache-ant-1.9.6/manual/Tasks/changelog.html | 294 + .../apache-ant-1.9.6/manual/Tasks/checksum.html | 269 + .../ant/apache-ant-1.9.6/manual/Tasks/chgrp.html | 185 + .../ant/apache-ant-1.9.6/manual/Tasks/chmod.html | 225 + .../ant/apache-ant-1.9.6/manual/Tasks/chown.html | 183 + .../apache-ant-1.9.6/manual/Tasks/clearcase.html | 958 +++ .../ant/apache-ant-1.9.6/manual/Tasks/common.html | 59 + .../manual/Tasks/componentdef.html | 62 + .../ant/apache-ant-1.9.6/manual/Tasks/concat.html | 337 ++ .../apache-ant-1.9.6/manual/Tasks/condition.html | 110 + .../apache-ant-1.9.6/manual/Tasks/conditions.html | 1087 ++++ .../ant/apache-ant-1.9.6/manual/Tasks/copy.html | 376 ++ .../ant/apache-ant-1.9.6/manual/Tasks/copydir.html | 136 + .../apache-ant-1.9.6/manual/Tasks/copyfile.html | 73 + .../src/ant/apache-ant-1.9.6/manual/Tasks/cvs.html | 230 + .../ant/apache-ant-1.9.6/manual/Tasks/cvspass.html | 70 + .../apache-ant-1.9.6/manual/Tasks/cvstagdiff.html | 241 + .../apache-ant-1.9.6/manual/Tasks/cvsversion.html | 108 + .../manual/Tasks/defaultexcludes.html | 107 + .../ant/apache-ant-1.9.6/manual/Tasks/delete.html | 228 + .../ant/apache-ant-1.9.6/manual/Tasks/deltree.html | 56 + .../ant/apache-ant-1.9.6/manual/Tasks/depend.html | 216 + .../apache-ant-1.9.6/manual/Tasks/dependset.html | 171 + .../apache-ant-1.9.6/manual/Tasks/diagnostics.html | 49 + .../ant/apache-ant-1.9.6/manual/Tasks/dirname.html | 74 + .../src/ant/apache-ant-1.9.6/manual/Tasks/ear.html | 301 + .../ant/apache-ant-1.9.6/manual/Tasks/echo.html | 193 + .../manual/Tasks/echoproperties.html | 146 + .../ant/apache-ant-1.9.6/manual/Tasks/echoxml.html | 74 + .../src/ant/apache-ant-1.9.6/manual/Tasks/ejb.html | 1777 ++++++ .../ant/apache-ant-1.9.6/manual/Tasks/exec.html | 460 ++ .../ant/apache-ant-1.9.6/manual/Tasks/fail.html | 143 + .../ant/apache-ant-1.9.6/manual/Tasks/filter.html | 79 + .../ant/apache-ant-1.9.6/manual/Tasks/fixcrlf.html | 327 + .../src/ant/apache-ant-1.9.6/manual/Tasks/ftp.html | 724 +++ .../ant/apache-ant-1.9.6/manual/Tasks/genkey.html | 125 + .../src/ant/apache-ant-1.9.6/manual/Tasks/get.html | 239 + .../ant/apache-ant-1.9.6/manual/Tasks/gunzip.html | 29 + .../ant/apache-ant-1.9.6/manual/Tasks/gzip.html | 29 + .../apache-ant-1.9.6/manual/Tasks/hostinfo.html | 98 + .../manual/Tasks/image-classdiagram.gif | Bin 0 -> 132412 bytes .../ant/apache-ant-1.9.6/manual/Tasks/image.html | 261 + .../ant/apache-ant-1.9.6/manual/Tasks/import.html | 349 ++ .../ant/apache-ant-1.9.6/manual/Tasks/include.html | 344 ++ .../ant/apache-ant-1.9.6/manual/Tasks/input.html | 198 + .../src/ant/apache-ant-1.9.6/manual/Tasks/jar.html | 588 ++ .../manual/Tasks/jarlib-available.html | 134 + .../manual/Tasks/jarlib-display.html | 80 + .../manual/Tasks/jarlib-manifest.html | 123 + .../manual/Tasks/jarlib-resolve.html | 211 + .../ant/apache-ant-1.9.6/manual/Tasks/java.html | 405 ++ .../ant/apache-ant-1.9.6/manual/Tasks/javac.html | 860 +++ .../ant/apache-ant-1.9.6/manual/Tasks/javacc.html | 210 + .../ant/apache-ant-1.9.6/manual/Tasks/javadoc.html | 915 +++ .../ant/apache-ant-1.9.6/manual/Tasks/javah.html | 243 + .../ant/apache-ant-1.9.6/manual/Tasks/jdepend.html | 177 + .../ant/apache-ant-1.9.6/manual/Tasks/jjdoc.html | 123 + .../ant/apache-ant-1.9.6/manual/Tasks/jjtree.html | 563 ++ .../ant/apache-ant-1.9.6/manual/Tasks/jlink.html | 177 + .../ant/apache-ant-1.9.6/manual/Tasks/jspc.html | 308 + .../ant/apache-ant-1.9.6/manual/Tasks/junit.html | 802 +++ .../apache-ant-1.9.6/manual/Tasks/junitreport.html | 214 + .../ant/apache-ant-1.9.6/manual/Tasks/length.html | 127 + .../apache-ant-1.9.6/manual/Tasks/loadfile.html | 133 + .../manual/Tasks/loadproperties.html | 140 + .../manual/Tasks/loadresource.html | 93 + .../ant/apache-ant-1.9.6/manual/Tasks/local.html | 186 + .../apache-ant-1.9.6/manual/Tasks/macrodef.html | 385 ++ .../ant/apache-ant-1.9.6/manual/Tasks/mail.html | 362 ++ .../ant/apache-ant-1.9.6/manual/Tasks/makeurl.html | 234 + .../apache-ant-1.9.6/manual/Tasks/manifest.html | 197 + .../manual/Tasks/manifestclasspath.html | 117 + .../apache-ant-1.9.6/manual/Tasks/mimemail.html | 115 + .../ant/apache-ant-1.9.6/manual/Tasks/mkdir.html | 52 + .../ant/apache-ant-1.9.6/manual/Tasks/move.html | 258 + .../manual/Tasks/native2ascii.html | 246 + .../apache-ant-1.9.6/manual/Tasks/netrexxc.html | 338 ++ .../ant/apache-ant-1.9.6/manual/Tasks/nice.html | 70 + .../ant/apache-ant-1.9.6/manual/Tasks/pack.html | 76 + .../apache-ant-1.9.6/manual/Tasks/parallel.html | 235 + .../ant/apache-ant-1.9.6/manual/Tasks/patch.html | 111 + .../apache-ant-1.9.6/manual/Tasks/pathconvert.html | 224 + .../apache-ant-1.9.6/manual/Tasks/presetdef.html | 184 + .../manual/Tasks/projecthelper.html | 59 + .../apache-ant-1.9.6/manual/Tasks/property.html | 345 ++ .../manual/Tasks/propertyfile.html | 249 + .../manual/Tasks/propertyhelper.html | 108 + .../apache-ant-1.9.6/manual/Tasks/pvcstask.html | 295 + .../apache-ant-1.9.6/manual/Tasks/recorder.html | 172 + .../ant/apache-ant-1.9.6/manual/Tasks/rename.html | 64 + .../manual/Tasks/renameextensions.html | 123 + .../ant/apache-ant-1.9.6/manual/Tasks/replace.html | 242 + .../manual/Tasks/replaceregexp.html | 205 + .../manual/Tasks/resourcecount.html | 107 + .../ant/apache-ant-1.9.6/manual/Tasks/retry.html | 61 + .../ant/apache-ant-1.9.6/manual/Tasks/rexec.html | 116 + .../ant/apache-ant-1.9.6/manual/Tasks/rmic.html | 353 ++ .../src/ant/apache-ant-1.9.6/manual/Tasks/rpm.html | 123 + .../manual/Tasks/schemavalidate.html | 283 + .../src/ant/apache-ant-1.9.6/manual/Tasks/scp.html | 293 + .../ant/apache-ant-1.9.6/manual/Tasks/script.html | 393 ++ .../apache-ant-1.9.6/manual/Tasks/scriptdef.html | 332 ++ .../apache-ant-1.9.6/manual/Tasks/sequential.html | 55 + .../manual/Tasks/serverdeploy.html | 335 ++ .../apache-ant-1.9.6/manual/Tasks/setproxy.html | 220 + .../ant/apache-ant-1.9.6/manual/Tasks/signjar.html | 299 + .../ant/apache-ant-1.9.6/manual/Tasks/sleep.html | 85 + .../src/ant/apache-ant-1.9.6/manual/Tasks/sos.html | 503 ++ .../ant/apache-ant-1.9.6/manual/Tasks/sound.html | 123 + .../ant/apache-ant-1.9.6/manual/Tasks/splash.html | 154 + .../src/ant/apache-ant-1.9.6/manual/Tasks/sql.html | 511 ++ .../ant/apache-ant-1.9.6/manual/Tasks/sshexec.html | 291 + .../apache-ant-1.9.6/manual/Tasks/sshsession.html | 288 + .../ant/apache-ant-1.9.6/manual/Tasks/style.html | 629 ++ .../ant/apache-ant-1.9.6/manual/Tasks/subant.html | 608 ++ .../ant/apache-ant-1.9.6/manual/Tasks/symlink.html | 146 + .../ant/apache-ant-1.9.6/manual/Tasks/sync.html | 166 + .../src/ant/apache-ant-1.9.6/manual/Tasks/tar.html | 281 + .../ant/apache-ant-1.9.6/manual/Tasks/taskdef.html | 44 + .../ant/apache-ant-1.9.6/manual/Tasks/telnet.html | 155 + .../apache-ant-1.9.6/manual/Tasks/tempfile.html | 229 + .../ant/apache-ant-1.9.6/manual/Tasks/touch.html | 157 + .../apache-ant-1.9.6/manual/Tasks/translate.html | 182 + .../apache-ant-1.9.6/manual/Tasks/truncate.html | 109 + .../ant/apache-ant-1.9.6/manual/Tasks/tstamp.html | 161 + .../ant/apache-ant-1.9.6/manual/Tasks/typedef.html | 269 + .../ant/apache-ant-1.9.6/manual/Tasks/unpack.html | 117 + .../ant/apache-ant-1.9.6/manual/Tasks/untar.html | 35 + .../ant/apache-ant-1.9.6/manual/Tasks/unzip.html | 244 + .../apache-ant-1.9.6/manual/Tasks/uptodate.html | 177 + .../apache-ant-1.9.6/manual/Tasks/verifyjar.html | 145 + .../src/ant/apache-ant-1.9.6/manual/Tasks/vss.html | 823 +++ .../ant/apache-ant-1.9.6/manual/Tasks/waitfor.html | 133 + .../src/ant/apache-ant-1.9.6/manual/Tasks/war.html | 364 ++ .../manual/Tasks/whichresource.html | 120 + .../ant/apache-ant-1.9.6/manual/Tasks/wljspc.html | 99 + .../apache-ant-1.9.6/manual/Tasks/xmlproperty.html | 289 + .../apache-ant-1.9.6/manual/Tasks/xmlvalidate.html | 263 + .../src/ant/apache-ant-1.9.6/manual/Tasks/zip.html | 551 ++ .../ant/apache-ant-1.9.6/manual/Types/antlib.html | 266 + .../apache-ant-1.9.6/manual/Types/assertions.html | 208 + .../manual/Types/classfileset.html | 119 + .../manual/Types/custom-programming.html | 415 ++ .../apache-ant-1.9.6/manual/Types/description.html | 46 + .../ant/apache-ant-1.9.6/manual/Types/dirset.html | 154 + .../apache-ant-1.9.6/manual/Types/extension.html | 114 + .../manual/Types/extensionset.html | 83 + .../apache-ant-1.9.6/manual/Types/filelist.html | 120 + .../ant/apache-ant-1.9.6/manual/Types/fileset.html | 186 + .../apache-ant-1.9.6/manual/Types/filterchain.html | 1739 ++++++ .../apache-ant-1.9.6/manual/Types/filterset.html | 200 + .../ant/apache-ant-1.9.6/manual/Types/mapper.html | 972 +++ .../manual/Types/multirootfileset.html | 173 + .../apache-ant-1.9.6/manual/Types/namespace.html | 224 + .../apache-ant-1.9.6/manual/Types/patternset.html | 192 + .../apache-ant-1.9.6/manual/Types/permissions.html | 164 + .../apache-ant-1.9.6/manual/Types/propertyset.html | 143 + .../apache-ant-1.9.6/manual/Types/redirector.html | 193 + .../ant/apache-ant-1.9.6/manual/Types/regexp.html | 116 + .../apache-ant-1.9.6/manual/Types/resources.html | 1380 +++++ .../manual/Types/selectors-program.html | 244 + .../apache-ant-1.9.6/manual/Types/selectors.html | 1566 +++++ .../apache-ant-1.9.6/manual/Types/tarfileset.html | 182 + .../apache-ant-1.9.6/manual/Types/xmlcatalog.html | 306 + .../apache-ant-1.9.6/manual/Types/zipfileset.html | 148 + .../ant/apache-ant-1.9.6/manual/antexternal.html | 160 + .../ant/apache-ant-1.9.6/manual/anttaskslist.html | 41 + .../apache-ant-1.9.6/manual/argumentprocessor.html | 76 + .../apache-ant-1.9.6/manual/base_task_classes.html | 114 + .../src/ant/apache-ant-1.9.6/manual/clonevm.html | 52 + .../apache-ant-1.9.6/manual/conceptstypeslist.html | 90 + .../src/ant/apache-ant-1.9.6/manual/cover.html | 53 + .../src/ant/apache-ant-1.9.6/manual/credits.html | 70 + .../src/ant/apache-ant-1.9.6/manual/develop.html | 544 ++ .../ant/apache-ant-1.9.6/manual/developlist.html | 53 + .../src/ant/apache-ant-1.9.6/manual/dirtasks.html | 314 + .../src/ant/apache-ant-1.9.6/manual/favicon.ico | Bin 0 -> 3638 bytes .../src/ant/apache-ant-1.9.6/manual/feedback.html | 72 + framework/src/ant/apache-ant-1.9.6/manual/ide.html | 105 + .../src/ant/apache-ant-1.9.6/manual/ifunless.html | 64 + .../manual/images/ant_logo_large.gif | Bin 0 -> 3804 bytes .../src/ant/apache-ant-1.9.6/manual/index.html | 34 + .../ant/apache-ant-1.9.6/manual/inputhandler.html | 116 + .../src/ant/apache-ant-1.9.6/manual/install.html | 1096 ++++ .../ant/apache-ant-1.9.6/manual/installlist.html | 44 + .../src/ant/apache-ant-1.9.6/manual/intro.html | 69 + .../ant/apache-ant-1.9.6/manual/javacprops.html | 53 + .../src/ant/apache-ant-1.9.6/manual/listeners.html | 623 ++ .../src/ant/apache-ant-1.9.6/manual/platform.html | 178 + .../ant/apache-ant-1.9.6/manual/projecthelper.html | 150 + .../ant/apache-ant-1.9.6/manual/properties.html | 399 ++ .../src/ant/apache-ant-1.9.6/manual/proxy.html | 292 + .../src/ant/apache-ant-1.9.6/manual/running.html | 622 ++ .../ant/apache-ant-1.9.6/manual/runninglist.html | 47 + .../apache-ant-1.9.6/manual/stylesheets/style.css | 72 + .../ant/apache-ant-1.9.6/manual/sysclasspath.html | 79 + .../src/ant/apache-ant-1.9.6/manual/targets.html | 300 + .../src/ant/apache-ant-1.9.6/manual/tasklist.html | 195 + .../ant/apache-ant-1.9.6/manual/tasksoverview.html | 1198 ++++ framework/src/ant/apache-ant-1.9.6/manual/toc.html | 51 + .../manual/tutorial-HelloWorldWithAnt.html | 520 ++ .../manual/tutorial-tasks-filesets-properties.html | 993 ++++ .../manual/tutorial-tasks-filesets-properties.zip | Bin 0 -> 15377 bytes .../manual/tutorial-writing-tasks-src.zip | Bin 0 -> 2474 bytes .../manual/tutorial-writing-tasks.html | 819 +++ .../src/ant/apache-ant-1.9.6/manual/tutorials.html | 45 + .../src/ant/apache-ant-1.9.6/manual/using.html | 579 ++ .../src/ant/apache-ant-1.9.6/manual/usinglist.html | 50 + framework/src/ant/apache-ant-1.9.6/patch.xml | 48 + .../apache-ant-1.9.6/src/antidote/WHAT-IS-THIS-P | 6 + .../src/ant/apache-ant-1.9.6/src/etc/ant-bin.wxs | 454 ++ .../src/ant/apache-ant-1.9.6/src/etc/ant-msi.wxs | 122 + .../ant/apache-ant-1.9.6/src/etc/ant-update.xsl | 117 + .../src/ant/apache-ant-1.9.6/src/etc/changelog.xsl | 148 + .../src/etc/checkstyle/RequiredHeader.txt | 17 + .../src/etc/checkstyle/checkstyle-config | 139 + .../checkstyle/checkstyle-frames-sortby-check.xsl | 367 ++ .../src/etc/checkstyle/checkstyle-frames.xsl | 299 + .../src/etc/checkstyle/checkstyle-text.xsl | 34 + .../src/etc/checkstyle/checkstyle-xdoc.xsl | 130 + .../ant/apache-ant-1.9.6/src/etc/common2master.xsl | 73 + .../apache-ant-1.9.6/src/etc/coverage-frames.xsl | 487 ++ .../apache-ant-1.9.6/src/etc/jdepend-frames.xsl | 485 ++ .../src/ant/apache-ant-1.9.6/src/etc/jdepend.xsl | 276 + .../src/etc/junit-frames-xalan1.xsl | 745 +++ .../ant/apache-ant-1.9.6/src/etc/junit-frames.xsl | 972 +++ .../apache-ant-1.9.6/src/etc/junit-noframes.xsl | 513 ++ framework/src/ant/apache-ant-1.9.6/src/etc/log.xsl | 203 + .../src/ant/apache-ant-1.9.6/src/etc/manifest | 4 + .../ant/apache-ant-1.9.6/src/etc/maudit-frames.xsl | 502 ++ .../apache-ant-1.9.6/src/etc/mmetrics-frames.xsl | 1023 ++++ .../apache-ant-1.9.6/src/etc/performance/build.xml | 124 + .../src/etc/performance/dirscanner.xml | 316 + .../ant/apache-ant-1.9.6/src/etc/poms/README.txt | 53 + .../src/etc/poms/ant-antlr/pom.xml | 75 + .../src/etc/poms/ant-apache-bcel/pom.xml | 71 + .../src/etc/poms/ant-apache-bsf/pom.xml | 74 + .../src/etc/poms/ant-apache-log4j/pom.xml | 69 + .../src/etc/poms/ant-apache-oro/pom.xml | 74 + .../src/etc/poms/ant-apache-regexp/pom.xml | 70 + .../src/etc/poms/ant-apache-resolver/pom.xml | 69 + .../src/etc/poms/ant-apache-xalan2/pom.xml | 94 + .../src/etc/poms/ant-commons-logging/pom.xml | 70 + .../src/etc/poms/ant-commons-net/pom.xml | 75 + .../apache-ant-1.9.6/src/etc/poms/ant-jai/pom.xml | 85 + .../src/etc/poms/ant-javamail/pom.xml | 78 + .../src/etc/poms/ant-jdepend/pom.xml | 72 + .../apache-ant-1.9.6/src/etc/poms/ant-jmf/pom.xml | 65 + .../apache-ant-1.9.6/src/etc/poms/ant-jsch/pom.xml | 74 + .../src/etc/poms/ant-junit/pom.xml | 101 + .../src/etc/poms/ant-junit4/pom.xml | 71 + .../src/etc/poms/ant-launcher/pom.xml | 57 + .../src/etc/poms/ant-netrexx/pom.xml | 98 + .../src/etc/poms/ant-swing/pom.xml | 66 + .../src/etc/poms/ant-testutil/pom.xml | 74 + .../ant/apache-ant-1.9.6/src/etc/poms/ant/pom.xml | 225 + .../src/ant/apache-ant-1.9.6/src/etc/poms/pom.xml | 151 + .../apache-ant-1.9.6/src/etc/printFailingTests.xsl | 45 + .../src/ant/apache-ant-1.9.6/src/etc/tagdiff.xsl | 179 + .../src/etc/testcases/asf-logo.gif | Bin 0 -> 7279 bytes .../src/etc/testcases/buildfiletest-base.xml | 11 + .../src/etc/testcases/core/antclassloader.xml | 80 + .../src/etc/testcases/core/case.xml | 37 + .../core/containersrc/test/SpecialSeq.java | 67 + .../src/etc/testcases/core/directoryscanner.xml | 41 + .../src/etc/testcases/core/dispatch/dispatch.xml | 34 + .../testcases/core/duplicate-target-imported.xml | 23 + .../src/etc/testcases/core/duplicate-target.xml | 31 + .../src/etc/testcases/core/duplicate-target2.xml | 26 + .../src/etc/testcases/core/executor.xml | 29 + .../src/etc/testcases/core/extended-taskdef.xml | 73 + .../src/etc/testcases/core/immutable.xml | 79 + .../etc/testcases/core/include/basic/include.inc | 20 + .../etc/testcases/core/include/basic/include.xml | 25 + .../etc/testcases/core/include/basic/relative.xml | 26 + .../testcases/core/include/frag#ment/include.inc | 20 + .../testcases/core/include/frag#ment/include.xml | 26 + .../testcases/core/include/frag#ment/relative.xml | 26 + .../testcases/core/include/frag#ment/simple.xml | 23 + .../include/included_file_parse_error/build.xml | 33 + .../included_file_parse_error/included_file.xml | 21 + .../include/included_file_task_error/build.xml | 33 + .../included_file_task_error/included_file.xml | 21 + .../include/including_file_parse_error/build.xml | 35 + .../including_file_parse_error/included_file.xml | 20 + .../include/including_file_task_error/build.xml | 34 + .../including_file_task_error/included_file.xml | 20 + .../testcases/core/include/with space/include.inc | 19 + .../testcases/core/include/with space/include.xml | 25 + .../testcases/core/include/with space/relative.xml | 25 + .../testcases/core/include/with space/simple.xml | 22 + .../src/etc/testcases/core/loaderref/loaderref.xml | 46 + .../etc/testcases/core/loaderref/src/Task1.java | 21 + .../src/etc/testcases/core/location.xml | 74 + .../src/etc/testcases/core/taskcontainer.xml | 62 + .../etc/testcases/core/topleveltasks/notarget.xml | 21 + .../core/topleveltasks/targetlevelant.xml | 22 + .../testcases/core/topleveltasks/toplevelant.xml | 21 + .../src/etc/testcases/core/unknownelement.xml | 39 + .../src/etc/testcases/filters/build.xml | 147 + .../src/etc/testcases/filters/concat.xml | 117 + .../src/etc/testcases/filters/dynamicfilter.xml | 48 + .../testcases/filters/expected/escapeunicode.test | 9 + .../testcases/filters/expected/head-tail.head.test | 10 + .../filters/expected/head-tail.headAllSkip.test | 58 + .../filters/expected/head-tail.headLines.test | 2 + .../filters/expected/head-tail.headLinesSkip.test | 2 + .../filters/expected/head-tail.headSkip.test | 10 + .../filters/expected/head-tail.headtail.test | 2 + .../testcases/filters/expected/head-tail.tail.test | 10 + .../filters/expected/head-tail.tailAllSkip.test | 58 + .../filters/expected/head-tail.tailLines.test | 2 + .../filters/expected/head-tail.tailLinesSkip.test | 2 + .../filters/expected/head-tail.tailSkip.test | 10 + .../testcases/filters/expected/linecontains.test | 4 + .../filters/expected/negatelinecontains.test | 3 + .../filters/expected/replacetokens.double.test | 2 + .../testcases/filters/expected/replacetokens.test | 2 + .../filters/expected/stripjavacomments.test | 19 + .../src/etc/testcases/filters/head-tail.xml | 146 + .../etc/testcases/filters/input/escapeunicode.test | 9 + .../testcases/filters/input/head-tail.small.test | 5 + .../src/etc/testcases/filters/input/head-tail.test | 60 + .../etc/testcases/filters/input/linecontains.test | 7 + .../filters/input/replacetokens.double.test | 2 + .../filters/input/replacetokens.mustache.test | 2 + .../etc/testcases/filters/input/replacetokens.test | 2 + .../etc/testcases/filters/input/sample.properties | 16 + .../testcases/filters/input/stripjavacomments.test | 30 + .../src/etc/testcases/filters/tokenfilter.xml | 357 ++ .../src/etc/testcases/taskdefs/abstractcvstask.xml | 47 + .../etc/testcases/taskdefs/ant.topleveltest.xml | 20 + .../src/etc/testcases/taskdefs/ant.xml | 261 + .../src/etc/testcases/taskdefs/ant/ant.xml | 33 + .../src/etc/testcases/taskdefs/ant/references.xml | 33 + .../etc/testcases/taskdefs/antlib.current-test.xml | 29 + .../src/etc/testcases/taskdefs/antlib.xml | 72 + .../src/etc/testcases/taskdefs/antstructure.xml | 41 + .../src/etc/testcases/taskdefs/available.xml | 269 + .../src/etc/testcases/taskdefs/bar.properties | 15 + .../src/etc/testcases/taskdefs/basename.xml | 57 + .../src/etc/testcases/taskdefs/bunzip2.xml | 47 + .../src/etc/testcases/taskdefs/bzip2.xml | 44 + .../src/etc/testcases/taskdefs/calltarget.xml | 120 + .../src/etc/testcases/taskdefs/checksum.xml | 266 + .../src/etc/testcases/taskdefs/checksum/foo/Bar | 1 + .../etc/testcases/taskdefs/checksum/foo/zap/Eenie | 1 + .../src/etc/testcases/taskdefs/classloader.xml | 40 + .../src/etc/testcases/taskdefs/concat-input/A | 1 + .../src/etc/testcases/taskdefs/concat-input/B | 1 + .../src/etc/testcases/taskdefs/concat.xml | 214 + .../src/etc/testcases/taskdefs/condition.xml | 521 ++ .../testcases/taskdefs/conditions/antversion.xml | 66 + .../src/etc/testcases/taskdefs/conditions/http.xml | 57 + .../testcases/taskdefs/conditions/isfailure.xml | 65 + .../taskdefs/conditions/isfileselected.xml | 70 + .../testcases/taskdefs/conditions/isreachable.xml | 105 + .../testcases/taskdefs/conditions/isreference.xml | 60 + .../etc/testcases/taskdefs/conditions/issigned.xml | 78 + .../taskdefs/conditions/jars/apassword.jar | Bin 0 -> 1708 bytes .../testcases/taskdefs/conditions/jars/nosign.jar | Bin 0 -> 451 bytes .../testcases/taskdefs/conditions/jars/pass.jar | Bin 0 -> 1690 bytes .../taskdefs/conditions/parsersupports.xml | 95 + .../testcases/taskdefs/conditions/typefound.xml | 75 + .../src/etc/testcases/taskdefs/conditions/xor.xml | 112 + .../src/etc/testcases/taskdefs/copy.filterset | 1 + .../src/etc/testcases/taskdefs/copy.xml | 268 + .../src/etc/testcases/taskdefs/copy/expected/utf-8 | 1 + .../etc/testcases/taskdefs/copy/input/iso8859-1 | 1 + .../src/etc/testcases/taskdefs/copydir.xml | 56 + .../src/etc/testcases/taskdefs/copyfile.xml | 56 + .../src/etc/testcases/taskdefs/cvspass.xml | 85 + .../src/etc/testcases/taskdefs/defaultexcludes.xml | 37 + .../src/etc/testcases/taskdefs/delete.xml | 194 + .../src/etc/testcases/taskdefs/deltree.xml | 29 + .../src/etc/testcases/taskdefs/dirname.xml | 41 + .../src/etc/testcases/taskdefs/dynamictask.xml | 37 + .../src/etc/testcases/taskdefs/echoxml.xml | 46 + .../src/etc/testcases/taskdefs/email/mail.xml | 40 + .../src/etc/testcases/taskdefs/exec/blabla.sh | 24 + .../src/etc/testcases/taskdefs/exec/blabla.xml | 19 + .../src/etc/testcases/taskdefs/exec/exec.xml | 69 + .../src/etc/testcases/taskdefs/exec/parrot.sh | 19 + .../src/etc/testcases/taskdefs/exec/spawn.sh | 29 + .../taskdefs/expected/asf-logo-huge.tar.bz2 | Bin 0 -> 58089 bytes .../taskdefs/expected/asf-logo-huge.tar.gz | Bin 0 -> 30905 bytes .../testcases/taskdefs/expected/asf-logo.gif.bz2 | Bin 0 -> 7435 bytes .../testcases/taskdefs/expected/asf-logo.gif.gz | Bin 0 -> 6996 bytes .../testcases/taskdefs/expected/asf-logo.gif.md5 | 1 + .../taskdefs/expected/asf-logo.gif.md5sum | 1 + .../taskdefs/expected/asf-logo.gif.pattern | 1 + .../testcases/taskdefs/expected/asf-logo.gif.svf | 1 + .../testcases/taskdefs/expected/asf-logo.gif.tar | Bin 0 -> 10240 bytes .../taskdefs/expected/asf-logo.gif.tar.bz2 | Bin 0 -> 7543 bytes .../taskdefs/expected/asf-logo.gif.tar.gz | Bin 0 -> 7116 bytes .../testcases/taskdefs/expected/asf-logo.gif.zip | Bin 0 -> 7121 bytes .../taskdefs/expected/copy.filterset.filtered | 1 + .../src/etc/testcases/taskdefs/fail.xml | 130 + .../src/etc/testcases/taskdefs/filter.xml | 72 + .../src/etc/testcases/taskdefs/filter1.txt | 1 + .../src/etc/testcases/taskdefs/filter2.txt | 1 + .../src/etc/testcases/taskdefs/filter3.txt | 1 + .../etc/testcases/taskdefs/filterdefs.properties | 15 + .../src/etc/testcases/taskdefs/fixcrlf/build.xml | 331 ++ .../etc/testcases/taskdefs/fixcrlf/expected.zip | Bin 0 -> 5642 bytes .../src/etc/testcases/taskdefs/fixcrlf/input.zip | Bin 0 -> 4815 bytes .../src/etc/testcases/taskdefs/foo.properties | 15 + .../src/etc/testcases/taskdefs/get.xml | 107 + .../src/etc/testcases/taskdefs/gunzip.xml | 58 + .../src/etc/testcases/taskdefs/gzip.xml | 56 + .../src/etc/testcases/taskdefs/import/a.xml | 20 + .../src/etc/testcases/taskdefs/import/b.xml | 21 + .../src/etc/testcases/taskdefs/import/bad.xml | 20 + .../src/etc/testcases/taskdefs/import/c.xml | 21 + .../src/etc/testcases/taskdefs/import/import.xml | 34 + .../taskdefs/import/import_bad_import.xml | 20 + .../taskdefs/import/import_same_target.xml | 21 + .../src/etc/testcases/taskdefs/import/imported.xml | 26 + .../taskdefs/import/importtargetfirst.xml | 22 + .../taskdefs/import/recursive-selfimport.xml | 22 + .../etc/testcases/taskdefs/import/same_target.xml | 20 + .../import/subdir/importinsequential-inner.xml | 25 + .../taskdefs/import/subdir/importinsequential.xml | 22 + .../import/subdir/importintarget-inner.xml | 23 + .../taskdefs/import/subdir/importintarget.xml | 24 + .../testcases/taskdefs/import/subdir/serial.xml | 22 + .../testcases/taskdefs/import/symlinks/d1/p1.xml | 21 + .../testcases/taskdefs/import/symlinks/d2/p2.xml | 18 + .../testcases/taskdefs/import/symlinks/d3a/p3.xml | 18 + .../etc/testcases/taskdefs/import/targetfirst.xml | 21 + .../src/etc/testcases/taskdefs/import/unnamed1.xml | 22 + .../src/etc/testcases/taskdefs/import/unnamed2.xml | 20 + .../testcases/taskdefs/import/unnamedImport.xml | 25 + .../src/etc/testcases/taskdefs/initializeclass.xml | 41 + .../src/etc/testcases/taskdefs/input.properties | 25 + .../src/etc/testcases/taskdefs/input.stdin | 2 + .../src/etc/testcases/taskdefs/input.xml | 119 + .../src/etc/testcases/taskdefs/jar.xml | 285 + .../src/etc/testcases/taskdefs/java.xml | 404 ++ .../taskdefs/javadoc/java/ClassToJavadoc.java | 39 + .../src/etc/testcases/taskdefs/javadoc/javadoc.xml | 155 + .../src/etc/testcases/taskdefs/loadfile.xml | 163 + .../src/etc/testcases/taskdefs/macrodef.xml | 290 + .../src/etc/testcases/taskdefs/makeurl.xml | 79 + .../src/etc/testcases/taskdefs/manifest.xml | 267 + .../etc/testcases/taskdefs/manifestclasspath.xml | 238 + .../taskdefs/manifestclasspath/Alpha.java | 21 + .../testcases/taskdefs/manifestclasspath/Beta.java | 25 + .../src/etc/testcases/taskdefs/manifests/test1.mf | 1 + .../src/etc/testcases/taskdefs/manifests/test2.mf | 2 + .../src/etc/testcases/taskdefs/manifests/test3.mf | 3 + .../src/etc/testcases/taskdefs/manifests/test4.mf | 4 + .../src/etc/testcases/taskdefs/manifests/test5.mf | 3 + .../src/etc/testcases/taskdefs/manifests/test6.mf | 5 + .../src/etc/testcases/taskdefs/manifests/test7.mf | 4 + .../src/etc/testcases/taskdefs/mkdir.xml | 39 + .../src/etc/testcases/taskdefs/move.xml | 263 + .../src/etc/testcases/taskdefs/multimap.xml | 192 + .../src/etc/testcases/taskdefs/nice.xml | 66 + .../src/etc/testcases/taskdefs/nopermissions.zip | Bin 0 -> 138 bytes .../etc/testcases/taskdefs/optional/antlr/antlr.g | 76 + .../testcases/taskdefs/optional/antlr/antlr.xml | 128 + .../taskdefs/optional/antlr/extended.calc.g | 23 + .../etc/testcases/taskdefs/optional/antlr/java.g | 1162 ++++ .../testcases/taskdefs/optional/antlr/java.tree.g | 312 + .../testcases/taskdefs/optional/depend/depend.xml | 196 + .../testcases/taskdefs/optional/depend/src1/A.java | 20 + .../testcases/taskdefs/optional/depend/src1/B.java | 19 + .../testcases/taskdefs/optional/depend/src1/C.java | 19 + .../testcases/taskdefs/optional/depend/src1/D.java | 19 + .../testcases/taskdefs/optional/depend/src1/E.java | 22 + .../testcases/taskdefs/optional/depend/src2/A.java | 21 + .../testcases/taskdefs/optional/depend/src2/B.java | 19 + .../testcases/taskdefs/optional/depend/src3/A.java | 23 + .../testcases/taskdefs/optional/depend/src3/B.java | 19 + .../depend/src4/test/ContainsOnlyInner.java | 24 + .../optional/depend/src4/test/MethodParam.java | 24 + .../taskdefs/optional/depend/src4/test/Outer.java | 23 + .../testcases/taskdefs/optional/depend/src5/A.java | 22 + .../testcases/taskdefs/optional/depend/src5/B.java | 19 + .../taskdefs/optional/echoproperties.properties | 15 + .../testcases/taskdefs/optional/echoproperties.xml | 133 + .../i18n/translate/expected/de/template.txt | 1 + .../translate/input/resources_ger_DE.properties | 24 + .../optional/i18n/translate/input/template.txt | 1 + .../taskdefs/optional/i18n/translate/translate.xml | 44 + .../testcases/taskdefs/optional/image/image.xml | 73 + .../taskdefs/optional/image/src/badimage.jpg | Bin 0 -> 875960 bytes .../taskdefs/optional/image/src/largeimage.jpg | Bin 0 -> 336783 bytes .../testcases/taskdefs/optional/javah/build.xml | 56 + .../optional/javah/input/org/example/Foo.java | 26 + .../taskdefs/optional/jdepend/jdepend.xml | 70 + .../taskdefs/optional/jsp/1nvalid-classname.jsp | 25 + .../taskdefs/optional/jsp/WEB-INF/web.xml | 20 + .../testcases/taskdefs/optional/jsp/default.jsp | 25 + .../taskdefs/optional/jsp/missing_tld.jsp | 32 + .../etc/testcases/taskdefs/optional/jsp/simple.jsp | 25 + .../testcases/taskdefs/optional/jsp/uriroot.jsp | 25 + .../etc/testcases/taskdefs/optional/jsp/xml.jsp | 32 + .../src/etc/testcases/taskdefs/optional/jspc.xml | 133 + .../src/etc/testcases/taskdefs/optional/junit.xml | 361 ++ .../taskdefs/optional/junit/cdataoutput.xml | 28 + .../testcases/taskdefs/optional/junit/matches.xml | 25 + .../taskdefs/optional/junit/teardownlistener.xml | 50 + .../junitreport-with-include/junit-frames.xsl | 879 +++ .../junitreport-with-include/junit-import.xsl | 24 + .../testcases/taskdefs/optional/junitreport.xml | 189 + .../INCOMPLETE-sampleproject.incomplete.xml | 31 + .../NAMESPACE-sampleproject.namespace.xml | 116 + .../TEST-sampleproject.coins.CoinTest.xml | 115 + .../TEST-sampleproject.util.UniqueStringTest.xml | 93 + .../WRONGELEMENT-sampleproject.wrongelement.xml | 18 + .../ZEROBYTES-sampleproject.package.xml | 0 .../taskdefs/optional/junitreport/junit-frames.xsl | 879 +++ .../taskdefs/optional/native2ascii/build.xml | 38 + .../optional/native2ascii/expected/iso8859-1.test | 1 + .../optional/native2ascii/input/iso8859-1.test | 1 + .../etc/testcases/taskdefs/optional/net/ftp.xml | 331 ++ .../testcases/taskdefs/optional/propertyfile.xml | 123 + .../src/etc/testcases/taskdefs/optional/pvcs.xml | 50 + .../taskdefs/optional/replaceregexp.properties | 16 + .../testcases/taskdefs/optional/replaceregexp.xml | 83 + .../taskdefs/optional/replaceregexp2.properties | 15 + .../optional/replaceregexp2.result.properties | 15 + .../testcases/taskdefs/optional/schemavalidate.xml | 100 + .../src/etc/testcases/taskdefs/optional/script.xml | 46 + .../taskdefs/optional/script/scriptdef.xml | 145 + .../taskdefs/optional/script_reference.xml | 27 + .../etc/testcases/taskdefs/optional/sos/sos.xml | 124 + .../testcases/taskdefs/optional/splash-test.xml | 45 + .../testcases/taskdefs/optional/unix/symlink.xml | 354 ++ .../etc/testcases/taskdefs/optional/vss/vss.xml | 68 + .../taskdefs/optional/xalan-redirect-in.xsl | 37 + .../etc/testcases/taskdefs/optional/xml/about.xml | 26 + .../etc/testcases/taskdefs/optional/xml/apache.xsl | 35 + .../etc/testcases/taskdefs/optional/xml/books.xml | 28 + .../etc/testcases/taskdefs/optional/xml/catalog | 2 + .../testcases/taskdefs/optional/xml/doc-in-ns.xsd | 38 + .../etc/testcases/taskdefs/optional/xml/doc.dtd | 24 + .../etc/testcases/taskdefs/optional/xml/doc.xsd | 37 + .../etc/testcases/taskdefs/optional/xml/doc.xsl | 26 + .../taskdefs/optional/xml/docwithentity.xml | 29 + .../optional/xml/endpiece-noSchema-invalid.xml | 30 + .../taskdefs/optional/xml/endpiece-noSchema.xml | 28 + .../optional/xml/endpiece-ns-no-location.xml | 23 + .../testcases/taskdefs/optional/xml/endpiece.xml | 23 + .../testcases/taskdefs/optional/xml/endpiece2.xml | 26 + .../etc/testcases/taskdefs/optional/xml/entity.xml | 20 + .../taskdefs/optional/xml/iso-2022-jp.xml | 23 + .../taskdefs/optional/xml/stylesheet_include.xsl | 28 + .../optional/xml/stylesheet_with_include.xsl | 28 + .../etc/testcases/taskdefs/optional/xml/test.xml | 25 + .../etc/testcases/taskdefs/optional/xml/test.xsl | 25 + .../etc/testcases/taskdefs/optional/xml/utf-8.xml | 23 + .../testcases/taskdefs/optional/xml/validate.xml | 28 + .../testcases/taskdefs/optional/xmlvalidate.xml | 208 + .../src/etc/testcases/taskdefs/optional/xslt.xml | 102 + .../taskdefs/optional/xsltliaison-encoding-in.xml | 20 + .../taskdefs/optional/xsltliaison-encoding-in.xsl | 27 + .../testcases/taskdefs/optional/xsltliaison-in.xml | 23 + .../testcases/taskdefs/optional/xsltliaison-in.xsl | 20 + .../taskdefs/optional/xsltliaison-include.xml | 19 + .../taskdefs/optional/xsltliaison-include.xsl | 20 + .../src/etc/testcases/taskdefs/parallel.xml | 163 + .../src/etc/testcases/taskdefs/pathconvert.xml | 42 + .../src/etc/testcases/taskdefs/presetdef.xml | 147 + .../src/etc/testcases/taskdefs/property.xml | 92 + .../etc/testcases/taskdefs/property1.properties | 17 + .../etc/testcases/taskdefs/property2.properties | 17 + .../etc/testcases/taskdefs/property3.properties | 18 + .../etc/testcases/taskdefs/property4.properties | 16 + .../etc/testcases/taskdefs/property5.properties | 17 + .../src/etc/testcases/taskdefs/recorder.xml | 73 + .../testcases/taskdefs/recorder/rectest1.result | 1 + .../testcases/taskdefs/recorder/rectest2.result | 2 + .../testcases/taskdefs/recorder/rectest3.result | 2 + .../testcases/taskdefs/recorder/rectest4.result | 1 + .../testcases/taskdefs/recorder/rectest5.result | 5 + .../testcases/taskdefs/recorder/rectest6.result | 3 + .../src/etc/testcases/taskdefs/recorder2.xml | 29 + .../src/etc/testcases/taskdefs/rename.xml | 50 + .../src/etc/testcases/taskdefs/replace.xml | 94 + .../src/etc/testcases/taskdefs/replace/result.txt | 7 + .../src/etc/testcases/taskdefs/replace/source.txt | 4 + .../src/etc/testcases/taskdefs/replace/value.txt | 3 + .../src/etc/testcases/taskdefs/rmic/rmic.xml | 499 ++ .../testcases/taskdefs/rmic/src/AntTimestamp.java | 45 + .../taskdefs/rmic/src/RemoteTimestamp.java | 26 + .../taskdefs/rmic/src/RemoteTimestampImpl.java | 28 + .../src/etc/testcases/taskdefs/signjar.xml | 97 + .../src/etc/testcases/taskdefs/skinconfig.dtd | 19 + .../src/etc/testcases/taskdefs/sleep.xml | 47 + .../src/etc/testcases/taskdefs/style/build.xml | 197 + .../src/etc/testcases/taskdefs/style/data.xml | 18 + .../etc/testcases/taskdefs/style/printFilename.xsl | 38 + .../etc/testcases/taskdefs/style/printParams.xsl | 36 + .../taskdefs/style/testNewerStylesheet.xsl | 28 + .../src/etc/testcases/taskdefs/subant.xml | 65 + .../testcases/taskdefs/subant/genericsubant.xml | 22 + .../taskdefs/subant/subant-test1/mysubant.xml | 31 + .../taskdefs/subant/subant-test2/mysubant.xml | 28 + .../src/etc/testcases/taskdefs/sync.xml | 141 + .../src/etc/testcases/taskdefs/tar.xml | 200 + .../src/etc/testcases/taskdefs/taskdef.xml | 89 + .../src/etc/testcases/taskdefs/template.xml | 17 + .../src/etc/testcases/taskdefs/test.antlib.xml | 22 + .../src/etc/testcases/taskdefs/test2.antlib.xml | 22 + .../src/etc/testcases/taskdefs/toplevelant.xml | 24 + .../src/etc/testcases/taskdefs/toplevelantcall.xml | 24 + .../src/etc/testcases/taskdefs/toplevelsubant.xml | 26 + .../src/etc/testcases/taskdefs/touch.xml | 216 + .../src/etc/testcases/taskdefs/typeadapter.xml | 79 + .../src/etc/testcases/taskdefs/typedef.xml | 84 + .../src/etc/testcases/taskdefs/untar.xml | 103 + .../src/etc/testcases/taskdefs/unzip.xml | 184 + .../src/etc/testcases/taskdefs/uptodate.xml | 57 + .../src/etc/testcases/taskdefs/war.xml | 39 + .../src/etc/testcases/taskdefs/whichresource.xml | 37 + .../src/etc/testcases/taskdefs/xmlns.xml | 67 + .../src/etc/testcases/taskdefs/xmlproperty.xml | 44 + .../goldfiles/keeproot-collapse-input1.properties | 21 + .../keeproot-collapse-original.properties | 20 + .../keeproot-collapse-override.properties | 17 + .../keeproot-nocollapse-input1.properties | 8 + .../keeproot-nocollapse-original.properties | 20 + .../goldfiles/keeproot-semantic-include.properties | 21 + .../goldfiles/keeproot-semantic-input1.properties | 21 + .../keeproot-semantic-override.properties | 17 + .../nokeeproot-collapse-input1.properties | 21 + .../nokeeproot-collapse-original.properties | 19 + .../nokeeproot-nocollapse-input1.properties | 7 + .../nokeeproot-nocollapse-multi.properties | 16 + .../nokeeproot-nocollapse-original.properties | 19 + .../nokeeproot-semantic-include-input1.properties | 21 + .../nokeeproot-semantic-input1.properties | 21 + .../nokeeproot-semantic-locations.properties | 16 + .../goldfiles/nokeeproot-semantic-paths.properties | 16 + .../nokeeproot-semantic-references.properties | 20 + .../taskdefs/xmlproperty/inputs/input1.xml | 27 + .../taskdefs/xmlproperty/inputs/locations.xml | 20 + .../taskdefs/xmlproperty/inputs/multi.xml | 25 + .../taskdefs/xmlproperty/inputs/original.xml | 22 + .../taskdefs/xmlproperty/inputs/override.xml | 27 + .../taskdefs/xmlproperty/inputs/paths.xml | 22 + .../taskdefs/xmlproperty/inputs/references.xml | 24 + .../etc/testcases/taskdefs/xmlproperty_data.dtd | 30 + .../etc/testcases/taskdefs/xmlproperty_data.xml | 22 + .../testcases/taskdefs/xmlproperty_needscat.xml | 22 + .../etc/testcases/taskdefs/xmlproperty_withdtd.xml | 24 + .../src/etc/testcases/taskdefs/zip.xml | 287 + .../testcases/taskdefs/zip/zipgroupfileset1.zip | Bin 0 -> 2211 bytes .../testcases/taskdefs/zip/zipgroupfileset2.zip | Bin 0 -> 1825 bytes .../testcases/taskdefs/zip/zipgroupfileset3.zip | Bin 0 -> 313 bytes .../src/etc/testcases/testkeystore | Bin 0 -> 2453 bytes .../src/etc/testcases/types/addtype.xml | 163 + .../src/etc/testcases/types/assertions.xml | 205 + .../testcases/types/assertions/AssertionMain.java | 31 + .../testcases/types/assertions/AssertionTest.java | 45 + .../src/etc/testcases/types/description1.xml | 22 + .../src/etc/testcases/types/description2.xml | 23 + .../src/etc/testcases/types/description3.xml | 23 + .../src/etc/testcases/types/description4.xml | 23 + .../src/etc/testcases/types/filelist.xml | 54 + .../src/etc/testcases/types/filterset.xml | 146 + .../src/etc/testcases/types/filterseta.txt | 2 + .../src/etc/testcases/types/filtersetb.txt | 5 + .../src/etc/testcases/types/filtersetc.txt | 7 + .../src/etc/testcases/types/filtersetd.txt | 1 + .../src/etc/testcases/types/filtersfile1 | 2 + .../src/etc/testcases/types/filtersfile2 | 1 + .../src/etc/testcases/types/flexinteger.xml | 35 + .../src/etc/testcases/types/gold/filterset1.txt | 2 + .../src/etc/testcases/types/gold/filterset2.txt | 5 + .../src/etc/testcases/types/gold/filterset3.txt | 7 + .../src/etc/testcases/types/mapper.xml | 67 + .../types/mappers/define.mapperresult.xml | 25 + .../src/etc/testcases/types/mappers/globmapper.xml | 32 + .../etc/testcases/types/mappers/regexpmapper.xml | 32 + .../etc/testcases/types/mappers/scriptmapper.xml | 58 + .../src/etc/testcases/types/poly.xml | 62 + .../src/etc/testcases/types/quote1.xml | 25 + .../src/etc/testcases/types/quote2.xml | 26 + .../src/etc/testcases/types/redirector.xml | 79 + .../etc/testcases/types/resources/javaresource.xml | 24 + .../etc/testcases/types/resources/resourcelist.xml | 26 + .../src/etc/testcases/types/resources/tarentry.xml | 40 + .../src/etc/testcases/types/selectors.xml | 356 ++ .../testcases/types/selectors/scriptselector.xml | 138 + .../testcases/types/selectors/signedselector.xml | 61 + .../src/etc/testcases/types/xmlcatalog.xml | 150 + .../src/etc/testcases/types/xmlcatalog.xsl | 47 + .../src/etc/testcases/types/xmlcatalog1.xml | 30 + .../src/etc/testcases/types/xmlcatalog2.xml | 27 + .../src/etc/testcases/types/xmlfragment.xml | 31 + .../src/etc/testcases/util/simple.properties | 24 + .../src/etc/testcases/util/unusual.properties | 37 + .../src/ant/apache-ant-1.9.6/src/etc/yearcheck.sh | 101 + .../main/org/apache/tools/ant/AntClassLoader.java | 1622 +++++ .../org/apache/tools/ant/AntTypeDefinition.java | 389 ++ .../org/apache/tools/ant/ArgumentProcessor.java | 72 + .../tools/ant/ArgumentProcessorRegistry.java | 171 + .../src/main/org/apache/tools/ant/BuildEvent.java | 203 + .../main/org/apache/tools/ant/BuildException.java | 153 + .../main/org/apache/tools/ant/BuildListener.java | 110 + .../src/main/org/apache/tools/ant/BuildLogger.java | 72 + .../main/org/apache/tools/ant/ComponentHelper.java | 1101 ++++ .../org/apache/tools/ant/DefaultDefinitions.java | 76 + .../main/org/apache/tools/ant/DefaultLogger.java | 380 ++ .../org/apache/tools/ant/DemuxInputStream.java | 74 + .../org/apache/tools/ant/DemuxOutputStream.java | 249 + .../src/main/org/apache/tools/ant/Diagnostics.java | 715 +++ .../org/apache/tools/ant/DirectoryScanner.java | 1900 ++++++ .../org/apache/tools/ant/DynamicAttribute.java | 38 + .../org/apache/tools/ant/DynamicAttributeNS.java | 41 + .../org/apache/tools/ant/DynamicConfigurator.java | 29 + .../apache/tools/ant/DynamicConfiguratorNS.java | 27 + .../main/org/apache/tools/ant/DynamicElement.java | 36 + .../org/apache/tools/ant/DynamicElementNS.java | 37 + .../apache/tools/ant/DynamicObjectAttribute.java | 41 + .../src/main/org/apache/tools/ant/Evaluable.java | 29 + .../src/main/org/apache/tools/ant/Executor.java | 48 + .../main/org/apache/tools/ant/ExitException.java | 61 + .../org/apache/tools/ant/ExitStatusException.java | 69 + .../main/org/apache/tools/ant/ExtensionPoint.java | 60 + .../src/main/org/apache/tools/ant/FileScanner.java | 158 + .../org/apache/tools/ant/IntrospectionHelper.java | 1745 ++++++ .../src/main/org/apache/tools/ant/Location.java | 179 + .../src/main/org/apache/tools/ant/MagicNames.java | 293 + .../src/main/org/apache/tools/ant/Main.java | 1317 ++++ .../main/org/apache/tools/ant/NoBannerLogger.java | 100 + .../main/org/apache/tools/ant/PathTokenizer.java | 166 + .../src/main/org/apache/tools/ant/Project.java | 2494 ++++++++ .../org/apache/tools/ant/ProjectComponent.java | 169 + .../main/org/apache/tools/ant/ProjectHelper.java | 698 +++ .../apache/tools/ant/ProjectHelperRepository.java | 337 ++ .../main/org/apache/tools/ant/PropertyHelper.java | 1215 ++++ .../org/apache/tools/ant/RuntimeConfigurable.java | 608 ++ .../org/apache/tools/ant/SubBuildListener.java | 58 + .../src/main/org/apache/tools/ant/Target.java | 532 ++ .../src/main/org/apache/tools/ant/Task.java | 481 ++ .../src/main/org/apache/tools/ant/TaskAdapter.java | 182 + .../apache/tools/ant/TaskConfigurationChecker.java | 111 + .../main/org/apache/tools/ant/TaskContainer.java | 41 + .../src/main/org/apache/tools/ant/TypeAdapter.java | 66 + .../main/org/apache/tools/ant/UnknownElement.java | 699 +++ .../tools/ant/UnsupportedAttributeException.java | 49 + .../tools/ant/UnsupportedElementException.java | 57 + .../src/main/org/apache/tools/ant/XmlLogger.java | 474 ++ .../src/main/org/apache/tools/ant/antlib.xml | 144 + .../tools/ant/attribute/AttributeNamespace.java | 28 + .../tools/ant/attribute/BaseIfAttribute.java | 86 + .../tools/ant/attribute/EnableAttribute.java | 35 + .../tools/ant/attribute/IfBlankAttribute.java | 39 + .../apache/tools/ant/attribute/IfSetAttribute.java | 39 + .../tools/ant/attribute/IfTrueAttribute.java | 41 + .../main/org/apache/tools/ant/defaultManifest.mf | 4 + .../apache/tools/ant/dispatch/DispatchTask.java | 59 + .../apache/tools/ant/dispatch/DispatchUtils.java | 124 + .../apache/tools/ant/dispatch/Dispatchable.java | 31 + .../apache/tools/ant/filters/BaseFilterReader.java | 199 + .../tools/ant/filters/BaseParamFilterReader.java | 74 + .../apache/tools/ant/filters/ChainableReader.java | 37 + .../apache/tools/ant/filters/ClassConstants.java | 165 + .../org/apache/tools/ant/filters/ConcatFilter.java | 218 + .../apache/tools/ant/filters/EscapeUnicode.java | 123 + .../apache/tools/ant/filters/ExpandProperties.java | 142 + .../apache/tools/ant/filters/FixCrLfFilter.java | 1004 ++++ .../org/apache/tools/ant/filters/HeadFilter.java | 222 + .../org/apache/tools/ant/filters/LineContains.java | 244 + .../tools/ant/filters/LineContainsRegExp.java | 242 + .../org/apache/tools/ant/filters/PrefixLines.java | 164 + .../apache/tools/ant/filters/ReplaceTokens.java | 379 ++ .../org/apache/tools/ant/filters/SortFilter.java | 375 ++ .../tools/ant/filters/StringInputStream.java | 49 + .../tools/ant/filters/StripJavaComments.java | 145 + .../apache/tools/ant/filters/StripLineBreaks.java | 154 + .../tools/ant/filters/StripLineComments.java | 237 + .../org/apache/tools/ant/filters/SuffixLines.java | 174 + .../org/apache/tools/ant/filters/TabsToSpaces.java | 155 + .../org/apache/tools/ant/filters/TailFilter.java | 243 + .../org/apache/tools/ant/filters/TokenFilter.java | 712 +++ .../org/apache/tools/ant/filters/UniqFilter.java | 37 + .../tools/ant/filters/util/ChainReaderHelper.java | 288 + .../tools/ant/filters/util/JavaClassHelper.java | 70 + .../org/apache/tools/ant/helper/AntXMLContext.java | 417 ++ .../apache/tools/ant/helper/DefaultExecutor.java | 60 + .../ant/helper/IgnoreDependenciesExecutor.java | 70 + .../apache/tools/ant/helper/ProjectHelper2.java | 1238 ++++ .../apache/tools/ant/helper/ProjectHelperImpl.java | 1026 ++++ .../tools/ant/helper/SingleCheckExecutor.java | 47 + .../tools/ant/input/DefaultInputHandler.java | 120 + .../apache/tools/ant/input/GreedyInputHandler.java | 80 + .../org/apache/tools/ant/input/InputHandler.java | 41 + .../org/apache/tools/ant/input/InputRequest.java | 93 + .../ant/input/MultipleChoiceInputRequest.java | 58 + .../tools/ant/input/PropertyFileInputHandler.java | 92 + .../apache/tools/ant/input/SecureInputHandler.java | 59 + .../main/org/apache/tools/ant/launch/AntMain.java | 42 + .../apache/tools/ant/launch/LaunchException.java | 38 + .../main/org/apache/tools/ant/launch/Launcher.java | 412 ++ .../main/org/apache/tools/ant/launch/Locator.java | 528 ++ .../apache/tools/ant/listener/AnsiColorLogger.java | 249 + .../tools/ant/listener/BigProjectLogger.java | 194 + .../tools/ant/listener/CommonsLoggingListener.java | 332 ++ .../apache/tools/ant/listener/Log4jListener.java | 177 + .../org/apache/tools/ant/listener/MailLogger.java | 440 ++ .../apache/tools/ant/listener/ProfileLogger.java | 112 + .../apache/tools/ant/listener/SilentLogger.java | 62 + .../tools/ant/listener/SimpleBigProjectLogger.java | 46 + .../tools/ant/listener/TimestampedLogger.java | 54 + .../apache/tools/ant/listener/defaults.properties | 58 + .../apache/tools/ant/loader/AntClassLoader2.java | 31 + .../apache/tools/ant/loader/AntClassLoader5.java | 65 + .../org/apache/tools/ant/property/GetProperty.java | 31 + .../apache/tools/ant/property/LocalProperties.java | 152 + .../tools/ant/property/LocalPropertyStack.java | 161 + .../org/apache/tools/ant/property/NullReturn.java | 38 + .../tools/ant/property/ParseNextProperty.java | 44 + .../apache/tools/ant/property/ParseProperties.java | 199 + .../tools/ant/property/PropertyExpander.java | 51 + .../tools/ant/property/ResolvePropertyMap.java | 151 + .../org/apache/tools/ant/property/package.html | 19 + .../apache/tools/ant/taskdefs/AbstractCvsTask.java | 873 +++ .../tools/ant/taskdefs/AbstractJarSignerTask.java | 423 ++ .../main/org/apache/tools/ant/taskdefs/Ant.java | 836 +++ .../apache/tools/ant/taskdefs/AntStructure.java | 485 ++ .../main/org/apache/tools/ant/taskdefs/Antlib.java | 184 + .../tools/ant/taskdefs/AntlibDefinition.java | 81 + .../main/org/apache/tools/ant/taskdefs/Apt.java | 270 + .../tools/ant/taskdefs/AttributeNamespaceDef.java | 51 + .../tools/ant/taskdefs/AugmentReference.java | 96 + .../org/apache/tools/ant/taskdefs/Available.java | 514 ++ .../org/apache/tools/ant/taskdefs/BUnzip2.java | 112 + .../main/org/apache/tools/ant/taskdefs/BZip2.java | 74 + .../org/apache/tools/ant/taskdefs/Basename.java | 110 + .../org/apache/tools/ant/taskdefs/BindTargets.java | 91 + .../org/apache/tools/ant/taskdefs/BuildNumber.java | 201 + .../org/apache/tools/ant/taskdefs/CVSPass.java | 172 + .../org/apache/tools/ant/taskdefs/CallTarget.java | 255 + .../org/apache/tools/ant/taskdefs/Checksum.java | 712 +++ .../main/org/apache/tools/ant/taskdefs/Chmod.java | 261 + .../org/apache/tools/ant/taskdefs/Classloader.java | 244 + .../apache/tools/ant/taskdefs/CloseResources.java | 59 + .../tools/ant/taskdefs/CommandLauncherTask.java | 56 + .../apache/tools/ant/taskdefs/Componentdef.java | 40 + .../main/org/apache/tools/ant/taskdefs/Concat.java | 955 +++ .../apache/tools/ant/taskdefs/ConditionTask.java | 130 + .../main/org/apache/tools/ant/taskdefs/Copy.java | 1111 ++++ .../org/apache/tools/ant/taskdefs/CopyPath.java | 214 + .../org/apache/tools/ant/taskdefs/Copydir.java | 163 + .../org/apache/tools/ant/taskdefs/Copyfile.java | 116 + .../main/org/apache/tools/ant/taskdefs/Cvs.java | 41 + .../org/apache/tools/ant/taskdefs/DefBase.java | 167 + .../apache/tools/ant/taskdefs/DefaultExcludes.java | 115 + .../org/apache/tools/ant/taskdefs/Definer.java | 639 ++ .../main/org/apache/tools/ant/taskdefs/Delete.java | 836 +++ .../org/apache/tools/ant/taskdefs/Deltree.java | 112 + .../org/apache/tools/ant/taskdefs/DependSet.java | 299 + .../apache/tools/ant/taskdefs/DiagnosticsTask.java | 41 + .../org/apache/tools/ant/taskdefs/Dirname.java | 82 + .../main/org/apache/tools/ant/taskdefs/Ear.java | 154 + .../main/org/apache/tools/ant/taskdefs/Echo.java | 170 + .../org/apache/tools/ant/taskdefs/EchoXML.java | 137 + .../main/org/apache/tools/ant/taskdefs/Exec.java | 281 + .../org/apache/tools/ant/taskdefs/ExecTask.java | 726 +++ .../org/apache/tools/ant/taskdefs/Execute.java | 734 +++ .../org/apache/tools/ant/taskdefs/ExecuteJava.java | 331 ++ .../org/apache/tools/ant/taskdefs/ExecuteOn.java | 784 +++ .../tools/ant/taskdefs/ExecuteStreamHandler.java | 68 + .../apache/tools/ant/taskdefs/ExecuteWatchdog.java | 177 + .../main/org/apache/tools/ant/taskdefs/Exit.java | 235 + .../main/org/apache/tools/ant/taskdefs/Expand.java | 527 ++ .../main/org/apache/tools/ant/taskdefs/Filter.java | 101 + .../org/apache/tools/ant/taskdefs/FixCRLF.java | 696 +++ .../main/org/apache/tools/ant/taskdefs/GUnzip.java | 97 + .../main/org/apache/tools/ant/taskdefs/GZip.java | 68 + .../org/apache/tools/ant/taskdefs/GenerateKey.java | 420 ++ .../main/org/apache/tools/ant/taskdefs/Get.java | 883 +++ .../org/apache/tools/ant/taskdefs/HostInfo.java | 256 + .../org/apache/tools/ant/taskdefs/ImportTask.java | 348 ++ .../main/org/apache/tools/ant/taskdefs/Input.java | 259 + .../org/apache/tools/ant/taskdefs/JDBCTask.java | 525 ++ .../main/org/apache/tools/ant/taskdefs/Jar.java | 1238 ++++ .../main/org/apache/tools/ant/taskdefs/Java.java | 965 +++ .../main/org/apache/tools/ant/taskdefs/Javac.java | 1270 ++++ .../org/apache/tools/ant/taskdefs/Javadoc.java | 2624 ++++++++ .../main/org/apache/tools/ant/taskdefs/Jikes.java | 132 + .../tools/ant/taskdefs/JikesOutputParser.java | 183 + .../org/apache/tools/ant/taskdefs/KeySubst.java | 191 + .../main/org/apache/tools/ant/taskdefs/Length.java | 335 ++ .../org/apache/tools/ant/taskdefs/LoadFile.java | 41 + .../apache/tools/ant/taskdefs/LoadProperties.java | 248 + .../apache/tools/ant/taskdefs/LoadResource.java | 236 + .../main/org/apache/tools/ant/taskdefs/Local.java | 47 + .../apache/tools/ant/taskdefs/LogOutputStream.java | 111 + .../tools/ant/taskdefs/LogStreamHandler.java | 70 + .../org/apache/tools/ant/taskdefs/MacroDef.java | 851 +++ .../apache/tools/ant/taskdefs/MacroInstance.java | 411 ++ .../org/apache/tools/ant/taskdefs/MakeUrl.java | 298 + .../org/apache/tools/ant/taskdefs/Manifest.java | 1183 ++++ .../tools/ant/taskdefs/ManifestClassPath.java | 180 + .../tools/ant/taskdefs/ManifestException.java | 36 + .../apache/tools/ant/taskdefs/ManifestTask.java | 293 + .../apache/tools/ant/taskdefs/MatchingTask.java | 446 ++ .../main/org/apache/tools/ant/taskdefs/Mkdir.java | 114 + .../main/org/apache/tools/ant/taskdefs/Move.java | 382 ++ .../main/org/apache/tools/ant/taskdefs/Nice.java | 99 + .../main/org/apache/tools/ant/taskdefs/Pack.java | 212 + .../org/apache/tools/ant/taskdefs/Parallel.java | 489 ++ .../main/org/apache/tools/ant/taskdefs/Patch.java | 215 + .../org/apache/tools/ant/taskdefs/PathConvert.java | 511 ++ .../org/apache/tools/ant/taskdefs/PreSetDef.java | 275 + .../tools/ant/taskdefs/ProcessDestroyer.java | 220 + .../tools/ant/taskdefs/ProjectHelperTask.java | 50 + .../org/apache/tools/ant/taskdefs/Property.java | 726 +++ .../tools/ant/taskdefs/PropertyHelperTask.java | 145 + .../tools/ant/taskdefs/PumpStreamHandler.java | 298 + .../org/apache/tools/ant/taskdefs/Recorder.java | 324 + .../apache/tools/ant/taskdefs/RecorderEntry.java | 367 ++ .../org/apache/tools/ant/taskdefs/Redirector.java | 1022 ++++ .../main/org/apache/tools/ant/taskdefs/Rename.java | 96 + .../org/apache/tools/ant/taskdefs/Replace.java | 955 +++ .../apache/tools/ant/taskdefs/ResourceCount.java | 124 + .../main/org/apache/tools/ant/taskdefs/Retry.java | 119 + .../main/org/apache/tools/ant/taskdefs/Rmic.java | 853 +++ .../org/apache/tools/ant/taskdefs/SQLExec.java | 1162 ++++ .../org/apache/tools/ant/taskdefs/SendEmail.java | 45 + .../org/apache/tools/ant/taskdefs/Sequential.java | 74 + .../org/apache/tools/ant/taskdefs/SignJar.java | 645 ++ .../main/org/apache/tools/ant/taskdefs/Sleep.java | 194 + .../apache/tools/ant/taskdefs/StreamPumper.java | 252 + .../main/org/apache/tools/ant/taskdefs/SubAnt.java | 642 ++ .../main/org/apache/tools/ant/taskdefs/Sync.java | 606 ++ .../main/org/apache/tools/ant/taskdefs/Tar.java | 1016 ++++ .../tools/ant/taskdefs/TaskOutputStream.java | 96 + .../org/apache/tools/ant/taskdefs/Taskdef.java | 51 + .../org/apache/tools/ant/taskdefs/TempFile.java | 163 + .../main/org/apache/tools/ant/taskdefs/Touch.java | 381 ++ .../org/apache/tools/ant/taskdefs/Transform.java | 30 + .../org/apache/tools/ant/taskdefs/Truncate.java | 205 + .../main/org/apache/tools/ant/taskdefs/Tstamp.java | 341 ++ .../org/apache/tools/ant/taskdefs/Typedef.java | 46 + .../main/org/apache/tools/ant/taskdefs/Unpack.java | 195 + .../main/org/apache/tools/ant/taskdefs/Untar.java | 244 + .../org/apache/tools/ant/taskdefs/UpToDate.java | 277 + .../org/apache/tools/ant/taskdefs/VerifyJar.java | 207 + .../org/apache/tools/ant/taskdefs/WaitFor.java | 277 + .../main/org/apache/tools/ant/taskdefs/War.java | 233 + .../apache/tools/ant/taskdefs/WhichResource.java | 199 + .../org/apache/tools/ant/taskdefs/XSLTLiaison.java | 69 + .../apache/tools/ant/taskdefs/XSLTLiaison2.java | 33 + .../apache/tools/ant/taskdefs/XSLTLiaison3.java | 35 + .../apache/tools/ant/taskdefs/XSLTLiaison4.java | 42 + .../org/apache/tools/ant/taskdefs/XSLTLogger.java | 31 + .../apache/tools/ant/taskdefs/XSLTLoggerAware.java | 31 + .../org/apache/tools/ant/taskdefs/XSLTProcess.java | 1689 ++++++ .../org/apache/tools/ant/taskdefs/XmlProperty.java | 780 +++ .../main/org/apache/tools/ant/taskdefs/Zip.java | 2274 +++++++ .../ant/taskdefs/compilers/AptCompilerAdapter.java | 187 + .../compilers/AptExternalCompilerAdapter.java | 71 + .../ant/taskdefs/compilers/CompilerAdapter.java | 52 + .../compilers/CompilerAdapterExtension.java | 40 + .../taskdefs/compilers/CompilerAdapterFactory.java | 202 + .../taskdefs/compilers/DefaultCompilerAdapter.java | 736 +++ .../apache/tools/ant/taskdefs/compilers/Gcj.java | 160 + .../tools/ant/taskdefs/compilers/Javac12.java | 91 + .../tools/ant/taskdefs/compilers/Javac13.java | 70 + .../ant/taskdefs/compilers/JavacExternal.java | 92 + .../apache/tools/ant/taskdefs/compilers/Jikes.java | 221 + .../apache/tools/ant/taskdefs/compilers/Jvc.java | 116 + .../apache/tools/ant/taskdefs/compilers/Kjc.java | 119 + .../apache/tools/ant/taskdefs/compilers/Sj.java | 61 + .../apache/tools/ant/taskdefs/condition/And.java | 50 + .../tools/ant/taskdefs/condition/AntVersion.java | 171 + .../tools/ant/taskdefs/condition/Condition.java | 35 + .../ant/taskdefs/condition/ConditionBase.java | 281 + .../tools/ant/taskdefs/condition/Contains.java | 76 + .../tools/ant/taskdefs/condition/Equals.java | 148 + .../tools/ant/taskdefs/condition/FilesMatch.java | 101 + .../tools/ant/taskdefs/condition/HasFreeSpace.java | 101 + .../tools/ant/taskdefs/condition/HasMethod.java | 192 + .../apache/tools/ant/taskdefs/condition/Http.java | 117 + .../tools/ant/taskdefs/condition/IsFailure.java | 54 + .../tools/ant/taskdefs/condition/IsFalse.java | 55 + .../ant/taskdefs/condition/IsFileSelected.java | 81 + .../ant/taskdefs/condition/IsLastModified.java | 219 + .../tools/ant/taskdefs/condition/IsReachable.java | 207 + .../tools/ant/taskdefs/condition/IsReference.java | 89 + .../apache/tools/ant/taskdefs/condition/IsSet.java | 51 + .../tools/ant/taskdefs/condition/IsSigned.java | 152 + .../tools/ant/taskdefs/condition/IsTrue.java | 55 + .../tools/ant/taskdefs/condition/Matches.java | 119 + .../apache/tools/ant/taskdefs/condition/Not.java | 50 + .../apache/tools/ant/taskdefs/condition/Or.java | 50 + .../apache/tools/ant/taskdefs/condition/Os.java | 321 + .../ant/taskdefs/condition/ParserSupports.java | 150 + .../ant/taskdefs/condition/ResourceContains.java | 165 + .../ant/taskdefs/condition/ResourceExists.java | 56 + .../ant/taskdefs/condition/ResourcesMatch.java | 93 + .../tools/ant/taskdefs/condition/Socket.java | 87 + .../tools/ant/taskdefs/condition/TypeFound.java | 90 + .../apache/tools/ant/taskdefs/condition/Xor.java | 49 + .../apache/tools/ant/taskdefs/cvslib/CVSEntry.java | 112 + .../tools/ant/taskdefs/cvslib/ChangeLogParser.java | 321 + .../tools/ant/taskdefs/cvslib/ChangeLogTask.java | 489 ++ .../tools/ant/taskdefs/cvslib/ChangeLogWriter.java | 114 + .../tools/ant/taskdefs/cvslib/CvsTagDiff.java | 576 ++ .../tools/ant/taskdefs/cvslib/CvsTagEntry.java | 109 + .../apache/tools/ant/taskdefs/cvslib/CvsUser.java | 93 + .../tools/ant/taskdefs/cvslib/CvsVersion.java | 169 + .../apache/tools/ant/taskdefs/cvslib/RCSFile.java | 69 + .../taskdefs/cvslib/RedirectingOutputStream.java | 46 + .../taskdefs/cvslib/RedirectingStreamHandler.java | 61 + .../apache/tools/ant/taskdefs/defaults.properties | 210 + .../tools/ant/taskdefs/email/EmailAddress.java | 197 + .../apache/tools/ant/taskdefs/email/EmailTask.java | 634 ++ .../apache/tools/ant/taskdefs/email/Header.java | 61 + .../apache/tools/ant/taskdefs/email/Mailer.java | 277 + .../apache/tools/ant/taskdefs/email/Message.java | 203 + .../tools/ant/taskdefs/email/MimeMailer.java | 343 ++ .../tools/ant/taskdefs/email/PlainMailer.java | 177 + .../apache/tools/ant/taskdefs/email/UUMailer.java | 56 + .../ant/taskdefs/launcher/CommandLauncher.java | 213 + .../taskdefs/launcher/CommandLauncherProxy.java | 54 + .../taskdefs/launcher/Java13CommandLauncher.java | 66 + .../ant/taskdefs/launcher/MacCommandLauncher.java | 63 + .../ant/taskdefs/launcher/OS2CommandLauncher.java | 82 + .../launcher/PerlScriptCommandLauncher.java | 90 + .../taskdefs/launcher/ScriptCommandLauncher.java | 88 + .../ant/taskdefs/launcher/VmsCommandLauncher.java | 145 + .../taskdefs/launcher/WinNTCommandLauncher.java | 78 + .../apache/tools/ant/taskdefs/optional/ANTLR.java | 438 ++ .../apache/tools/ant/taskdefs/optional/Cab.java | 357 ++ .../ant/taskdefs/optional/EchoProperties.java | 543 ++ .../apache/tools/ant/taskdefs/optional/Javah.java | 513 ++ .../tools/ant/taskdefs/optional/Native2Ascii.java | 328 + .../tools/ant/taskdefs/optional/NetRexxC.java | 1042 ++++ .../tools/ant/taskdefs/optional/PropertyFile.java | 726 +++ .../ant/taskdefs/optional/RenameExtensions.java | 146 + .../tools/ant/taskdefs/optional/ReplaceRegExp.java | 533 ++ .../apache/tools/ant/taskdefs/optional/Rpm.java | 364 ++ .../ant/taskdefs/optional/SchemaValidate.java | 529 ++ .../apache/tools/ant/taskdefs/optional/Script.java | 133 + .../tools/ant/taskdefs/optional/TraXLiaison.java | 650 ++ .../ant/taskdefs/optional/XMLValidateTask.java | 764 +++ .../ant/taskdefs/optional/XSLTTraceSupport.java | 32 + .../ant/taskdefs/optional/Xalan2TraceSupport.java | 54 + .../tools/ant/taskdefs/optional/ccm/CCMCheck.java | 208 + .../ant/taskdefs/optional/ccm/CCMCheckin.java | 39 + .../taskdefs/optional/ccm/CCMCheckinDefault.java | 38 + .../ant/taskdefs/optional/ccm/CCMCheckout.java | 35 + .../ant/taskdefs/optional/ccm/CCMCreateTask.java | 335 ++ .../ant/taskdefs/optional/ccm/CCMReconfigure.java | 159 + .../tools/ant/taskdefs/optional/ccm/Continuus.java | 144 + .../ant/taskdefs/optional/clearcase/CCCheckin.java | 343 ++ .../taskdefs/optional/clearcase/CCCheckout.java | 516 ++ .../ant/taskdefs/optional/clearcase/CCLock.java | 378 ++ .../ant/taskdefs/optional/clearcase/CCMkattr.java | 425 ++ .../ant/taskdefs/optional/clearcase/CCMkbl.java | 365 ++ .../ant/taskdefs/optional/clearcase/CCMkdir.java | 237 + .../ant/taskdefs/optional/clearcase/CCMkelem.java | 424 ++ .../ant/taskdefs/optional/clearcase/CCMklabel.java | 402 ++ .../taskdefs/optional/clearcase/CCMklbtype.java | 440 ++ .../ant/taskdefs/optional/clearcase/CCRmtype.java | 373 ++ .../taskdefs/optional/clearcase/CCUnCheckout.java | 141 + .../ant/taskdefs/optional/clearcase/CCUnlock.java | 260 + .../ant/taskdefs/optional/clearcase/CCUpdate.java | 331 ++ .../ant/taskdefs/optional/clearcase/ClearCase.java | 242 + .../ant/taskdefs/optional/depend/AntAnalyzer.java | 144 + .../ant/taskdefs/optional/depend/ClassFile.java | 121 + .../optional/depend/ClassFileIterator.java | 33 + .../taskdefs/optional/depend/ClassFileUtils.java | 52 + .../tools/ant/taskdefs/optional/depend/Depend.java | 917 +++ .../optional/depend/DirectoryIterator.java | 164 + .../taskdefs/optional/depend/JarFileIterator.java | 89 + .../optional/depend/constantpool/ClassCPInfo.java | 93 + .../depend/constantpool/ConstantCPInfo.java | 63 + .../optional/depend/constantpool/ConstantPool.java | 358 ++ .../depend/constantpool/ConstantPoolEntry.java | 242 + .../optional/depend/constantpool/DoubleCPInfo.java | 58 + .../depend/constantpool/FieldRefCPInfo.java | 130 + .../optional/depend/constantpool/FloatCPInfo.java | 56 + .../depend/constantpool/IntegerCPInfo.java | 56 + .../constantpool/InterfaceMethodRefCPInfo.java | 137 + .../depend/constantpool/InvokeDynamicCPInfo.java | 85 + .../optional/depend/constantpool/LongCPInfo.java | 56 + .../depend/constantpool/MethodHandleCPInfo.java | 107 + .../depend/constantpool/MethodRefCPInfo.java | 133 + .../depend/constantpool/MethodTypeCPInfo.java | 82 + .../depend/constantpool/NameAndTypeCPInfo.java | 112 + .../optional/depend/constantpool/StringCPInfo.java | 74 + .../optional/depend/constantpool/Utf8CPInfo.java | 67 + .../optional/ejb/BorlandDeploymentTool.java | 559 ++ .../optional/ejb/BorlandGenerateClient.java | 313 + .../taskdefs/optional/ejb/DescriptorHandler.java | 390 ++ .../taskdefs/optional/ejb/EJBDeploymentTool.java | 61 + .../tools/ant/taskdefs/optional/ejb/EjbJar.java | 630 ++ .../optional/ejb/GenericDeploymentTool.java | 953 +++ .../optional/ejb/IPlanetDeploymentTool.java | 403 ++ .../ant/taskdefs/optional/ejb/IPlanetEjbc.java | 1495 +++++ .../ant/taskdefs/optional/ejb/IPlanetEjbcTask.java | 321 + .../optional/ejb/InnerClassFilenameFilter.java | 54 + .../taskdefs/optional/ejb/JbossDeploymentTool.java | 111 + .../taskdefs/optional/ejb/JonasDeploymentTool.java | 835 +++ .../optional/ejb/WeblogicDeploymentTool.java | 932 +++ .../ejb/WeblogicTOPLinkDeploymentTool.java | 113 + .../optional/ejb/WebsphereDeploymentTool.java | 897 +++ .../taskdefs/optional/extension/Compatability.java | 57 + .../taskdefs/optional/extension/Compatibility.java | 57 + .../taskdefs/optional/extension/DeweyDecimal.java | 54 + .../ant/taskdefs/optional/extension/Extension.java | 690 +++ .../optional/extension/ExtensionAdapter.java | 215 + .../optional/extension/ExtensionResolver.java | 43 + .../taskdefs/optional/extension/ExtensionSet.java | 153 + .../taskdefs/optional/extension/ExtensionUtil.java | 215 + .../optional/extension/ExtraAttribute.java | 83 + .../optional/extension/JarLibAvailableTask.java | 157 + .../optional/extension/JarLibDisplayTask.java | 119 + .../optional/extension/JarLibManifestTask.java | 296 + .../optional/extension/JarLibResolveTask.java | 268 + .../taskdefs/optional/extension/LibFileSet.java | 117 + .../optional/extension/LibraryDisplayer.java | 150 + .../taskdefs/optional/extension/Specification.java | 605 ++ .../optional/extension/resolvers/AntResolver.java | 117 + .../extension/resolvers/LocationResolver.java | 65 + .../optional/extension/resolvers/URLResolver.java | 133 + .../ant/taskdefs/optional/i18n/Translate.java | 632 ++ .../tools/ant/taskdefs/optional/image/Image.java | 421 ++ .../optional/j2ee/AbstractHotDeploymentTool.java | 193 + .../optional/j2ee/GenericHotDeploymentTool.java | 140 + .../taskdefs/optional/j2ee/HotDeploymentTool.java | 61 + .../optional/j2ee/JonasHotDeploymentTool.java | 252 + .../ant/taskdefs/optional/j2ee/ServerDeploy.java | 153 + .../optional/j2ee/WebLogicHotDeploymentTool.java | 247 + .../tools/ant/taskdefs/optional/javacc/JJDoc.java | 226 + .../tools/ant/taskdefs/optional/javacc/JJTree.java | 416 ++ .../tools/ant/taskdefs/optional/javacc/JavaCC.java | 579 ++ .../tools/ant/taskdefs/optional/javah/Gcjh.java | 89 + .../ant/taskdefs/optional/javah/JavahAdapter.java | 38 + .../optional/javah/JavahAdapterFactory.java | 120 + .../tools/ant/taskdefs/optional/javah/Kaffeh.java | 94 + .../ant/taskdefs/optional/javah/SunJavah.java | 123 + .../ant/taskdefs/optional/jdepend/JDependTask.java | 684 +++ .../taskdefs/optional/jlink/ClassNameReader.java | 139 + .../ant/taskdefs/optional/jlink/JlinkTask.java | 183 + .../tools/ant/taskdefs/optional/jlink/jlink.java | 458 ++ .../ant/taskdefs/optional/jsp/Jasper41Mangler.java | 93 + .../tools/ant/taskdefs/optional/jsp/JspC.java | 709 +++ .../ant/taskdefs/optional/jsp/JspMangler.java | 47 + .../ant/taskdefs/optional/jsp/JspNameMangler.java | 155 + .../tools/ant/taskdefs/optional/jsp/WLJspc.java | 334 ++ .../jsp/compilers/DefaultJspCompilerAdapter.java | 153 + .../taskdefs/optional/jsp/compilers/JasperC.java | 182 + .../optional/jsp/compilers/JspCompilerAdapter.java | 64 + .../jsp/compilers/JspCompilerAdapterFactory.java | 122 + .../optional/junit/AggregateTransformer.java | 346 ++ .../ant/taskdefs/optional/junit/BaseTest.java | 241 + .../ant/taskdefs/optional/junit/BatchTest.java | 202 + .../optional/junit/BriefJUnitResultFormatter.java | 300 + .../ant/taskdefs/optional/junit/Constants.java | 46 + .../junit/CustomJUnit4TestAdapterCache.java | 90 + .../tools/ant/taskdefs/optional/junit/DOMUtil.java | 228 + .../ant/taskdefs/optional/junit/Enumerations.java | 177 + .../taskdefs/optional/junit/FailureRecorder.java | 448 ++ .../taskdefs/optional/junit/FormatterElement.java | 401 ++ .../optional/junit/IgnoredTestListener.java | 52 + .../taskdefs/optional/junit/IgnoredTestResult.java | 99 + .../optional/junit/JUnit4TestMethodAdapter.java | 193 + .../optional/junit/JUnitResultFormatter.java | 65 + .../ant/taskdefs/optional/junit/JUnitTask.java | 2283 +++++++ .../taskdefs/optional/junit/JUnitTaskMirror.java | 190 + .../optional/junit/JUnitTaskMirrorImpl.java | 109 + .../ant/taskdefs/optional/junit/JUnitTest.java | 542 ++ .../taskdefs/optional/junit/JUnitTestRunner.java | 1297 ++++ .../optional/junit/JUnitVersionHelper.java | 179 + .../junit/OutErrSummaryJUnitResultFormatter.java | 36 + .../optional/junit/PlainJUnitResultFormatter.java | 317 + .../junit/SummaryJUnitResultFormatter.java | 213 + .../taskdefs/optional/junit/TearDownOnVmCrash.java | 144 + .../ant/taskdefs/optional/junit/TestIgnored.java | 35 + .../optional/junit/TestListenerWrapper.java | 63 + .../ant/taskdefs/optional/junit/XMLConstants.java | 141 + .../optional/junit/XMLJUnitResultFormatter.java | 366 ++ .../optional/junit/XMLResultAggregator.java | 329 + .../optional/native2ascii/DefaultNative2Ascii.java | 106 + .../optional/native2ascii/KaffeNative2Ascii.java | 88 + .../optional/native2ascii/Native2AsciiAdapter.java | 44 + .../native2ascii/Native2AsciiAdapterFactory.java | 116 + .../optional/native2ascii/SunNative2Ascii.java | 71 + .../tools/ant/taskdefs/optional/net/FTP.java | 2725 +++++++++ .../ant/taskdefs/optional/net/FTPConfigurator.java | 99 + .../tools/ant/taskdefs/optional/net/FTPTask.java | 965 +++ .../ant/taskdefs/optional/net/FTPTaskConfig.java | 28 + .../ant/taskdefs/optional/net/FTPTaskMirror.java | 24 + .../taskdefs/optional/net/FTPTaskMirrorImpl.java | 1951 ++++++ .../tools/ant/taskdefs/optional/net/MimeMail.java | 43 + .../tools/ant/taskdefs/optional/net/RExecTask.java | 479 ++ .../tools/ant/taskdefs/optional/net/SetProxy.java | 283 + .../ant/taskdefs/optional/net/TelnetTask.java | 397 ++ .../tools/ant/taskdefs/optional/pvcs/Pvcs.java | 675 +++ .../ant/taskdefs/optional/pvcs/PvcsProject.java | 49 + .../ant/taskdefs/optional/script/ScriptDef.java | 397 ++ .../taskdefs/optional/script/ScriptDefBase.java | 132 + .../tools/ant/taskdefs/optional/sos/SOS.java | 479 ++ .../ant/taskdefs/optional/sos/SOSCheckin.java | 101 + .../ant/taskdefs/optional/sos/SOSCheckout.java | 85 + .../tools/ant/taskdefs/optional/sos/SOSCmd.java | 81 + .../tools/ant/taskdefs/optional/sos/SOSGet.java | 116 + .../tools/ant/taskdefs/optional/sos/SOSLabel.java | 91 + .../tools/ant/taskdefs/optional/sos/package.html | 29 + .../taskdefs/optional/sound/AntSoundPlayer.java | 251 + .../ant/taskdefs/optional/sound/SoundTask.java | 193 + .../ant/taskdefs/optional/splash/SplashScreen.java | 181 + .../ant/taskdefs/optional/splash/SplashTask.java | 297 + .../taskdefs/optional/ssh/AbstractSshMessage.java | 272 + .../tools/ant/taskdefs/optional/ssh/Directory.java | 196 + .../ant/taskdefs/optional/ssh/LogListener.java | 30 + .../tools/ant/taskdefs/optional/ssh/SSHBase.java | 236 + .../tools/ant/taskdefs/optional/ssh/SSHExec.java | 519 ++ .../ant/taskdefs/optional/ssh/SSHSession.java | 333 ++ .../ant/taskdefs/optional/ssh/SSHUserInfo.java | 217 + .../tools/ant/taskdefs/optional/ssh/Scp.java | 486 ++ .../ant/taskdefs/optional/ssh/ScpFromMessage.java | 311 + .../optional/ssh/ScpFromMessageBySftp.java | 205 + .../ant/taskdefs/optional/ssh/ScpToMessage.java | 331 ++ .../taskdefs/optional/ssh/ScpToMessageBySftp.java | 277 + .../ant/taskdefs/optional/testing/BlockFor.java | 71 + .../optional/testing/BuildTimeoutException.java | 114 + .../ant/taskdefs/optional/testing/Funtest.java | 577 ++ .../taskdefs/optional/unix/AbstractAccessTask.java | 110 + .../tools/ant/taskdefs/optional/unix/Chgrp.java | 84 + .../tools/ant/taskdefs/optional/unix/Chown.java | 84 + .../tools/ant/taskdefs/optional/unix/Symlink.java | 600 ++ .../tools/ant/taskdefs/optional/vss/MSVSS.java | 784 +++ .../tools/ant/taskdefs/optional/vss/MSVSSADD.java | 122 + .../ant/taskdefs/optional/vss/MSVSSCHECKIN.java | 114 + .../ant/taskdefs/optional/vss/MSVSSCHECKOUT.java | 165 + .../tools/ant/taskdefs/optional/vss/MSVSSCP.java | 69 + .../ant/taskdefs/optional/vss/MSVSSCREATE.java | 91 + .../ant/taskdefs/optional/vss/MSVSSConstants.java | 127 + .../tools/ant/taskdefs/optional/vss/MSVSSGET.java | 172 + .../ant/taskdefs/optional/vss/MSVSSHISTORY.java | 199 + .../ant/taskdefs/optional/vss/MSVSSLABEL.java | 108 + .../ant/taskdefs/optional/windows/Attrib.java | 196 + .../ant/taskdefs/rmic/DefaultRmicAdapter.java | 493 ++ .../tools/ant/taskdefs/rmic/ForkingSunRmic.java | 90 + .../apache/tools/ant/taskdefs/rmic/KaffeRmic.java | 104 + .../tools/ant/taskdefs/rmic/RmicAdapter.java | 67 + .../ant/taskdefs/rmic/RmicAdapterFactory.java | 135 + .../apache/tools/ant/taskdefs/rmic/SunRmic.java | 114 + .../org/apache/tools/ant/taskdefs/rmic/WLRmic.java | 136 + .../apache/tools/ant/taskdefs/rmic/XNewRmic.java | 52 + .../apache/tools/ant/types/AbstractFileSet.java | 922 +++ .../apache/tools/ant/types/AntFilterReader.java | 178 + .../org/apache/tools/ant/types/ArchiveFileSet.java | 596 ++ .../org/apache/tools/ant/types/ArchiveScanner.java | 363 ++ .../org/apache/tools/ant/types/Assertions.java | 359 ++ .../org/apache/tools/ant/types/Commandline.java | 689 +++ .../apache/tools/ant/types/CommandlineJava.java | 699 +++ .../org/apache/tools/ant/types/Comparison.java | 95 + .../org/apache/tools/ant/types/DTDLocation.java | 33 + .../main/org/apache/tools/ant/types/DataType.java | 367 ++ .../org/apache/tools/ant/types/Description.java | 116 + .../main/org/apache/tools/ant/types/DirSet.java | 115 + .../tools/ant/types/EnumeratedAttribute.java | 153 + .../org/apache/tools/ant/types/Environment.java | 177 + .../main/org/apache/tools/ant/types/FileList.java | 219 + .../main/org/apache/tools/ant/types/FileSet.java | 94 + .../org/apache/tools/ant/types/FilterChain.java | 418 ++ .../main/org/apache/tools/ant/types/FilterSet.java | 654 ++ .../tools/ant/types/FilterSetCollection.java | 88 + .../org/apache/tools/ant/types/FlexInteger.java | 54 + .../main/org/apache/tools/ant/types/LogLevel.java | 87 + .../main/org/apache/tools/ant/types/Mapper.java | 322 + .../main/org/apache/tools/ant/types/Parameter.java | 82 + .../apache/tools/ant/types/Parameterizable.java | 31 + .../src/main/org/apache/tools/ant/types/Path.java | 775 +++ .../org/apache/tools/ant/types/PatternSet.java | 541 ++ .../org/apache/tools/ant/types/Permissions.java | 356 ++ .../org/apache/tools/ant/types/PropertySet.java | 577 ++ .../org/apache/tools/ant/types/Quantifier.java | 146 + .../apache/tools/ant/types/RedirectorElement.java | 630 ++ .../main/org/apache/tools/ant/types/Reference.java | 134 + .../apache/tools/ant/types/RegularExpression.java | 141 + .../main/org/apache/tools/ant/types/Resource.java | 439 ++ .../apache/tools/ant/types/ResourceCollection.java | 50 + .../apache/tools/ant/types/ResourceFactory.java | 38 + .../apache/tools/ant/types/ResourceLocation.java | 106 + .../org/apache/tools/ant/types/Substitution.java | 77 + .../org/apache/tools/ant/types/TarFileSet.java | 269 + .../org/apache/tools/ant/types/TarScanner.java | 87 + .../org/apache/tools/ant/types/TimeComparison.java | 122 + .../org/apache/tools/ant/types/XMLCatalog.java | 1128 ++++ .../org/apache/tools/ant/types/ZipFileSet.java | 117 + .../org/apache/tools/ant/types/ZipScanner.java | 99 + .../apache/tools/ant/types/conditions/antlib.xml | 93 + .../org/apache/tools/ant/types/defaults.properties | 101 + .../tools/ant/types/mappers/CutDirsMapper.java | 76 + .../tools/ant/types/mappers/FilterMapper.java | 87 + .../types/optional/AbstractScriptComponent.java | 158 + .../tools/ant/types/optional/ScriptCondition.java | 68 + .../tools/ant/types/optional/ScriptFilter.java | 183 + .../tools/ant/types/optional/ScriptMapper.java | 91 + .../tools/ant/types/optional/ScriptSelector.java | 223 + .../ant/types/optional/depend/ClassfileSet.java | 183 + .../ant/types/optional/depend/DependScanner.java | 225 + .../apache/tools/ant/types/optional/image/Arc.java | 123 + .../tools/ant/types/optional/image/BasicShape.java | 55 + .../ant/types/optional/image/ColorMapper.java | 102 + .../tools/ant/types/optional/image/Draw.java | 102 + .../ant/types/optional/image/DrawOperation.java | 40 + .../tools/ant/types/optional/image/Ellipse.java | 87 + .../ant/types/optional/image/ImageOperation.java | 72 + .../tools/ant/types/optional/image/Rectangle.java | 119 + .../tools/ant/types/optional/image/Rotate.java | 118 + .../tools/ant/types/optional/image/Scale.java | 181 + .../tools/ant/types/optional/image/Text.java | 128 + .../types/optional/image/TransformOperation.java | 38 + .../tools/ant/types/resolver/ApacheCatalog.java | 121 + .../ant/types/resolver/ApacheCatalogResolver.java | 174 + .../apache/tools/ant/types/resolver/package.html | 35 + .../types/resources/AbstractClasspathResource.java | 265 + .../AbstractResourceCollectionWrapper.java | 209 + .../tools/ant/types/resources/AllButFirst.java | 60 + .../tools/ant/types/resources/AllButLast.java | 53 + .../tools/ant/types/resources/Appendable.java | 35 + .../tools/ant/types/resources/ArchiveResource.java | 293 + .../apache/tools/ant/types/resources/Archives.java | 194 + .../tools/ant/types/resources/BCFileSet.java | 73 + .../tools/ant/types/resources/BZip2Resource.java | 85 + .../resources/BaseResourceCollectionContainer.java | 268 + .../resources/BaseResourceCollectionWrapper.java | 56 + .../ant/types/resources/CompressedResource.java | 60 + .../resources/ContentTransformingResource.java | 177 + .../tools/ant/types/resources/Difference.java | 63 + .../apache/tools/ant/types/resources/FailFast.java | 135 + .../tools/ant/types/resources/FileProvider.java | 36 + .../tools/ant/types/resources/FileResource.java | 392 ++ .../ant/types/resources/FileResourceIterator.java | 149 + .../apache/tools/ant/types/resources/Files.java | 503 ++ .../apache/tools/ant/types/resources/First.java | 48 + .../tools/ant/types/resources/GZipResource.java | 75 + .../resources/ImmutableResourceException.java | 46 + .../tools/ant/types/resources/Intersect.java | 64 + .../ant/types/resources/JavaConstantResource.java | 70 + .../tools/ant/types/resources/JavaResource.java | 141 + .../org/apache/tools/ant/types/resources/Last.java | 73 + .../resources/LazyResourceCollectionWrapper.java | 176 + .../ant/types/resources/LogOutputResource.java | 68 + .../tools/ant/types/resources/MappedResource.java | 116 + .../types/resources/MappedResourceCollection.java | 267 + .../ant/types/resources/MultiRootFileSet.java | 237 + .../ant/types/resources/PropertyResource.java | 206 + .../ant/types/resources/ResourceDecorator.java | 270 + .../tools/ant/types/resources/ResourceList.java | 239 + .../tools/ant/types/resources/Resources.java | 274 + .../apache/tools/ant/types/resources/Restrict.java | 156 + .../ant/types/resources/SizeLimitCollection.java | 71 + .../org/apache/tools/ant/types/resources/Sort.java | 98 + .../tools/ant/types/resources/StringResource.java | 261 + .../tools/ant/types/resources/TarResource.java | 198 + .../apache/tools/ant/types/resources/Tokens.java | 137 + .../tools/ant/types/resources/Touchable.java | 32 + .../tools/ant/types/resources/URLProvider.java | 35 + .../tools/ant/types/resources/URLResource.java | 454 ++ .../apache/tools/ant/types/resources/Union.java | 156 + .../tools/ant/types/resources/ZipResource.java | 226 + .../ant/types/resources/comparators/Content.java | 70 + .../ant/types/resources/comparators/Date.java | 45 + .../comparators/DelegatedResourceComparator.java | 125 + .../ant/types/resources/comparators/Exists.java | 43 + .../types/resources/comparators/FileSystem.java | 60 + .../ant/types/resources/comparators/Name.java | 38 + .../resources/comparators/ResourceComparator.java | 81 + .../ant/types/resources/comparators/Reverse.java | 91 + .../ant/types/resources/comparators/Size.java | 39 + .../ant/types/resources/comparators/Type.java | 44 + .../tools/ant/types/resources/selectors/And.java | 58 + .../ant/types/resources/selectors/Compare.java | 149 + .../tools/ant/types/resources/selectors/Date.java | 162 + .../ant/types/resources/selectors/Exists.java | 37 + .../ant/types/resources/selectors/InstanceOf.java | 130 + .../ant/types/resources/selectors/Majority.java | 84 + .../tools/ant/types/resources/selectors/Name.java | 151 + .../tools/ant/types/resources/selectors/None.java | 59 + .../tools/ant/types/resources/selectors/Not.java | 66 + .../tools/ant/types/resources/selectors/Or.java | 58 + .../resources/selectors/ResourceSelector.java | 35 + .../selectors/ResourceSelectorContainer.java | 128 + .../tools/ant/types/resources/selectors/Size.java | 73 + .../tools/ant/types/resources/selectors/Type.java | 110 + .../types/selectors/AbstractSelectorContainer.java | 353 ++ .../tools/ant/types/selectors/AndSelector.java | 74 + .../ant/types/selectors/BaseExtendSelector.java | 87 + .../tools/ant/types/selectors/BaseSelector.java | 113 + .../ant/types/selectors/BaseSelectorContainer.java | 343 ++ .../types/selectors/ContainsRegexpSelector.java | 219 + .../ant/types/selectors/ContainsSelector.java | 221 + .../tools/ant/types/selectors/DateSelector.java | 260 + .../tools/ant/types/selectors/DependSelector.java | 78 + .../tools/ant/types/selectors/DepthSelector.java | 185 + .../ant/types/selectors/DifferentSelector.java | 114 + .../ant/types/selectors/ExtendFileSelector.java | 39 + .../tools/ant/types/selectors/ExtendSelector.java | 201 + .../tools/ant/types/selectors/FileSelector.java | 48 + .../ant/types/selectors/FilenameSelector.java | 195 + .../ant/types/selectors/MajoritySelector.java | 103 + .../tools/ant/types/selectors/MappingSelector.java | 165 + .../tools/ant/types/selectors/NoneSelector.java | 75 + .../tools/ant/types/selectors/NotSelector.java | 73 + .../tools/ant/types/selectors/OrSelector.java | 75 + .../tools/ant/types/selectors/PresentSelector.java | 198 + .../ant/types/selectors/ReadableSelector.java | 49 + .../tools/ant/types/selectors/SelectSelector.java | 231 + .../ant/types/selectors/SelectorContainer.java | 187 + .../tools/ant/types/selectors/SelectorScanner.java | 49 + .../tools/ant/types/selectors/SelectorUtils.java | 695 +++ .../tools/ant/types/selectors/SignedSelector.java | 59 + .../tools/ant/types/selectors/SizeSelector.java | 279 + .../tools/ant/types/selectors/TokenizedPath.java | 222 + .../ant/types/selectors/TokenizedPattern.java | 177 + .../tools/ant/types/selectors/TypeSelector.java | 135 + .../ant/types/selectors/WritableSelector.java | 46 + .../selectors/modifiedselector/Algorithm.java | 48 + .../types/selectors/modifiedselector/Cache.java | 72 + .../modifiedselector/ChecksumAlgorithm.java | 151 + .../modifiedselector/DigestAlgorithm.java | 208 + .../modifiedselector/EqualComparator.java | 58 + .../modifiedselector/HashvalueAlgorithm.java | 80 + .../modifiedselector/ModifiedSelector.java | 971 +++ .../modifiedselector/PropertiesfileCache.java | 236 + .../org/apache/tools/ant/types/spi/Provider.java | 63 + .../org/apache/tools/ant/types/spi/Service.java | 116 + .../org/apache/tools/ant/util/Base64Converter.java | 124 + .../org/apache/tools/ant/util/ChainedMapper.java | 60 + .../org/apache/tools/ant/util/ClasspathUtils.java | 463 ++ .../org/apache/tools/ant/util/CollectionUtils.java | 278 + .../org/apache/tools/ant/util/CompositeMapper.java | 50 + .../tools/ant/util/ConcatFileInputStream.java | 136 + .../tools/ant/util/ConcatResourceInputStream.java | 147 + .../org/apache/tools/ant/util/ContainerMapper.java | 119 + .../apache/tools/ant/util/DOMElementWriter.java | 640 ++ .../main/org/apache/tools/ant/util/DOMUtils.java | 163 + .../main/org/apache/tools/ant/util/DateUtils.java | 301 + .../org/apache/tools/ant/util/DeweyDecimal.java | 237 + .../org/apache/tools/ant/util/FileNameMapper.java | 60 + .../org/apache/tools/ant/util/FileTokenizer.java | 48 + .../main/org/apache/tools/ant/util/FileUtils.java | 1722 ++++++ .../apache/tools/ant/util/FirstMatchMapper.java | 45 + .../apache/tools/ant/util/FlatFileNameMapper.java | 54 + .../apache/tools/ant/util/GlobPatternMapper.java | 203 + .../org/apache/tools/ant/util/IdentityMapper.java | 52 + .../org/apache/tools/ant/util/IdentityStack.java | 130 + .../main/org/apache/tools/ant/util/JAXPUtils.java | 260 + .../org/apache/tools/ant/util/JavaEnvUtils.java | 573 ++ .../tools/ant/util/KeepAliveInputStream.java | 66 + .../tools/ant/util/KeepAliveOutputStream.java | 83 + .../tools/ant/util/LayoutPreservingProperties.java | 775 +++ .../tools/ant/util/LazyFileOutputStream.java | 162 + .../org/apache/tools/ant/util/LazyHashtable.java | 120 + .../apache/tools/ant/util/LeadPipeInputStream.java | 161 + .../tools/ant/util/LineOrientedOutputStream.java | 158 + .../util/LineOrientedOutputStreamRedirector.java | 68 + .../org/apache/tools/ant/util/LineTokenizer.java | 115 + .../org/apache/tools/ant/util/LinkedHashtable.java | 132 + .../org/apache/tools/ant/util/LoaderUtils.java | 140 + .../org/apache/tools/ant/util/MergingMapper.java | 67 + .../tools/ant/util/OutputStreamFunneler.java | 176 + .../apache/tools/ant/util/PackageNameMapper.java | 49 + .../org/apache/tools/ant/util/ProcessUtil.java | 65 + .../tools/ant/util/PropertyOutputStream.java | 69 + .../main/org/apache/tools/ant/util/ProxySetup.java | 115 + .../apache/tools/ant/util/ReaderInputStream.java | 205 + .../org/apache/tools/ant/util/ReflectUtil.java | 212 + .../org/apache/tools/ant/util/ReflectWrapper.java | 99 + .../apache/tools/ant/util/RegexpPatternMapper.java | 159 + .../org/apache/tools/ant/util/ResourceUtils.java | 860 +++ .../org/apache/tools/ant/util/RetryHandler.java | 74 + .../main/org/apache/tools/ant/util/Retryable.java | 38 + .../apache/tools/ant/util/ScriptFixBSFPath.java | 147 + .../org/apache/tools/ant/util/ScriptRunner.java | 27 + .../apache/tools/ant/util/ScriptRunnerBase.java | 360 ++ .../apache/tools/ant/util/ScriptRunnerCreator.java | 133 + .../apache/tools/ant/util/ScriptRunnerHelper.java | 206 + .../apache/tools/ant/util/SourceFileScanner.java | 173 + .../apache/tools/ant/util/SplitClassLoader.java | 73 + .../org/apache/tools/ant/util/StringTokenizer.java | 154 + .../org/apache/tools/ant/util/StringUtils.java | 273 + .../apache/tools/ant/util/SymbolicLinkUtils.java | 296 + .../main/org/apache/tools/ant/util/TaskLogger.java | 79 + .../org/apache/tools/ant/util/TeeOutputStream.java | 95 + .../org/apache/tools/ant/util/TimeoutObserver.java | 37 + .../main/org/apache/tools/ant/util/Tokenizer.java | 44 + .../main/org/apache/tools/ant/util/UUEncoder.java | 148 + .../apache/tools/ant/util/UnPackageNameMapper.java | 48 + .../org/apache/tools/ant/util/UnicodeUtil.java | 46 + .../main/org/apache/tools/ant/util/VectorSet.java | 242 + .../main/org/apache/tools/ant/util/Watchdog.java | 128 + .../apache/tools/ant/util/WeakishReference.java | 91 + .../main/org/apache/tools/ant/util/WorkerAnt.java | 172 + .../org/apache/tools/ant/util/XMLFragment.java | 155 + .../org/apache/tools/ant/util/XmlConstants.java | 65 + .../tools/ant/util/depend/AbstractAnalyzer.java | 286 + .../tools/ant/util/depend/DependencyAnalyzer.java | 130 + .../ant/util/depend/bcel/AncestorAnalyzer.java | 144 + .../ant/util/depend/bcel/DependencyVisitor.java | 192 + .../tools/ant/util/depend/bcel/FullAnalyzer.java | 136 + .../tools/ant/util/facade/FacadeTaskHelper.java | 165 + .../facade/ImplementationSpecificArgument.java | 61 + .../tools/ant/util/java15/ProxyDiagnostics.java | 108 + .../tools/ant/util/optional/JavaxScriptRunner.java | 163 + .../ant/util/optional/NoExitSecurityManager.java | 51 + .../tools/ant/util/optional/ScriptRunner.java | 177 + .../ant/util/optional/WeakishReference12.java | 45 + .../tools/ant/util/regexp/JakartaOroMatcher.java | 170 + .../tools/ant/util/regexp/JakartaOroRegexp.java | 98 + .../ant/util/regexp/JakartaRegexpMatcher.java | 161 + .../tools/ant/util/regexp/JakartaRegexpRegexp.java | 90 + .../tools/ant/util/regexp/Jdk14RegexpMatcher.java | 170 + .../tools/ant/util/regexp/Jdk14RegexpRegexp.java | 105 + .../org/apache/tools/ant/util/regexp/Regexp.java | 50 + .../tools/ant/util/regexp/RegexpFactory.java | 85 + .../tools/ant/util/regexp/RegexpMatcher.java | 110 + .../ant/util/regexp/RegexpMatcherFactory.java | 114 + .../apache/tools/ant/util/regexp/RegexpUtil.java | 109 + .../src/main/org/apache/tools/ant/version.txt | 2 + .../org/apache/tools/bzip2/BZip2Constants.java | 109 + .../src/main/org/apache/tools/bzip2/BlockSort.java | 1081 ++++ .../org/apache/tools/bzip2/CBZip2InputStream.java | 1062 ++++ .../org/apache/tools/bzip2/CBZip2OutputStream.java | 1580 +++++ .../src/main/org/apache/tools/bzip2/CRC.java | 141 + .../apache/tools/mail/ErrorInQuitException.java | 43 + .../main/org/apache/tools/mail/MailMessage.java | 526 ++ .../org/apache/tools/mail/SmtpResponseReader.java | 106 + .../apache/tools/tar/TarArchiveSparseEntry.java | 63 + .../src/main/org/apache/tools/tar/TarBuffer.java | 463 ++ .../main/org/apache/tools/tar/TarConstants.java | 293 + .../src/main/org/apache/tools/tar/TarEntry.java | 1149 ++++ .../main/org/apache/tools/tar/TarInputStream.java | 660 +++ .../main/org/apache/tools/tar/TarOutputStream.java | 657 ++ .../src/main/org/apache/tools/tar/TarUtils.java | 564 ++ .../tools/zip/AbstractUnicodeExtraField.java | 183 + .../main/org/apache/tools/zip/AsiExtraField.java | 352 ++ .../zip/CentralDirectoryParsingZipExtraField.java | 40 + .../main/org/apache/tools/zip/ExtraFieldUtils.java | 314 + .../org/apache/tools/zip/FallbackZipEncoding.java | 94 + .../org/apache/tools/zip/GeneralPurposeBit.java | 194 + .../src/main/org/apache/tools/zip/JarMarker.java | 108 + .../main/org/apache/tools/zip/NioZipEncoding.java | 122 + .../apache/tools/zip/Simple8BitZipEncoding.java | 274 + .../apache/tools/zip/UnicodeCommentExtraField.java | 70 + .../apache/tools/zip/UnicodePathExtraField.java | 67 + .../src/main/org/apache/tools/zip/UnixStat.java | 76 + .../tools/zip/UnparseableExtraFieldData.java | 115 + .../apache/tools/zip/UnrecognizedExtraField.java | 154 + .../tools/zip/UnsupportedZipFeatureException.java | 89 + .../zip/Zip64ExtendedInformationExtraField.java | 322 + .../src/main/org/apache/tools/zip/Zip64Mode.java | 47 + .../apache/tools/zip/Zip64RequiredException.java | 49 + .../main/org/apache/tools/zip/ZipConstants.java | 59 + .../org/apache/tools/zip/ZipEightByteInteger.java | 229 + .../src/main/org/apache/tools/zip/ZipEncoding.java | 84 + .../org/apache/tools/zip/ZipEncodingHelper.java | 252 + .../src/main/org/apache/tools/zip/ZipEntry.java | 786 +++ .../main/org/apache/tools/zip/ZipExtraField.java | 85 + .../src/main/org/apache/tools/zip/ZipFile.java | 1048 ++++ .../src/main/org/apache/tools/zip/ZipLong.java | 201 + .../main/org/apache/tools/zip/ZipOutputStream.java | 1674 ++++++ .../src/main/org/apache/tools/zip/ZipShort.java | 166 + .../src/main/org/apache/tools/zip/ZipUtil.java | 252 + .../ant/taskdefs/javadoc-frame-injections-fix.txt | 37 + .../ant/types/resources/comparators/antlib.xml | 33 + .../tools/ant/types/resources/selectors/antlib.xml | 53 + framework/src/ant/apache-ant-1.9.6/src/script/ant | 336 ++ .../src/ant/apache-ant-1.9.6/src/script/ant.bat | 218 + .../src/ant/apache-ant-1.9.6/src/script/ant.cmd | 93 + .../src/ant/apache-ant-1.9.6/src/script/antRun | 24 + .../src/ant/apache-ant-1.9.6/src/script/antRun.bat | 50 + .../src/ant/apache-ant-1.9.6/src/script/antRun.pl | 63 + .../src/ant/apache-ant-1.9.6/src/script/antenv.cmd | 98 + .../src/script/complete-ant-cmd.pl | 115 + .../src/ant/apache-ant-1.9.6/src/script/envset.cmd | 131 + .../src/ant/apache-ant-1.9.6/src/script/lcp.bat | 31 + .../src/ant/apache-ant-1.9.6/src/script/runant.pl | 150 + .../src/ant/apache-ant-1.9.6/src/script/runant.py | 105 + .../src/ant/apache-ant-1.9.6/src/script/runrc.cmd | 60 + .../src/tests/antunit/antunit-base.xml | 60 + .../src/tests/antunit/bugfixes/README.txt | 2 + .../antunit/bugfixes/br50866/br50866-test.xml | 13 + .../src/tests/antunit/bugfixes/br50866/common.xml | 8 + .../src/tests/antunit/bugfixes/br50866/middle.xml | 7 + .../bugfixes/bugzilla-43324-stackoverflow-test.xml | 68 + .../src/tests/antunit/core/ant-attribute-test.xml | 74 + .../src/tests/antunit/core/bindtargets-test.xml | 39 + .../src/tests/antunit/core/classloader-test.xml | 88 + .../src/tests/antunit/core/createtask-test.xml | 50 + .../antunit/core/dirscanner-symlinks-test.xml | 200 + .../tests/antunit/core/extension-point-test.xml | 210 + .../tests/antunit/core/extension/include-test.xml | 34 + .../src/tests/antunit/core/extension/module1.xml | 25 + .../src/tests/antunit/core/location/location.xml | 93 + .../core/location/src/task/EchoLocation.java | 26 + .../src/tests/antunit/core/magic-names-test.xml | 51 + .../tests/antunit/core/nested-elements-test.xml | 125 + .../src/tests/antunit/core/nested-text-test.xml | 42 + .../src/tests/antunit/core/projecthelpers-test.xml | 86 + .../projecthelpers/build-cross-extension-ref.xml | 26 + .../build-cross-extension-ref.xmlref | 14 + .../core/projecthelpers/build-cross-extension.xml | 36 + .../projecthelpers/build-cross-targets-ref.xml | 22 + .../projecthelpers/build-cross-targets-ref.xmlref | 14 + .../core/projecthelpers/build-cross-targets.xml | 27 + .../projecthelpers/build-many-import-common.xml | 23 + .../projecthelpers/build-many-import-commonref.xml | 23 + .../core/projecthelpers/build-many-import-ref.xml | 24 + .../projecthelpers/build-many-import-ref.xmlref | 14 + .../core/projecthelpers/build-many-import.xml | 32 + .../core/projecthelpers/build-many-import2-ref.xml | 25 + .../projecthelpers/build-many-import2-ref.xmlref | 14 + .../tests/antunit/core/ref-propertyhelper-test.xml | 104 + .../tests/antunit/core/ref-psyntax-hint-test.xml | 28 + .../src/tests/antunit/core/target-test-helper.xml | 57 + .../src/tests/antunit/core/target-test.xml | 82 + .../antunit/core/uuencode/src/task/BaseTask.java | 78 + .../core/uuencode/src/task/UUDecodeTask.java | 31 + .../core/uuencode/src/task/UUEncodeTask.java | 30 + .../tests/antunit/core/uuencode/uuencode-test.xml | 45 + .../antunit/filters/expandproperties-test.xml | 92 + .../filters/expected/sort.sortComparator.test | 10 + .../antunit/filters/expected/sort.sortDefault.test | 10 + .../antunit/filters/expected/sort.sortReverse.test | 10 + .../tests/antunit/filters/expected/sortuniq.txt | 4 + .../src/tests/antunit/filters/expected/uniq.txt | 5 + .../antunit/filters/expected/unique-columns.txt | 1 + .../antunit/filters/input/sort.sortDefault.test | 10 + .../src/tests/antunit/filters/input/uniq.txt | 6 + .../tests/antunit/filters/input/unique-columns.txt | 1 + .../tests/antunit/filters/replacetokens-test.xml | 68 + .../src/tests/antunit/filters/sort-test.xml | 126 + .../antunit/filters/striplinecomments-test.xml | 85 + .../src/tests/antunit/filters/suffix-test.xml | 42 + .../src/tests/antunit/filters/uniq-test.xml | 81 + .../src/tests/antunit/junit-frames.xsl | 889 +++ .../src/tests/antunit/junit-noframes.xsl | 485 ++ .../src/tests/antunit/propertyhelpers.xml | 88 + .../src/tests/antunit/taskdefs/ant-test.xml | 55 + .../src/tests/antunit/taskdefs/antcall-test.xml | 63 + .../src/tests/antunit/taskdefs/apt-test.xml | 158 + .../src/tests/antunit/taskdefs/apt/AptExample.java | 25 + .../tests/antunit/taskdefs/apt/Distributed.java | 39 + .../taskdefs/apt/DistributedAnnotationFactory.java | 50 + .../apt/DistributedAnnotationProcessor.java | 65 + .../src/tests/antunit/taskdefs/augment-test.xml | 74 + .../src/tests/antunit/taskdefs/broken_cd.zip | Bin 0 -> 326 bytes .../src/tests/antunit/taskdefs/bunzip2-test.xml | 28 + .../src/tests/antunit/taskdefs/bzip2/expected | 1 + .../src/tests/antunit/taskdefs/bzip2/multiple.bz2 | Bin 0 -> 74 bytes .../src/tests/antunit/taskdefs/checksum-test.xml | 83 + .../commandlauncher/commandlauncher-test.xml | 87 + .../src/tests/antunit/taskdefs/concat-test.xml | 202 + .../antunit/taskdefs/condition/antversion-test.xml | 70 + .../antunit/taskdefs/condition/equals-test.xml | 80 + .../antunit/taskdefs/condition/filesmatch-test.xml | 57 + .../taskdefs/condition/hasfreespace-test.xml | 57 + .../antunit/taskdefs/condition/hasmethod-text.xml | 63 + .../taskdefs/condition/islastmodified-test.xml | 118 + .../taskdefs/condition/resourcecontains-test.xml | 139 + .../taskdefs/condition/resourceexists-test.xml | 47 + .../src/tests/antunit/taskdefs/copy-test.xml | 471 ++ .../src/tests/antunit/taskdefs/cvs/cvs.xml | 169 + .../taskdefs/cvs/repository/CVSROOT/checkoutlist | 13 + .../taskdefs/cvs/repository/CVSROOT/checkoutlist,v | 37 + .../taskdefs/cvs/repository/CVSROOT/commitinfo | 26 + .../taskdefs/cvs/repository/CVSROOT/commitinfo,v | 50 + .../antunit/taskdefs/cvs/repository/CVSROOT/config | 97 + .../taskdefs/cvs/repository/CVSROOT/config,v | 121 + .../taskdefs/cvs/repository/CVSROOT/cvswrappers | 19 + .../taskdefs/cvs/repository/CVSROOT/cvswrappers,v | 43 + .../taskdefs/cvs/repository/CVSROOT/history | 65 + .../taskdefs/cvs/repository/CVSROOT/loginfo | 36 + .../taskdefs/cvs/repository/CVSROOT/loginfo,v | 60 + .../taskdefs/cvs/repository/CVSROOT/modules | 26 + .../taskdefs/cvs/repository/CVSROOT/modules,v | 50 + .../antunit/taskdefs/cvs/repository/CVSROOT/notify | 19 + .../taskdefs/cvs/repository/CVSROOT/notify,v | 43 + .../taskdefs/cvs/repository/CVSROOT/postadmin | 20 + .../taskdefs/cvs/repository/CVSROOT/postadmin,v | 44 + .../taskdefs/cvs/repository/CVSROOT/postproxy | 22 + .../taskdefs/cvs/repository/CVSROOT/postproxy,v | 46 + .../taskdefs/cvs/repository/CVSROOT/posttag | 37 + .../taskdefs/cvs/repository/CVSROOT/posttag,v | 61 + .../taskdefs/cvs/repository/CVSROOT/postwatch | 20 + .../taskdefs/cvs/repository/CVSROOT/postwatch,v | 44 + .../taskdefs/cvs/repository/CVSROOT/preproxy | 24 + .../taskdefs/cvs/repository/CVSROOT/preproxy,v | 48 + .../taskdefs/cvs/repository/CVSROOT/rcsinfo | 13 + .../taskdefs/cvs/repository/CVSROOT/rcsinfo,v | 37 + .../taskdefs/cvs/repository/CVSROOT/taginfo | 46 + .../taskdefs/cvs/repository/CVSROOT/taginfo,v | 70 + .../taskdefs/cvs/repository/CVSROOT/val-tags | 2 + .../taskdefs/cvs/repository/CVSROOT/verifymsg | 31 + .../taskdefs/cvs/repository/CVSROOT/verifymsg,v | 55 + .../cvs/repository/ant module 2/test.txt,v | 41 + .../taskdefs/cvs/repository/antmodule1/foo.txt,v | 108 + .../repository/antmodule3/yet another test.txt,v | 60 + .../antunit/taskdefs/defaultexcludes-test.xml | 52 + .../antunit/taskdefs/delete-and-symlinks-test.xml | 84 + .../src/tests/antunit/taskdefs/delete-test.xml | 141 + .../src/tests/antunit/taskdefs/dependset-test.xml | 196 + .../src/tests/antunit/taskdefs/dirname-test.xml | 59 + .../src/tests/antunit/taskdefs/ear-test.xml | 31 + .../src/tests/antunit/taskdefs/echo-test.xml | 138 + .../src/tests/antunit/taskdefs/echoxml-test.xml | 87 + .../src/tests/antunit/taskdefs/exec/apply-test.xml | 792 +++ .../src/tests/antunit/taskdefs/exec/exec-test.xml | 710 +++ .../src/tests/antunit/taskdefs/exec/expected/utf-8 | 1 + .../tests/antunit/taskdefs/exec/input/iso8859-1 | 1 + .../src/tests/antunit/taskdefs/exec/parrot.sh | 19 + .../src/tests/antunit/taskdefs/fail-test.xml | 59 + .../src/tests/antunit/taskdefs/get-test.xml | 125 + .../src/tests/antunit/taskdefs/gzip-test.xml | 46 + .../src/tests/antunit/taskdefs/hostinfo-test.xml | 64 + .../src/tests/antunit/taskdefs/import-test.xml | 55 + .../src/tests/antunit/taskdefs/import-url-test.xml | 101 + .../src/tests/antunit/taskdefs/importtests/a.xml | 23 + .../src/tests/antunit/taskdefs/importtests/b.xml | 23 + .../tests/antunit/taskdefs/importtests/nested.xml | 21 + .../antunit/taskdefs/importtests/override.xml | 25 + .../src/tests/antunit/taskdefs/importtests/w.xml | 22 + .../src/tests/antunit/taskdefs/importtests/x.xml | 22 + .../src/tests/antunit/taskdefs/importtests/y.xml | 22 + .../src/tests/antunit/taskdefs/importtests/z.xml | 21 + .../src/tests/antunit/taskdefs/include-test.xml | 58 + .../src/tests/antunit/taskdefs/jar-spi-test.xml | 149 + .../src/tests/antunit/taskdefs/jar-test.xml | 252 + .../src/tests/antunit/taskdefs/java-test.xml | 75 + .../antunit/taskdefs/javac-dir/bad-src/Bad.java | 22 + .../taskdefs/javac-dir/good-src/Simple.java | 20 + .../src/tests/antunit/taskdefs/javac-test.xml | 316 + .../src/tests/antunit/taskdefs/javadoc-test.xml | 157 + .../src/tests/antunit/taskdefs/length-test.xml | 240 + .../tests/antunit/taskdefs/loadproperties-test.xml | 192 + .../tests/antunit/taskdefs/loadresource-test.xml | 41 + .../src/tests/antunit/taskdefs/local-test.xml | 96 + .../src/tests/antunit/taskdefs/macrodef-test.xml | 60 + .../src/tests/antunit/taskdefs/manifest-test.xml | 180 + .../antunit/taskdefs/manifestclasspath-test.xml | 30 + .../src/tests/antunit/taskdefs/move-test.xml | 234 + .../taskdefs/optional/depend/depend-test.xml | 131 + .../antunit/taskdefs/optional/funtest-test.xml | 128 + .../tests/antunit/taskdefs/optional/javah-test.xml | 65 + .../optional/junit/junit-formatter-test.xml | 93 + .../junit/junit-outputtoformatters-test.xml | 137 + .../antunit/taskdefs/optional/junit/junit-test.xml | 372 ++ .../taskdefs/optional/junit/src/ExampleTest.java | 23 + .../taskdefs/optional/junit/xmlformatter-test.xml | 126 + .../taskdefs/optional/native2ascii-test.xml | 68 + .../taskdefs/optional/propertyfile-test.xml | 44 + .../taskdefs/optional/propertyfilelayout-test.xml | 289 + .../taskdefs/optional/replaceregexp-test.xml | 32 + .../taskdefs/optional/script/scriptdef-test.xml | 131 + .../taskdefs/optional/unix/symlink-test.xml | 109 + .../taskdefs/optional/windows/attrib-test.xml | 46 + .../src/tests/antunit/taskdefs/parallel-test.xml | 37 + .../tests/antunit/taskdefs/pathconvert-test.xml | 31 + .../src/tests/antunit/taskdefs/property-test.xml | 171 + .../tests/antunit/taskdefs/propertyfile-test.xml | 44 + .../tests/antunit/taskdefs/propertyhelper-test.xml | 151 + .../src/tests/antunit/taskdefs/replace-test.xml | 103 + .../src/tests/antunit/taskdefs/retry-test.xml | 45 + .../src/tests/antunit/taskdefs/rmic-test.xml | 105 + .../src/tests/antunit/taskdefs/secure-input.xml | 32 + .../src/tests/antunit/taskdefs/signjar-test.xml | 272 + .../tests/antunit/taskdefs/subant-helper/echo.xml | 20 + .../src/tests/antunit/taskdefs/subant-test.xml | 111 + .../src/tests/antunit/taskdefs/sync-test.xml | 175 + .../src/tests/antunit/taskdefs/tar-test.xml | 118 + .../tests/antunit/taskdefs/taskdef-antlib-test.xml | 64 + .../src/tests/antunit/taskdefs/taskdef-test.xml | 99 + .../src/tests/antunit/taskdefs/tempfile-test.xml | 30 + .../src/tests/antunit/taskdefs/touch-test.xml | 35 + .../antunit/taskdefs/truncate/truncate-test.xml | 145 + .../src/tests/antunit/taskdefs/unzip-test.xml | 70 + .../src/tests/antunit/taskdefs/uptodate-test.xml | 86 + .../src/tests/antunit/taskdefs/utf-16.expected | Bin 0 -> 26 bytes .../tests/antunit/taskdefs/utf-16.expected.windows | Bin 0 -> 32 bytes .../src/tests/antunit/taskdefs/war-test.xml | 194 + .../src/tests/antunit/taskdefs/web.xml | 21 + .../tests/antunit/taskdefs/whichresource-test.xml | 51 + .../tests/antunit/taskdefs/xmlproperty-test.xml | 144 + .../taskdefs/xmlproperty.inline-expansion.xml | 33 + .../tests/antunit/taskdefs/xmlproperty.multi.xml | 21 + .../src/tests/antunit/taskdefs/xslt-test.xml | 260 + .../antunit/taskdefs/xslt/printParams-invalid.xsl | 36 + .../src/tests/antunit/taskdefs/zip-test.xml | 185 + .../tests/antunit/taskdefs/zip/Bugzilla-42940.zip | Bin 0 -> 10930 bytes .../src/tests/antunit/types/build-embedded-ref.xml | 20 + .../antunit/types/conditions/isreference-test.xml | 40 + .../antunit/types/conditions/matches-test.xml | 114 + .../src/tests/antunit/types/cutdirs-test.xml | 56 + .../tests/antunit/types/defer-reference-test.xml | 69 + .../src/tests/antunit/types/fileset-test.xml | 67 + .../src/tests/antunit/types/filterset-test.xml | 96 + .../src/tests/antunit/types/firstmatch-test.xml | 41 + .../src/tests/antunit/types/javaresource-test.xml | 62 + .../src/tests/antunit/types/mapper-ref.xml | 55 + .../src/tests/antunit/types/mappers/glob-test.xml | 80 + .../antunit/types/mappers/packagemapper-test.xml | 50 + .../tests/antunit/types/modified-selector-test.xml | 37 + .../src/tests/antunit/types/path-test.xml | 51 + .../tests/antunit/types/patternset-invert-test.xml | 66 + .../src/tests/antunit/types/patternset-test.xml | 78 + .../src/tests/antunit/types/propertyset-test.xml | 125 + .../antunit/types/resources/archives-test.xml | 136 + .../antunit/types/resources/comparators/test.xml | 299 + .../types/resources/concat-resource-test.xml | 160 + .../antunit/types/resources/fileresource-test.xml | 57 + .../tests/antunit/types/resources/files-test.xml | 52 + .../antunit/types/resources/first-last-test.xml | 280 + .../antunit/types/resources/javaresource-test.xml | 62 + .../antunit/types/resources/latepath-test.xml | 34 + .../types/resources/multirootfileset-test.xml | 166 + .../antunit/types/resources/resourcelist-test.xml | 104 + .../antunit/types/resources/resources-test.xml | 32 + .../types/resources/selectors/name-test.xml | 90 + .../types/resources/selectors/readwrite-test.xml | 106 + .../resources/selectors/test-componentdef.xml | 458 ++ .../antunit/types/resources/selectors/test.xml | 483 ++ .../src/tests/antunit/types/resources/test.xml | 460 ++ .../tests/antunit/types/resources/tokens-test.xml | 128 + .../src/tests/antunit/types/resources/utf-16.in | Bin 0 -> 26 bytes .../tests/antunit/types/selectors/depend-test.xml | 45 + .../antunit/types/selectors/different-test.xml | 46 + .../antunit/types/selectors/filename-test.xml | 69 + .../antunit/types/selectors/modified-test.xml | 76 + .../tests/antunit/types/selectors/present-test.xml | 45 + .../antunit/types/selectors/readwrite-test.xml | 99 + .../tests/antunit/types/selectors/select-test.xml | 88 + .../src/tests/antunit/types/tarfileset-test.xml | 48 + .../src/tests/antunit/types/zipfileset-test.xml | 83 + .../junit/org/apache/tools/ant/AntAssert.java | 72 + .../tools/ant/AntClassLoaderDelegationTest.java | 124 + .../tools/ant/AntClassLoaderPerformance.java | 56 + .../org/apache/tools/ant/AntClassLoaderTest.java | 210 + .../junit/org/apache/tools/ant/BuildFileRule.java | 318 + .../junit/org/apache/tools/ant/BuildFileTest.java | 592 ++ .../tests/junit/org/apache/tools/ant/CaseTest.java | 64 + .../org/apache/tools/ant/DefaultLoggerTest.java | 77 + .../org/apache/tools/ant/DirectoryScannerTest.java | 588 ++ .../org/apache/tools/ant/DispatchTaskTest.java | 46 + .../org/apache/tools/ant/DummyTaskAbstract.java | 32 + .../org/apache/tools/ant/DummyTaskInterface.java | 25 + .../junit/org/apache/tools/ant/DummyTaskOk.java | 31 + .../org/apache/tools/ant/DummyTaskOkNonTask.java | 29 + .../tools/ant/DummyTaskWithNonPublicExecute.java | 29 + .../tools/ant/DummyTaskWithNonVoidExecute.java | 30 + .../ant/DummyTaskWithoutDefaultConstructor.java | 31 + .../apache/tools/ant/DummyTaskWithoutExecute.java | 29 + .../ant/DummyTaskWithoutPublicConstructor.java | 31 + .../junit/org/apache/tools/ant/ExecutorTest.java | 171 + .../org/apache/tools/ant/ExtendedTaskdefTest.java | 68 + .../junit/org/apache/tools/ant/FileUtilities.java | 88 + .../junit/org/apache/tools/ant/ImmutableTest.java | 90 + .../junit/org/apache/tools/ant/IncludeTest.java | 151 + .../apache/tools/ant/IntrospectionHelperTest.java | 726 +++ .../junit/org/apache/tools/ant/LoaderRefTest.java | 52 + .../junit/org/apache/tools/ant/LocationTest.java | 93 + .../org/apache/tools/ant/MockBuildListener.java | 64 + .../junit/org/apache/tools/ant/PickOneTask.java | 31 + .../org/apache/tools/ant/ProjectComponentTest.java | 47 + .../tools/ant/ProjectHelperRepositoryTest.java | 105 + .../junit/org/apache/tools/ant/ProjectTest.java | 327 + .../apache/tools/ant/PropertyExpansionTest.java | 99 + .../org/apache/tools/ant/PropertyFileCLITest.java | 68 + .../org/apache/tools/ant/TaskContainerTest.java | 66 + .../org/apache/tools/ant/TopLevelTaskTest.java | 59 + .../org/apache/tools/ant/UnknownElementTest.java | 115 + .../junit/org/apache/tools/ant/XmlLoggerTest.java | 37 + .../apache/tools/ant/filters/ConcatFilterTest.java | 143 + .../tools/ant/filters/DynamicFilterTest.java | 80 + .../tools/ant/filters/EscapeUnicodeTest.java | 50 + .../org/apache/tools/ant/filters/HeadTailTest.java | 137 + .../apache/tools/ant/filters/LineContainsTest.java | 57 + .../apache/tools/ant/filters/NoNewLineTest.java | 50 + .../tools/ant/filters/ReplaceTokensTest.java | 81 + .../tools/ant/filters/StripJavaCommentsTest.java | 51 + .../apache/tools/ant/filters/TokenFilterTest.java | 279 + .../org/apache/tools/ant/launch/LocatorTest.java | 180 + .../tools/ant/loader/AntClassLoader5Test.java | 73 + .../tools/ant/taskdefs/AbstractCvsTaskTest.java | 71 + .../ant/taskdefs/AntLikeTasksAtTopLevelTest.java | 70 + .../tools/ant/taskdefs/AntStructureTest.java | 114 + .../org/apache/tools/ant/taskdefs/AntTest.java | 607 ++ .../org/apache/tools/ant/taskdefs/AntlibTest.java | 106 + .../apache/tools/ant/taskdefs/AvailableTest.java | 272 + .../org/apache/tools/ant/taskdefs/BUnzip2Test.java | 66 + .../org/apache/tools/ant/taskdefs/BZip2Test.java | 117 + .../apache/tools/ant/taskdefs/BasenameTest.java | 114 + .../org/apache/tools/ant/taskdefs/CVSPassTest.java | 119 + .../apache/tools/ant/taskdefs/CallTargetTest.java | 92 + .../apache/tools/ant/taskdefs/ChecksumTest.java | 109 + .../org/apache/tools/ant/taskdefs/ConcatTest.java | 315 + .../apache/tools/ant/taskdefs/ConditionTest.java | 379 ++ .../org/apache/tools/ant/taskdefs/CopyTest.java | 280 + .../org/apache/tools/ant/taskdefs/CopydirTest.java | 100 + .../apache/tools/ant/taskdefs/CopyfileTest.java | 100 + .../tools/ant/taskdefs/DefaultExcludesTest.java | 170 + .../org/apache/tools/ant/taskdefs/DeleteTest.java | 112 + .../org/apache/tools/ant/taskdefs/DeltreeTest.java | 55 + .../apache/tools/ant/taskdefs/DemuxOutputTask.java | 75 + .../org/apache/tools/ant/taskdefs/DirnameTest.java | 92 + .../org/apache/tools/ant/taskdefs/DynamicTask.java | 46 + .../org/apache/tools/ant/taskdefs/DynamicTest.java | 46 + .../org/apache/tools/ant/taskdefs/EchoTest.java | 105 + .../org/apache/tools/ant/taskdefs/EchoXMLTest.java | 71 + .../apache/tools/ant/taskdefs/ExecTaskTest.java | 192 + .../apache/tools/ant/taskdefs/ExecuteJavaTest.java | 131 + .../tools/ant/taskdefs/ExecuteWatchdogTest.java | 162 + .../org/apache/tools/ant/taskdefs/FailTest.java | 210 + .../org/apache/tools/ant/taskdefs/FilterTest.java | 147 + .../org/apache/tools/ant/taskdefs/FixCrLfTest.java | 262 + .../org/apache/tools/ant/taskdefs/GUnzipTest.java | 91 + .../org/apache/tools/ant/taskdefs/GetTest.java | 122 + .../org/apache/tools/ant/taskdefs/GzipTest.java | 113 + .../org/apache/tools/ant/taskdefs/ImportTest.java | 174 + .../tools/ant/taskdefs/InitializeClassTest.java | 77 + .../org/apache/tools/ant/taskdefs/InputTest.java | 126 + .../org/apache/tools/ant/taskdefs/JarTest.java | 375 ++ .../org/apache/tools/ant/taskdefs/JavaTest.java | 475 ++ .../org/apache/tools/ant/taskdefs/JavacTest.java | 247 + .../org/apache/tools/ant/taskdefs/JavadocTest.java | 132 + .../apache/tools/ant/taskdefs/LoadFileTest.java | 170 + .../apache/tools/ant/taskdefs/MacroDefTest.java | 206 + .../org/apache/tools/ant/taskdefs/MakeUrlTest.java | 176 + .../tools/ant/taskdefs/ManifestClassPathTest.java | 249 + .../apache/tools/ant/taskdefs/ManifestTest.java | 477 ++ .../org/apache/tools/ant/taskdefs/MkdirTest.java | 70 + .../org/apache/tools/ant/taskdefs/MoveTest.java | 168 + .../apache/tools/ant/taskdefs/MultiMapTest.java | 79 + .../org/apache/tools/ant/taskdefs/NiceTest.java | 83 + .../apache/tools/ant/taskdefs/ParallelTest.java | 195 + .../apache/tools/ant/taskdefs/PathConvertTest.java | 65 + .../apache/tools/ant/taskdefs/PreSetDefTest.java | 154 + .../tools/ant/taskdefs/ProcessDestroyerTest.java | 68 + .../apache/tools/ant/taskdefs/PropertyTest.java | 141 + .../ant/taskdefs/ProtectedJarMethodsTest.java | 106 + .../apache/tools/ant/taskdefs/RecorderTest.java | 103 + .../org/apache/tools/ant/taskdefs/RenameTest.java | 88 + .../org/apache/tools/ant/taskdefs/ReplaceTest.java | 180 + .../tools/ant/taskdefs/RmicAdvancedTest.java | 467 ++ .../org/apache/tools/ant/taskdefs/RmicTest.java | 104 + .../org/apache/tools/ant/taskdefs/SQLExecTest.java | 326 + .../org/apache/tools/ant/taskdefs/SignJarTest.java | 139 + .../org/apache/tools/ant/taskdefs/SleepTest.java | 120 + .../org/apache/tools/ant/taskdefs/StyleTest.java | 225 + .../org/apache/tools/ant/taskdefs/SubAntTest.java | 161 + .../org/apache/tools/ant/taskdefs/SyncTest.java | 148 + .../org/apache/tools/ant/taskdefs/TStampTest.java | 117 + .../org/apache/tools/ant/taskdefs/TarTest.java | 210 + .../org/apache/tools/ant/taskdefs/TaskdefTest.java | 128 + .../apache/tools/ant/taskdefs/TaskdefsTest.java | 31 + .../org/apache/tools/ant/taskdefs/TestProcess.java | 96 + .../org/apache/tools/ant/taskdefs/TimeProcess.java | 34 + .../org/apache/tools/ant/taskdefs/TouchTest.java | 211 + .../apache/tools/ant/taskdefs/TypeAdapterTest.java | 176 + .../org/apache/tools/ant/taskdefs/TypedefTest.java | 136 + .../org/apache/tools/ant/taskdefs/UntarTest.java | 111 + .../org/apache/tools/ant/taskdefs/UnzipTest.java | 250 + .../apache/tools/ant/taskdefs/UpToDateTest.java | 77 + .../org/apache/tools/ant/taskdefs/WarTest.java | 55 + .../tools/ant/taskdefs/WhichResourceTest.java | 58 + .../apache/tools/ant/taskdefs/XmlPropertyTest.java | 376 ++ .../org/apache/tools/ant/taskdefs/XmlnsTest.java | 89 + .../tools/ant/taskdefs/ZipExtraFieldTest.java | 109 + .../org/apache/tools/ant/taskdefs/ZipTest.java | 300 + .../compilers/DefaultCompilerAdapterTest.java | 223 + .../ant/taskdefs/condition/AntVersionTest.java | 48 + .../tools/ant/taskdefs/condition/ContainsTest.java | 42 + .../tools/ant/taskdefs/condition/EqualsTest.java | 56 + .../tools/ant/taskdefs/condition/HttpTest.java | 76 + .../ant/taskdefs/condition/IsFailureTest.java | 44 + .../ant/taskdefs/condition/IsFileSelectedTest.java | 74 + .../ant/taskdefs/condition/IsReachableTest.java | 116 + .../ant/taskdefs/condition/IsReferenceTest.java | 71 + .../tools/ant/taskdefs/condition/IsSignedTest.java | 59 + .../ant/taskdefs/condition/ParserSupportsTest.java | 95 + .../ant/taskdefs/condition/TypeFoundTest.java | 91 + .../tools/ant/taskdefs/condition/XorTest.java | 75 + .../ant/taskdefs/cvslib/ChangeLogParserTest.java | 67 + .../ant/taskdefs/cvslib/ChangeLogWriterTest.java | 96 + .../org/apache/tools/ant/taskdefs/dir1/B.java | 30 + .../org/apache/tools/ant/taskdefs/dir2/A.java | 40 + .../tools/ant/taskdefs/email/EmailAddressTest.java | 112 + .../tools/ant/taskdefs/email/EmailTaskTest.java | 63 + .../tools/ant/taskdefs/email/MessageTest.java | 62 + .../tools/ant/taskdefs/optional/ANTLRTest.java | 216 + .../taskdefs/optional/AbstractXSLTLiaisonTest.java | 104 + .../ant/taskdefs/optional/BeanShellScriptTest.java | 48 + .../ant/taskdefs/optional/EchoPropertiesTest.java | 266 + .../tools/ant/taskdefs/optional/JavahTest.java | 60 + .../tools/ant/taskdefs/optional/JspcTest.java | 200 + .../ant/taskdefs/optional/Native2AsciiTest.java | 57 + .../ant/taskdefs/optional/PropertyFileTest.java | 235 + .../tools/ant/taskdefs/optional/PvcsTest.java | 79 + .../ant/taskdefs/optional/ReplaceRegExpTest.java | 132 + .../ant/taskdefs/optional/RhinoReferenceTest.java | 45 + .../ant/taskdefs/optional/RhinoScriptTest.java | 67 + .../tools/ant/taskdefs/optional/RpmTest.java | 71 + .../ant/taskdefs/optional/SchemaValidateTest.java | 128 + .../ant/taskdefs/optional/TraXLiaisonTest.java | 129 + .../taskdefs/optional/XmlValidateCatalogTest.java | 71 + .../ant/taskdefs/optional/XmlValidateTest.java | 193 + .../tools/ant/taskdefs/optional/XsltTest.java | 86 + .../ant/taskdefs/optional/depend/DependTest.java | 213 + .../ant/taskdefs/optional/i18n/TranslateTest.java | 87 + .../ant/taskdefs/optional/image/ImageTest.java | 133 + .../ant/taskdefs/optional/jdepend/JDependTest.java | 99 + .../ant/taskdefs/optional/junit/BatchTestTest.java | 121 + .../ant/taskdefs/optional/junit/DOMUtilTest.java | 53 + .../optional/junit/JUnitClassLoaderTest.java | 37 + .../taskdefs/optional/junit/JUnitReportTest.java | 211 + .../ant/taskdefs/optional/junit/JUnitTaskTest.java | 398 ++ .../optional/junit/JUnitTestListenerTest.java | 111 + .../optional/junit/JUnitTestRunnerTest.java | 217 + .../optional/junit/JUnitVersionHelperTest.java | 102 + .../ant/taskdefs/optional/junit/NoVmCrash.java | 30 + .../tools/ant/taskdefs/optional/junit/Printer.java | 42 + .../tools/ant/taskdefs/optional/junit/Sleeper.java | 30 + .../taskdefs/optional/junit/SuiteMethodTest.java | 42 + .../optional/junit/TearDownOnVmCrashTest.java | 53 + .../ant/taskdefs/optional/junit/TestFormatter.java | 112 + .../tools/ant/taskdefs/optional/junit/VmCrash.java | 31 + .../junit/XMLFormatterWithCDATAOnSystemOut.java | 83 + .../optional/junit/XMLResultAggregatorTest.java | 93 + .../tools/ant/taskdefs/optional/net/FTPTest.java | 879 +++ .../taskdefs/optional/script/ScriptDefTest.java | 146 + .../tools/ant/taskdefs/optional/sos/SOSTest.java | 351 ++ .../taskdefs/optional/splash/SplashScreenTest.java | 50 + .../tools/ant/taskdefs/optional/ssh/ScpTest.java | 206 + .../ant/taskdefs/optional/unix/SymlinkTest.java | 297 + .../tools/ant/taskdefs/optional/vss/MSVSSTest.java | 475 ++ .../tools/ant/types/AbstractFileSetTest.java | 248 + .../org/apache/tools/ant/types/AddTypeTest.java | 223 + .../org/apache/tools/ant/types/AssertionsTest.java | 125 + .../tools/ant/types/CommandlineJavaTest.java | 191 + .../apache/tools/ant/types/CommandlineTest.java | 180 + .../apache/tools/ant/types/DescriptionTest.java | 59 + .../org/apache/tools/ant/types/DirSetTest.java | 94 + .../tools/ant/types/EnumeratedAttributeTest.java | 106 + .../org/apache/tools/ant/types/FileListTest.java | 163 + .../org/apache/tools/ant/types/FileSetTest.java | 36 + .../org/apache/tools/ant/types/FilterSetTest.java | 239 + .../apache/tools/ant/types/FlexIntegerTest.java | 74 + .../org/apache/tools/ant/types/MapperTest.java | 235 + .../junit/org/apache/tools/ant/types/PathTest.java | 579 ++ .../org/apache/tools/ant/types/PatternSetTest.java | 206 + .../apache/tools/ant/types/PermissionsTest.java | 158 + .../junit/org/apache/tools/ant/types/PolyTest.java | 79 + .../tools/ant/types/RedirectorElementTest.java | 86 + .../apache/tools/ant/types/ResourceOutputTest.java | 160 + .../org/apache/tools/ant/types/TarFileSetTest.java | 119 + .../tools/ant/types/XMLCatalogBuildFileTest.java | 98 + .../org/apache/tools/ant/types/XMLCatalogTest.java | 392 ++ .../org/apache/tools/ant/types/ZipFileSetTest.java | 118 + .../tools/ant/types/mappers/GlobMapperTest.java | 49 + .../tools/ant/types/mappers/MapperResult.java | 103 + .../ant/types/mappers/RegexpPatternMapperTest.java | 51 + .../tools/ant/types/optional/ScriptMapperTest.java | 53 + .../ant/types/optional/ScriptSelectorTest.java | 83 + .../types/optional/depend/ClassFileSetTest.java | 186 + .../ant/types/resources/FileResourceTest.java | 122 + .../ant/types/resources/JavaResourceTest.java | 62 + .../resources/LazyResourceCollectionTest.java | 186 + .../ant/types/resources/MultiRootFileSetTest.java | 131 + .../ant/types/resources/ResourceListTest.java | 134 + .../tools/ant/types/resources/TarResourceTest.java | 54 + .../ant/types/selectors/BaseSelectorRule.java | 125 + .../ant/types/selectors/BaseSelectorTest.java | 295 + .../ant/types/selectors/ContainsRegexpTest.java | 56 + .../ant/types/selectors/ContainsSelectorTest.java | 114 + .../ant/types/selectors/DateSelectorTest.java | 229 + .../ant/types/selectors/DependSelectorTest.java | 185 + .../ant/types/selectors/DepthSelectorTest.java | 147 + .../ant/types/selectors/FilenameSelectorTest.java | 115 + .../tools/ant/types/selectors/MockAlgorithm.java | 37 + .../tools/ant/types/selectors/MockCache.java | 68 + .../tools/ant/types/selectors/MockComparator.java | 32 + .../ant/types/selectors/ModifiedSelectorTest.java | 1062 ++++ .../ant/types/selectors/PresentSelectorTest.java | 137 + .../org/apache/tools/ant/types/selectors/README | 96 + .../ant/types/selectors/SignedSelectorTest.java | 54 + .../ant/types/selectors/SizeSelectorTest.java | 237 + .../ant/types/selectors/TokenizedPatternTest.java | 64 + .../ant/types/selectors/TypeSelectorTest.java | 81 + .../apache/tools/ant/util/Base64ConverterTest.java | 43 + .../apache/tools/ant/util/ClasspathUtilsTest.java | 67 + .../apache/tools/ant/util/CollectionUtilsTest.java | 102 + .../tools/ant/util/DOMElementWriterTest.java | 305 + .../org/apache/tools/ant/util/DateUtilsTest.java | 106 + .../apache/tools/ant/util/DeweyDecimalTest.java | 70 + .../org/apache/tools/ant/util/FileUtilsTest.java | 625 ++ .../tools/ant/util/GlobPatternMapperTest.java | 102 + .../org/apache/tools/ant/util/JAXPUtilsTest.java | 43 + .../apache/tools/ant/util/JavaEnvUtilsTest.java | 144 + .../ant/util/LayoutPreservingPropertiesTest.java | 316 + .../tools/ant/util/LazyFileOutputStreamTest.java | 75 + .../ant/util/LineOrientedOutputStreamTest.java | 153 + .../apache/tools/ant/util/LinkedHashtableTest.java | 165 + .../org/apache/tools/ant/util/LoaderUtilsTest.java | 43 + .../tools/ant/util/PackageNameMapperTest.java | 43 + .../tools/ant/util/ReaderInputStreamTest.java | 142 + .../apache/tools/ant/util/ResourceUtilsTest.java | 63 + .../org/apache/tools/ant/util/StringUtilsTest.java | 170 + .../apache/tools/ant/util/SymlinkUtilsTest.java | 40 + .../tools/ant/util/UnPackageNameMapperTest.java | 42 + .../org/apache/tools/ant/util/UnicodeUtilTest.java | 33 + .../org/apache/tools/ant/util/VectorSetTest.java | 295 + .../org/apache/tools/ant/util/XMLFragmentTest.java | 91 + .../ant/util/facade/FacadeTaskHelperTest.java | 64 + .../facade/ImplementationSpecificArgumentTest.java | 59 + .../ant/util/regexp/JakartaOroMatcherTest.java | 35 + .../ant/util/regexp/JakartaOroRegexpTest.java | 35 + .../ant/util/regexp/JakartaRegexpMatcherTest.java | 63 + .../ant/util/regexp/JakartaRegexpRegexpTest.java | 62 + .../ant/util/regexp/Jdk14RegexpMatcherTest.java | 70 + .../ant/util/regexp/Jdk14RegexpRegexpTest.java | 71 + .../tools/ant/util/regexp/RegexpMatcherTest.java | 204 + .../apache/tools/ant/util/regexp/RegexpTest.java | 63 + .../org/apache/tools/bzip2/BlockSortTest.java | 171 + .../org/apache/tools/bzip2/CBZip2StreamTest.java | 47 + .../org/apache/tools/mail/MailMessageTest.java | 707 +++ .../junit/org/apache/tools/tar/TarEntryTest.java | 35 + .../org/apache/tools/tar/TarOutputStreamTest.java | 35 + .../org/apache/tools/tar/TarRoundTripTest.java | 74 + .../org/apache/tools/zip/AsiExtraFieldTest.java | 163 + .../org/apache/tools/zip/ExtraFieldUtilsTest.java | 210 + .../org/apache/tools/zip/UTF8ZipFilesTest.java | 260 + .../org/apache/tools/zip/ZipEncodingTest.java | 152 + .../junit/org/apache/tools/zip/ZipEntryTest.java | 228 + .../junit/org/apache/tools/zip/ZipLongTest.java | 94 + .../org/apache/tools/zip/ZipOutputStreamTest.java | 73 + .../junit/org/apache/tools/zip/ZipShortTest.java | 92 + .../example/junit/AbstractJUnit3TestMissed.java | 27 + .../example/junit/AbstractJUnit3TestNotMissed.java | 31 + .../org/example/junit/AbstractTestMissed.java | 29 + .../org/example/junit/AbstractTestNotMissed.java | 32 + .../org/example/junit/JUnit3NonTestMissed.java | 27 + .../org/example/junit/JUnit3TestNotMissed.java | 28 + .../junit/org/example/junit/JUnit4Skippable.java | 74 + .../junit/org/example/junit/MultilineAsserts.java | 27 + .../junit/org/example/junit/NonTestMissed.java | 25 + .../src/tests/junit/org/example/junit/Output.java | 37 + .../junit/org/example/junit/TestNotMissed.java | 29 + .../org/example/junit/TestWithSuiteNotMissed.java | 32 + .../junit/org/example/junit/ThreadedOutput.java | 43 + .../src/tests/junit/org/example/junit/Timeout.java | 32 + .../junit/org/example/junit/XmlParserTest.java | 58 + .../example/tasks/TaskdefTestContainerTask.java | 25 + .../org/example/tasks/TaskdefTestSimpleTask.java | 45 + .../src/tests/junit/org/example/tasks/antlib.xml | 26 + .../src/tests/junit/org/example/tasks/antlib2.xml | 26 + .../junit/org/example/types/TypedefTestType.java | 25 + .../src/maven/apache-maven-3.3.3/DEPENDENCIES | 111 + framework/src/maven/apache-maven-3.3.3/LICENSE | 202 + framework/src/maven/apache-maven-3.3.3/NOTICE | 5 + framework/src/maven/apache-maven-3.3.3/README.md | 23 + .../apache-maven-3.3.3/apache-maven/README.txt | 79 + .../maven/apache-maven-3.3.3/apache-maven/pom.xml | 216 + .../apache-maven/src/bin/m2.conf | 8 + .../apache-maven-3.3.3/apache-maven/src/bin/mvn | 232 + .../apache-maven/src/bin/mvn.cmd | 176 + .../apache-maven/src/bin/mvnDebug | 41 + .../apache-maven/src/bin/mvnDebug.cmd | 31 + .../apache-maven-3.3.3/apache-maven/src/bin/mvnyjp | 42 + .../src/conf/logging/simplelogger.properties | 25 + .../apache-maven/src/conf/settings.xml | 257 + .../apache-maven/src/conf/toolchains.xml | 103 + .../apache-maven/src/lib/ext/README.txt | 2 + .../main/appended-resources/META-INF/LICENSE.vm | 49 + .../apache-maven/src/main/assembly/bin.xml | 94 + .../apache-maven/src/main/assembly/src.xml | 49 + .../apache-maven/src/site/site.xml | 29 + .../apache/maven/settings/GlobalSettingsTest.java | 59 + framework/src/maven/apache-maven-3.3.3/build.xml | 307 + .../src/maven/apache-maven-3.3.3/deploySite.sh | 23 + .../src/maven/apache-maven-3.3.3/doap_Maven.rdf | 178 + .../maven-aether-provider/pom.xml | 130 + .../internal/ArtifactDescriptorReaderDelegate.java | 153 + .../internal/ArtifactDescriptorUtils.java | 81 + .../internal/DefaultArtifactDescriptorReader.java | 435 ++ .../repository/internal/DefaultModelCache.java | 119 + .../repository/internal/DefaultModelResolver.java | 229 + .../internal/DefaultVersionRangeResolver.java | 322 + .../internal/DefaultVersionResolver.java | 636 ++ .../repository/internal/LocalSnapshotMetadata.java | 163 + .../internal/LocalSnapshotMetadataGenerator.java | 82 + .../repository/internal/MavenAetherModule.java | 76 + .../maven/repository/internal/MavenMetadata.java | 150 + .../internal/MavenRepositorySystemUtils.java | 141 + .../repository/internal/MavenSnapshotMetadata.java | 100 + .../repository/internal/MavenWorkspaceReader.java | 32 + .../repository/internal/RelocatedArtifact.java | 116 + .../internal/RemoteSnapshotMetadata.java | 152 + .../internal/RemoteSnapshotMetadataGenerator.java | 107 + .../internal/SnapshotMetadataGeneratorFactory.java | 52 + .../repository/internal/VersionsMetadata.java | 133 + .../internal/VersionsMetadataGenerator.java | 108 + .../internal/VersionsMetadataGeneratorFactory.java | 52 + .../maven/repository/internal/package-info.java | 25 + .../maven-aether-provider/src/site/apt/index.apt | 33 + .../maven-aether-provider/src/site/site.xml | 36 + .../internal/AbstractRepositoryTestCase.java | 87 + .../DefaultArtifactDescriptorReaderTest.java | 77 + .../internal/DefaultVersionResolverTest.java | 96 + .../internal/MavenRepositorySystemUtilsTest.java | 45 + .../repository/internal/RepositorySystemTest.java | 220 + .../internal/util/ConsoleRepositoryListener.java | 132 + .../internal/util/ConsoleTransferListener.java | 186 + .../07.20.3-SNAPSHOT/maven-metadata.xml | 49 + .../dep-mng5459/0.4.0-SNAPSHOT/maven-metadata.xml | 47 + .../artifact/1.0/artifact-1.0-classifier.zip | 0 .../repo/ut/simple/artifact/1.0/artifact-1.0.jar | 0 .../repo/ut/simple/artifact/1.0/artifact-1.0.pom | 48 + .../repo/ut/simple/artifact/1.0/artifact-1.0.zip | 0 .../repo/ut/simple/artifact/maven-metadata.xml | 34 + .../dependency/1.0/dependency-1.0-sources.jar | 0 .../ut/simple/dependency/1.0/dependency-1.0.jar | 0 .../ut/simple/dependency/1.0/dependency-1.0.pom | 31 + .../repo/ut/simple/dependency/maven-metadata.xml | 34 + .../repo/ut/simple/parent/1.0/parent-1.0.pom | 43 + .../repo/ut/simple/parent/maven-metadata.xml | 34 + .../apache-maven-3.3.3/maven-ant-tasks-2.1.1.jar | Bin 0 -> 1314262 bytes .../apache-maven-3.3.3/maven-artifact/pom.xml | 58 + .../java/org/apache/maven/artifact/Artifact.java | 161 + .../org/apache/maven/artifact/ArtifactUtils.java | 215 + .../org/apache/maven/artifact/DefaultArtifact.java | 597 ++ .../maven/artifact/InvalidArtifactRTException.java | 100 + .../maven/artifact/handler/ArtifactHandler.java | 42 + .../maven/artifact/metadata/ArtifactMetadata.java | 27 + .../artifact/repository/ArtifactRepository.java | 135 + .../repository/ArtifactRepositoryPolicy.java | 222 + .../maven/artifact/repository/Authentication.java | 126 + .../layout/ArtifactRepositoryLayout.java | 38 + .../layout/ArtifactRepositoryLayout2.java | 31 + .../metadata/RepositoryMetadataStoreException.java | 40 + .../AbstractArtifactResolutionException.java | 347 ++ .../resolver/ArtifactNotFoundException.java | 85 + .../resolver/ArtifactResolutionException.java | 68 + .../resolver/CyclicDependencyException.java | 45 + .../MultipleArtifactsNotFoundException.java | 122 + .../artifact/resolver/filter/ArtifactFilter.java | 30 + .../maven/artifact/versioning/ArtifactVersion.java | 42 + .../artifact/versioning/ComparableVersion.java | 503 ++ .../versioning/DefaultArtifactVersion.java | 228 + .../InvalidVersionSpecificationException.java | 34 + .../OverConstrainedVersionException.java | 49 + .../maven/artifact/versioning/Restriction.java | 195 + .../maven/artifact/versioning/VersionRange.java | 583 ++ .../java/org/apache/maven/repository/Proxy.java | 197 + .../legacy/metadata/ArtifactMetadata.java | 83 + .../maven-artifact/src/site/apt/index.apt | 47 + .../maven-artifact/src/site/site.xml | 36 + .../artifact/versioning/ComparableVersionTest.java | 231 + .../versioning/DefaultArtifactVersionTest.java | 223 + .../artifact/versioning/VersionRangeTest.java | 730 +++ .../maven-builder-support/pom.xml | 49 + .../org/apache/maven/building/DefaultProblem.java | 161 + .../maven/building/DefaultProblemCollector.java | 64 + .../java/org/apache/maven/building/FileSource.java | 79 + .../java/org/apache/maven/building/Problem.java | 101 + .../apache/maven/building/ProblemCollector.java | 59 + .../maven/building/ProblemCollectorFactory.java | 43 + .../java/org/apache/maven/building/Source.java | 49 + .../org/apache/maven/building/StringSource.java | 90 + .../java/org/apache/maven/building/UrlSource.java | 80 + .../maven-builder-support/src/site/site.xml | 36 + .../building/DefaultProblemCollectorTest.java | 76 + .../apache/maven/building/DefaultProblemTest.java | 136 + .../org/apache/maven/building/FileSourceTest.java | 93 + .../building/ProblemCollectorFactoryTest.java | 45 + .../apache/maven/building/StringSourceTest.java | 79 + .../org/apache/maven/building/UrlSourceTest.java | 87 + .../src/test/resources/source.txt | 1 + .../maven/apache-maven-3.3.3/maven-compat/pom.xml | 115 + .../apache/maven/artifact/ArtifactScopeEnum.java | 133 + .../org/apache/maven/artifact/ArtifactStatus.java | 124 + .../artifact/UnknownRepositoryLayoutException.java | 54 + .../maven/artifact/deployer/ArtifactDeployer.java | 61 + .../deployer/ArtifactDeploymentException.java | 43 + .../artifact/deployer/DefaultArtifactDeployer.java | 161 + .../installer/ArtifactInstallationException.java | 43 + .../artifact/installer/ArtifactInstaller.java | 60 + .../installer/DefaultArtifactInstaller.java | 135 + .../artifact/manager/DefaultWagonManager.java | 182 + .../manager/WagonConfigurationException.java | 38 + .../maven/artifact/manager/WagonManager.java | 56 + .../repository/ArtifactRepositoryFactory.java | 55 + .../repository/DefaultArtifactRepository.java | 267 + .../DefaultArtifactRepositoryFactory.java | 124 + .../repository/layout/FlatRepositoryLayout.java | 92 + .../metadata/DefaultRepositoryMetadataManager.java | 558 ++ .../metadata/GroupRepositoryMetadata.java | 119 + .../repository/metadata/MetadataBridge.java | 172 + .../repository/metadata/MetadataUtils.java | 39 + .../metadata/RepositoryMetadataReadException.java | 40 + .../SnapshotArtifactRepositoryMetadata.java | 98 + .../maven/artifact/resolver/ArtifactCollector.java | 42 + .../maven/artifact/resolver/ArtifactResolver.java | 108 + .../artifact/resolver/DebugResolutionListener.java | 167 + .../resolver/DefaultArtifactCollector.java | 30 + .../artifact/resolver/DefaultArtifactResolver.java | 643 ++ .../resolver/ResolutionListenerForDepMgmt.java | 43 + .../artifact/resolver/UnresolvedArtifacts.java | 66 + .../resolver/WarningResolutionListener.java | 90 + .../resolver/filter/InversionArtifactFilter.java | 65 + .../artifact/resolver/filter/OrArtifactFilter.java | 93 + .../resolver/filter/TypeArtifactFilter.java | 66 + .../artifact/versioning/ManagedVersionMap.java | 56 + .../maven/execution/DefaultRuntimeInformation.java | 64 + .../apache/maven/execution/RuntimeInformation.java | 34 + .../profiles/DefaultMavenProfilesBuilder.java | 93 + .../maven/profiles/DefaultProfileManager.java | 248 + .../maven/profiles/MavenProfilesBuilder.java | 37 + .../org/apache/maven/profiles/ProfileManager.java | 58 + .../maven/profiles/ProfilesConversionUtils.java | 151 + .../activation/DetectedProfileActivator.java | 35 + .../profiles/activation/FileProfileActivator.java | 109 + .../activation/JdkPrefixProfileActivator.java | 97 + .../OperatingSystemProfileActivator.java | 161 + .../activation/ProfileActivationException.java | 39 + .../profiles/activation/ProfileActivator.java | 33 + .../activation/SystemPropertyProfileActivator.java | 114 + .../maven/project/DefaultMavenProjectBuilder.java | 324 + .../DefaultProjectBuilderConfiguration.java | 107 + .../project/InvalidProjectModelException.java | 74 + .../apache/maven/project/MavenProjectBuilder.java | 76 + .../project/MissingRepositoryElementException.java | 38 + .../java/org/apache/maven/project/ModelUtils.java | 367 ++ .../maven/project/ProjectBuilderConfiguration.java | 55 + .../org/apache/maven/project/ProjectUtils.java | 118 + .../DefaultModelInheritanceAssembler.java | 752 +++ .../inheritance/ModelInheritanceAssembler.java | 41 + .../AbstractStringBasedModelInterpolator.java | 407 ++ .../interpolation/BuildTimestampValueSource.java | 63 + .../interpolation/ModelInterpolationException.java | 72 + .../project/interpolation/ModelInterpolator.java | 66 + .../PathTranslatingPostProcessor.java | 64 + .../interpolation/RegexBasedModelInterpolator.java | 58 + .../StringSearchModelInterpolator.java | 410 ++ .../maven/project/path/DefaultPathTranslator.java | 261 + .../project/validation/DefaultModelValidator.java | 76 + .../project/validation/ModelValidationResult.java | 95 + .../maven/project/validation/ModelValidator.java | 37 + .../maven/reporting/MavenReportException.java | 39 + .../maven/repository/DefaultMirrorSelector.java | 205 + .../maven/repository/MavenArtifactMetadata.java | 119 + .../org/apache/maven/repository/MetadataGraph.java | 96 + .../apache/maven/repository/MetadataGraphNode.java | 101 + .../repository/MetadataResolutionRequest.java | 202 + .../maven/repository/MetadataResolutionResult.java | 356 ++ .../apache/maven/repository/MirrorSelector.java | 44 + .../repository/UserLocalArtifactRepository.java | 74 + .../maven/repository/VersionNotFoundException.java | 83 + .../repository/legacy/ChecksumFailedException.java | 42 + .../legacy/DefaultUpdateCheckManager.java | 438 ++ .../repository/legacy/DefaultWagonManager.java | 823 +++ .../repository/legacy/LegacyRepositorySystem.java | 906 +++ .../maven/repository/legacy/MavenArtifact.java | 96 + .../repository/legacy/TransferListenerAdapter.java | 187 + .../repository/legacy/UpdateCheckManager.java | 41 + .../legacy/WagonConfigurationException.java | 63 + .../maven/repository/legacy/WagonManager.java | 79 + .../repository/ArtifactRepositoryFactory.java | 56 + .../DefaultArtifactRepositoryFactory.java | 144 + .../resolver/DefaultLegacyArtifactCollector.java | 796 +++ .../legacy/resolver/LegacyArtifactCollector.java | 62 + .../legacy/resolver/conflict/ConflictResolver.java | 44 + .../resolver/conflict/ConflictResolverFactory.java | 48 + .../ConflictResolverNotFoundException.java | 47 + .../resolver/conflict/DefaultConflictResolver.java | 36 + .../conflict/DefaultConflictResolverFactory.java | 80 + .../conflict/FarthestConflictResolver.java | 47 + .../resolver/conflict/NearestConflictResolver.java | 48 + .../resolver/conflict/NewestConflictResolver.java | 62 + .../resolver/conflict/OldestConflictResolver.java | 62 + .../transform/AbstractVersionTransformation.java | 135 + .../resolver/transform/ArtifactTransformation.java | 86 + .../transform/ArtifactTransformationManager.java | 82 + .../DefaultArtifactTransformationManager.java | 86 + .../transform/LatestArtifactTransformation.java | 74 + .../transform/ReleaseArtifactTransformation.java | 100 + .../resolver/transform/SnapshotTransformation.java | 171 + .../repository/metadata/ArtifactMetadata.java | 353 ++ .../repository/metadata/ClasspathContainer.java | 144 + .../metadata/ClasspathTransformation.java | 46 + .../metadata/DefaultClasspathTransformation.java | 183 + .../DefaultGraphConflictResolutionPolicy.java | 73 + .../metadata/DefaultGraphConflictResolver.java | 249 + .../metadata/GraphConflictResolutionException.java | 51 + .../metadata/GraphConflictResolutionPolicy.java | 35 + .../repository/metadata/GraphConflictResolver.java | 48 + .../maven/repository/metadata/MetadataGraph.java | 523 ++ .../repository/metadata/MetadataGraphEdge.java | 189 + .../MetadataGraphTransformationException.java | 50 + .../repository/metadata/MetadataGraphVertex.java | 216 + .../repository/metadata/MetadataResolution.java | 71 + .../metadata/MetadataResolutionException.java | 49 + .../metadata/MetadataResolutionRequest.java | 79 + .../MetadataResolutionRequestTypeEnum.java | 45 + .../metadata/MetadataResolutionResult.java | 172 + .../metadata/MetadataRetrievalException.java | 59 + .../maven/repository/metadata/MetadataSource.java | 39 + .../repository/metadata/MetadataTreeNode.java | 148 + .../plugin/ExpressionDocumentationException.java | 37 + .../usability/plugin/ExpressionDocumenter.java | 175 + .../maven-compat/src/main/mdo/paramdoc.mdo | 154 + .../maven-compat/src/main/mdo/profiles.mdo | 398 ++ .../maven/plugin-expressions/project.paramdoc.xml | 172 + .../maven/plugin-expressions/rootless.paramdoc.xml | 48 + .../maven/plugin-expressions/settings.paramdoc.xml | 53 + .../src/main/resources/META-INF/maven/plugin.xml | 218 + .../maven-compat/src/site/site.xml | 36 + .../AbstractArtifactComponentTestCase.java | 371 ++ .../apache/maven/artifact/ArtifactUtilsTest.java | 79 + .../apache/maven/artifact/DefaultArtifactTest.java | 140 + .../artifact/deployer/ArtifactDeployerTest.java | 67 + .../deployer/SimpleArtifactMetadataSource.java | 66 + .../factory/DefaultArtifactFactoryTest.java | 49 + .../artifact/handler/ArtifactHandlerMock.java | 100 + .../artifact/installer/ArtifactInstallerTest.java | 61 + .../artifact/metadata/TestMetadataSource.java | 102 + .../repository/MavenArtifactRepositoryTest.java | 59 + .../resolver/ArtifactResolutionExceptionTest.java | 64 + .../artifact/resolver/ArtifactResolverTest.java | 283 + .../resolver/DefaultArtifactResolverTest.java | 111 + .../maven/artifact/resolver/TestFileWagon.java | 94 + .../artifact/resolver/TestTransferListener.java | 43 + .../resolver/filter/AndArtifactFilterTest.java | 62 + .../resolver/filter/FilterHashEqualsTest.java | 50 + .../resolver/filter/OrArtifactFilterTest.java | 62 + .../resolver/filter/ScopeArtifactFilterTest.java | 96 + .../maven/artifact/testutils/TestFileManager.java | 224 + .../transform/TransformationManagerTest.java | 46 + .../manager/DefaultProfileManagerTest.java | 232 + .../project/AbstractMavenProjectTestCase.java | 185 + .../maven/project/ClasspathArtifactResolver.java | 89 + .../maven/project/EmptyLifecycleExecutor.java | 110 + .../project/EmptyLifecyclePluginAnalyzer.java | 78 + .../project/LegacyLocalRepositoryManager.java | 192 + .../org/apache/maven/project/ModelUtilsTest.java | 616 ++ .../apache/maven/project/ProjectClasspathTest.java | 149 + .../apache/maven/project/TestArtifactResolver.java | 30 + .../maven/project/TestMavenRepositorySystem.java | 30 + .../apache/maven/project/TestProjectBuilder.java | 68 + .../AbstractProjectInheritanceTestCase.java | 57 + .../inheritance/t00/ProjectInheritanceTest.java | 93 + .../inheritance/t01/ProjectInheritanceTest.java | 92 + .../inheritance/t02/ProjectInheritanceTest.java | 169 + .../inheritance/t03/ProjectInheritanceTest.java | 68 + .../inheritance/t04/ProjectInheritanceTest.java | 86 + .../inheritance/t05/ProjectInheritanceTest.java | 79 + .../inheritance/t06/ProjectInheritanceTest.java | 80 + .../inheritance/t07/ProjectInheritanceTest.java | 82 + .../inheritance/t08/ProjectInheritanceTest.java | 81 + .../inheritance/t09/ProjectInheritanceTest.java | 119 + .../inheritance/t10/ProjectInheritanceTest.java | 94 + .../inheritance/t11/ProjectInheritanceTest.java | 64 + .../inheritance/t12/ProjectInheritanceTest.java | 65 + .../inheritance/t12scm/ProjectInheritanceTest.java | 125 + .../project/path/DefaultPathTranslatorTest.java | 58 + .../repository/DefaultMirrorSelectorTest.java | 38 + .../maven/repository/LegacyRepositoryLayout.java | 89 + .../repository/LegacyRepositorySystemTest.java | 206 + .../maven/repository/MirrorProcessorTest.java | 259 + .../legacy/DefaultUpdateCheckManagerTest.java | 240 + .../repository/legacy/DefaultWagonManagerTest.java | 422 ++ .../legacy/LegacyRepositorySystemTest.java | 88 + .../maven/repository/legacy/PerLookupWagon.java | 38 + .../maven/repository/legacy/StringWagon.java | 107 + .../org/apache/maven/repository/legacy/WagonA.java | 39 + .../org/apache/maven/repository/legacy/WagonB.java | 39 + .../org/apache/maven/repository/legacy/WagonC.java | 39 + .../apache/maven/repository/legacy/WagonMock.java | 50 + .../resolver/DefaultArtifactCollectorTest.java | 984 +++ .../conflict/AbstractConflictResolverTest.java | 143 + .../conflict/FarthestConflictResolverTest.java | 107 + .../conflict/NearestConflictResolverTest.java | 107 + .../conflict/NewestConflictResolverTest.java | 107 + .../conflict/OldestConflictResolverTest.java | 107 + .../DefaultClasspathTransformationTest.java | 120 + .../DefaultGraphConflictResolutionPolicyTest.java | 59 + .../metadata/DefaultGraphConflictResolverTest.java | 153 + .../repository/metadata/TestMetadataSource.java | 99 + .../org/apache/maven/its/a/0.1/a-0.1.jar | Bin 0 -> 1898 bytes .../org/apache/maven/its/a/0.1/a-0.1.pom | 41 + .../org/apache/maven/its/a/maven-metadata.xml | 12 + .../org/apache/maven/its/b/0.1/b-0.1.jar | Bin 0 -> 1936 bytes .../org/apache/maven/its/b/0.1/b-0.1.pom | 49 + .../org/apache/maven/its/b/maven-metadata.xml | 12 + .../test/repository-system/maven-core-2.1.0.jar | 0 .../resources/artifact-install/artifact-1.0.jar | 1 + .../inheritance-repo/t00/maven/poms/p0-1.0.pom | 11 + .../inheritance-repo/t00/maven/poms/p1-1.0.pom | 16 + .../inheritance-repo/t00/maven/poms/p2-1.0.pom | 18 + .../inheritance-repo/t00/maven/poms/p3-1.0.pom | 14 + .../inheritance-repo/t00/maven/poms/p4-1.0.pom | 13 + .../inheritance-repo/t01/maven.t01/poms/p0-1.0.pom | 11 + .../inheritance-repo/t01/maven.t01/poms/p1-1.0.pom | 16 + .../inheritance-repo/t01/maven.t01/poms/p2-1.0.pom | 16 + .../inheritance-repo/t01/maven.t01/poms/p3-1.0.pom | 16 + .../inheritance-repo/t01/maven.t01/poms/p4-1.0.pom | 16 + .../inheritance-repo/t02/p0/p1/p2/p3/p4/p5/pom.xml | 32 + .../inheritance-repo/t02/p0/p1/p2/p3/p4/pom.xml | 32 + .../inheritance-repo/t02/p0/p1/p2/p3/pom.xml | 33 + .../inheritance-repo/t02/p0/p1/p2/pom.xml | 37 + .../resources/inheritance-repo/t02/p0/p1/pom.xml | 51 + .../test/resources/inheritance-repo/t02/p0/pom.xml | 30 + .../resources/inheritance-repo/t03/p0/p1/pom.xml | 45 + .../test/resources/inheritance-repo/t03/p0/pom.xml | 30 + .../t04/maven-test/jars/t04-a-1.0.jar | 1 + .../t04/maven-test/jars/t04-b-1.0.jar | 1 + .../t04/maven-test/jars/t04-b-2.0.jar | 1 + .../t04/maven-test/jars/t04-c-1.0.jar | 1 + .../t04/maven-test/jars/t04-c-2.0.jar | 1 + .../t04/maven-test/poms/t04-a-1.0.pom | 21 + .../t04/maven-test/poms/t04-b-1.0.pom | 7 + .../t04/maven-test/poms/t04-b-2.0.pom | 7 + .../t04/maven-test/poms/t04-c-1.0.pom | 7 + .../t04/maven-test/poms/t04-c-2.0.pom | 7 + .../resources/inheritance-repo/t04/p0/p1/pom.xml | 41 + .../test/resources/inheritance-repo/t04/p0/pom.xml | 37 + .../t05/maven-test/jars/t05-a-1.0.jar | 1 + .../t05/maven-test/jars/t05-a-2.0.jar | 1 + .../t05/maven-test/jars/t05-b-1.0.jar | 1 + .../t05/maven-test/jars/t05-b-1.1.jar | 1 + .../t05/maven-test/jars/t05-b-2.0.jar | 1 + .../t05/maven-test/jars/t05-c-1.0.jar | 1 + .../t05/maven-test/jars/t05-d-1.0.jar | 1 + .../t05/maven-test/jars/t05-d-1.1.jar | 1 + .../t05/maven-test/jars/t05-d-1.2.jar | 1 + .../t05/maven-test/poms/t05-a-1.0.pom | 23 + .../t05/maven-test/poms/t05-a-2.0.pom | 23 + .../t05/maven-test/poms/t05-b-1.0.pom | 24 + .../t05/maven-test/poms/t05-b-1.1.pom | 24 + .../t05/maven-test/poms/t05-b-2.0.pom | 24 + .../t05/maven-test/poms/t05-c-1.0.pom | 17 + .../t05/maven-test/poms/t05-d-1.0.pom | 7 + .../t05/maven-test/poms/t05-d-1.1.pom | 7 + .../t05/maven-test/poms/t05-d-1.2.pom | 7 + .../resources/inheritance-repo/t05/p0/p1/pom.xml | 54 + .../test/resources/inheritance-repo/t05/p0/pom.xml | 36 + .../t06/maven-test/jars/t06-a-1.0.jar | 1 + .../t06/maven-test/jars/t06-b-1.0.jar | 1 + .../t06/maven-test/jars/t06-b-1.1.jar | 1 + .../t06/maven-test/jars/t06-c-1.0.jar | 1 + .../t06/maven-test/jars/t06-d-1.0.jar | 1 + .../t06/maven-test/jars/t06-d-1.1.jar | 1 + .../t06/maven-test/jars/t06-d-1.2.jar | 1 + .../t06/maven-test/poms/t06-a-1.0.pom | 23 + .../t06/maven-test/poms/t06-b-1.0.pom | 24 + .../t06/maven-test/poms/t06-b-1.1.pom | 24 + .../t06/maven-test/poms/t06-c-1.0.pom | 17 + .../t06/maven-test/poms/t06-d-1.0.pom | 7 + .../t06/maven-test/poms/t06-d-1.1.pom | 7 + .../t06/maven-test/poms/t06-d-1.2.pom | 7 + .../resources/inheritance-repo/t06/p0/p1/pom.xml | 54 + .../test/resources/inheritance-repo/t06/p0/pom.xml | 37 + .../t07/maven-test/jars/t07-a-1.0.jar | 1 + .../t07/maven-test/jars/t07-b-1.0.jar | 1 + .../t07/maven-test/jars/t07-b-1.1.jar | 1 + .../t07/maven-test/jars/t07-c-1.0.jar | 1 + .../t07/maven-test/jars/t07-d-1.0.jar | 1 + .../t07/maven-test/jars/t07-d-1.1.jar | 1 + .../t07/maven-test/jars/t07-d-1.2.jar | 1 + .../t07/maven-test/poms/t07-a-1.0.pom | 23 + .../t07/maven-test/poms/t07-b-1.0.pom | 24 + .../t07/maven-test/poms/t07-b-1.1.pom | 24 + .../t07/maven-test/poms/t07-c-1.0.pom | 17 + .../t07/maven-test/poms/t07-d-1.0.pom | 7 + .../t07/maven-test/poms/t07-d-1.1.pom | 7 + .../t07/maven-test/poms/t07-d-1.2.pom | 7 + .../resources/inheritance-repo/t07/p0/p1/pom.xml | 54 + .../test/resources/inheritance-repo/t07/p0/pom.xml | 37 + .../t08/maven-test/jars/t08-a-1.0.jar | 1 + .../t08/maven-test/jars/t08-b-1.0.jar | 1 + .../t08/maven-test/jars/t08-b-1.1.jar | 1 + .../t08/maven-test/jars/t08-c-1.0.jar | 1 + .../t08/maven-test/jars/t08-d-1.0.jar | 1 + .../t08/maven-test/jars/t08-d-1.1.jar | 1 + .../t08/maven-test/jars/t08-d-1.2.jar | 1 + .../t08/maven-test/poms/t08-a-1.0.pom | 23 + .../t08/maven-test/poms/t08-b-1.0.pom | 24 + .../t08/maven-test/poms/t08-b-1.1.pom | 24 + .../t08/maven-test/poms/t08-c-1.0.pom | 17 + .../t08/maven-test/poms/t08-d-1.0.pom | 7 + .../t08/maven-test/poms/t08-d-1.1.pom | 7 + .../t08/maven-test/poms/t08-d-1.2.pom | 7 + .../resources/inheritance-repo/t08/p0/p1/pom.xml | 59 + .../test/resources/inheritance-repo/t08/p0/pom.xml | 37 + .../t09/maven-test/jars/t09-a-1.0.jar | 1 + .../t09/maven-test/jars/t09-b-1.0.jar | 1 + .../t09/maven-test/jars/t09-c-1.0.jar | 1 + .../t09/maven-test/jars/t09-d-1.0.jar | 1 + .../t09/maven-test/poms/t09-a-1.0.pom | 24 + .../t09/maven-test/poms/t09-b-1.0.pom | 17 + .../t09/maven-test/poms/t09-c-1.0.pom | 7 + .../t09/maven-test/poms/t09-d-1.0.pom | 17 + .../resources/inheritance-repo/t09/p0/p1/pom.xml | 36 + .../resources/inheritance-repo/t09/p0/p2/pom.xml | 42 + .../test/resources/inheritance-repo/t09/p0/pom.xml | 38 + .../t10/maven-test/jars/t10-a-1.0.jar | 1 + .../t10/maven-test/jars/t10-b-1.0.jar | 1 + .../t10/maven-test/jars/t10-c-1.0.jar | 1 + .../t10/maven-test/poms/t10-a-1.0.pom | 24 + .../t10/maven-test/poms/t10-b-1.0.pom | 7 + .../t10/maven-test/poms/t10-c-1.0.pom | 7 + .../resources/inheritance-repo/t10/p0/p1/pom.xml | 42 + .../test/resources/inheritance-repo/t10/p0/pom.xml | 41 + .../resources/inheritance-repo/t11/p0/p1/pom.xml | 16 + .../test/resources/inheritance-repo/t11/p0/pom.xml | 27 + .../resources/inheritance-repo/t12/p0/p1/pom.xml | 29 + .../test/resources/inheritance-repo/t12/p0/pom.xml | 30 + .../t12scm/maven/p0/1.0/p0-1.0.pom | 18 + .../t12scm/maven/p1/1.0/p1-1.0.pom | 11 + .../inheritance-repo/t12scm/p0/modules/p1/pom.xml | 11 + .../resources/inheritance-repo/t12scm/p0/pom.xml | 18 + .../src/test/resources/local-repo/marker.txt | 1 + .../maven-test/jars/maven-test-a-1.0.jar | 1 + .../maven-test/jars/maven-test-b-1.0.jar | 1 + .../maven-test/jars/maven-test-c-1.0.jar | 1 + .../maven-test/jars/maven-test-d-1.0.jar | 1 + .../maven-test/poms/maven-test-a-1.0.pom | 23 + .../maven-test/poms/maven-test-b-1.0.pom | 23 + .../maven-test/poms/maven-test-c-1.0.pom | 16 + .../maven-test/poms/maven-test-d-1.1.pom | 7 + .../maven-test/poms/maven-test-d-1.2.pom | 7 + .../jars/maven-snapshot-a-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-a-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../jars/maven-snapshot-b-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-b-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../jars/maven-snapshot-e-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-e-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../poms/maven-test-snapshot-resolving-1.0.pom | 49 + .../artifact/deployer/ArtifactDeployerTest.xml | 23 + .../artifact/installer/ArtifactInstallerTest.xml | 23 + .../artifact/manager/DefaultWagonManagerTest.xml | 48 + .../artifact/resolver/ArtifactResolverTest.xml | 71 + .../artifact/resolver/ArtifactUpdatePolicyTest.xml | 29 + .../maven/project/AbstractMavenProjectTestCase.xml | 9 + .../maven-compat/src/test/resources/pom.xml | 155 + .../scope/project-with-scoped-dependencies.xml | 99 + .../projects/scope/transitive-compile-dep.xml | 57 + .../projects/scope/transitive-default-dep.xml | 58 + .../projects/scope/transitive-provided-dep.xml | 57 + .../projects/scope/transitive-runtime-dep.xml | 58 + .../projects/scope/transitive-test-dep.xml | 58 + .../maven-core/lifecycle-executor.txt | 217 + .../maven-core/plugin-manager.txt | 184 + .../maven/apache-maven-3.3.3/maven-core/pom.xml | 238 + .../maven-core/project-builder.txt | 1 + .../maven/AbstractMavenLifecycleParticipant.java | 77 + .../org/apache/maven/ArtifactFilterManager.java | 51 + .../maven/ArtifactFilterManagerDelegate.java | 34 + .../src/main/java/org/apache/maven/BuildAbort.java | 39 + .../org/apache/maven/BuildFailureException.java | 39 + .../apache/maven/DefaultArtifactFilterManager.java | 112 + .../main/java/org/apache/maven/DefaultMaven.java | 521 ++ .../maven/DefaultProjectDependenciesResolver.java | 217 + .../apache/maven/DuplicateProjectException.java | 61 + .../org/apache/maven/InternalErrorException.java | 36 + .../src/main/java/org/apache/maven/Maven.java | 34 + .../org/apache/maven/MavenExecutionException.java | 55 + .../org/apache/maven/MissingModuleException.java | 48 + .../apache/maven/ProjectBuildFailureException.java | 55 + .../org/apache/maven/ProjectCycleException.java | 39 + .../apache/maven/ProjectDependenciesResolver.java | 95 + .../main/java/org/apache/maven/ReactorReader.java | 255 + .../java/org/apache/maven/RepositoryUtils.java | 362 ++ .../main/java/org/apache/maven/SessionScoped.java | 42 + .../DependencyResolutionRequiredException.java | 35 + .../maven/artifact/InvalidRepositoryException.java | 65 + .../maven/artifact/factory/ArtifactFactory.java | 59 + .../artifact/factory/DefaultArtifactFactory.java | 160 + .../artifact/handler/DefaultArtifactHandler.java | 134 + .../handler/manager/ArtifactHandlerManager.java | 37 + .../manager/DefaultArtifactHandlerManager.java | 73 + .../metadata/AbstractArtifactMetadata.java | 33 + .../ArtifactMetadataRetrievalException.java | 55 + .../artifact/metadata/ArtifactMetadataSource.java | 52 + .../maven/artifact/metadata/ResolutionGroup.java | 46 + .../repository/DefaultRepositoryRequest.java | 134 + .../repository/LegacyLocalRepositoryManager.java | 435 ++ .../repository/MavenArtifactRepository.java | 412 ++ .../maven/artifact/repository/RepositoryCache.java | 58 + .../artifact/repository/RepositoryRequest.java | 95 + .../repository/layout/DefaultRepositoryLayout.java | 112 + .../metadata/AbstractRepositoryMetadata.java | 255 + .../metadata/ArtifactRepositoryMetadata.java | 129 + .../repository/metadata/RepositoryMetadata.java | 92 + .../RepositoryMetadataDeploymentException.java | 40 + .../RepositoryMetadataInstallationException.java | 40 + .../metadata/RepositoryMetadataManager.java | 61 + .../RepositoryMetadataResolutionException.java | 40 + .../metadata/io/DefaultMetadataReader.java | 110 + .../metadata/io/MetadataParseException.java | 93 + .../repository/metadata/io/MetadataReader.java | 82 + .../resolver/ArtifactResolutionRequest.java | 329 + .../resolver/ArtifactResolutionResult.java | 358 ++ .../resolver/DefaultResolutionErrorHandler.java | 89 + .../artifact/resolver/ResolutionErrorHandler.java | 31 + .../artifact/resolver/ResolutionListener.java | 109 + .../maven/artifact/resolver/ResolutionNode.java | 251 + .../filter/AbstractScopeArtifactFilter.java | 107 + .../resolver/filter/AndArtifactFilter.java | 99 + .../filter/CumulativeScopeArtifactFilter.java | 122 + .../resolver/filter/ExcludesArtifactFilter.java | 44 + .../resolver/filter/ExclusionSetFilter.java | 86 + .../resolver/filter/IncludesArtifactFilter.java | 93 + .../resolver/filter/ScopeArtifactFilter.java | 78 + .../apache/maven/bridge/MavenRepositorySystem.java | 785 +++ .../classrealm/ArtifactClassRealmConstituent.java | 76 + .../maven/classrealm/ClassRealmConstituent.java | 74 + .../apache/maven/classrealm/ClassRealmManager.java | 88 + .../classrealm/ClassRealmManagerDelegate.java | 36 + .../apache/maven/classrealm/ClassRealmRequest.java | 100 + .../maven/classrealm/DefaultClassRealmManager.java | 416 ++ .../maven/classrealm/DefaultClassRealmRequest.java | 82 + .../BasedirBeanConfigurationPathTranslator.java | 71 + .../configuration/BeanConfigurationException.java | 41 + .../BeanConfigurationPathTranslator.java | 41 + .../configuration/BeanConfigurationRequest.java | 130 + .../BeanConfigurationValuePreprocessor.java | 45 + .../maven/configuration/BeanConfigurator.java | 44 + .../DefaultBeanConfigurationRequest.java | 195 + .../internal/DefaultBeanConfigurator.java | 160 + .../apache/maven/eventspy/AbstractEventSpy.java | 45 + .../java/org/apache/maven/eventspy/EventSpy.java | 77 + .../eventspy/internal/EventSpyDispatcher.java | 158 + .../internal/EventSpyExecutionListener.java | 163 + .../internal/EventSpyRepositoryListener.java | 176 + .../maven/exception/DefaultExceptionHandler.java | 336 ++ .../apache/maven/exception/ExceptionHandler.java | 30 + .../apache/maven/exception/ExceptionSummary.java | 79 + .../maven/execution/AbstractExecutionListener.java | 116 + .../org/apache/maven/execution/BuildFailure.java | 61 + .../org/apache/maven/execution/BuildSuccess.java | 44 + .../org/apache/maven/execution/BuildSummary.java | 78 + .../execution/DefaultMavenExecutionRequest.java | 1299 ++++ .../DefaultMavenExecutionRequestPopulator.java | 318 + .../execution/DefaultMavenExecutionResult.java | 109 + .../org/apache/maven/execution/ExecutionEvent.java | 92 + .../apache/maven/execution/ExecutionListener.java | 66 + .../maven/execution/MavenExecutionRequest.java | 443 ++ .../MavenExecutionRequestPopulationException.java | 43 + .../execution/MavenExecutionRequestPopulator.java | 74 + .../maven/execution/MavenExecutionResult.java | 70 + .../org/apache/maven/execution/MavenSession.java | 438 ++ .../apache/maven/execution/MojoExecutionEvent.java | 86 + .../maven/execution/MojoExecutionListener.java | 40 + .../maven/execution/ProjectDependencyGraph.java | 64 + .../maven/execution/ProjectExecutionEvent.java | 90 + .../maven/execution/ProjectExecutionListener.java | 44 + .../org/apache/maven/execution/ReactorManager.java | 199 + .../apache/maven/execution/SettingsAdapter.java | 126 + .../maven/execution/scope/MojoExecutionScoped.java | 42 + .../execution/scope/WeakMojoExecutionListener.java | 44 + .../scope/internal/MojoExecutionScope.java | 190 + .../internal/MojoExecutionScopeCoreModule.java | 45 + .../scope/internal/MojoExecutionScopeModule.java | 56 + .../maven/extension/internal/CoreExports.java | 75 + .../extension/internal/CoreExportsProvider.java | 53 + .../extension/internal/CoreExtensionEntry.java | 141 + .../apache/maven/graph/DefaultGraphBuilder.java | 488 ++ .../maven/graph/DefaultProjectDependencyGraph.java | 134 + .../graph/FilteredProjectDependencyGraph.java | 111 + .../java/org/apache/maven/graph/GraphBuilder.java | 31 + .../DefaultRepositorySystemSessionFactory.java | 271 + .../internal/aether/LoggingRepositoryListener.java | 141 + .../maven/lifecycle/DefaultLifecycleExecutor.java | 177 + .../apache/maven/lifecycle/DefaultLifecycles.java | 144 + .../maven/lifecycle/LifeCyclePluginAnalyzer.java | 32 + .../java/org/apache/maven/lifecycle/Lifecycle.java | 80 + .../lifecycle/LifecycleExecutionException.java | 111 + .../apache/maven/lifecycle/LifecycleExecutor.java | 89 + .../maven/lifecycle/LifecycleMappingDelegate.java | 52 + .../lifecycle/LifecycleNotFoundException.java | 54 + .../lifecycle/LifecyclePhaseNotFoundException.java | 55 + .../apache/maven/lifecycle/MavenExecutionPlan.java | 202 + .../maven/lifecycle/MissingProjectException.java | 41 + .../maven/lifecycle/MojoExecutionConfigurator.java | 44 + .../maven/lifecycle/NoGoalSpecifiedException.java | 41 + .../lifecycle/internal/BuildListCalculator.java | 67 + .../lifecycle/internal/BuildThreadFactory.java | 39 + .../internal/CompoundProjectExecutionListener.java | 72 + .../lifecycle/internal/DefaultExecutionEvent.java | 77 + .../internal/DefaultExecutionEventCatapult.java | 119 + .../DefaultLifecycleExecutionPlanCalculator.java | 591 ++ .../internal/DefaultLifecycleMappingDelegate.java | 158 + .../internal/DefaultLifecyclePluginAnalyzer.java | 258 + .../DefaultLifecycleTaskSegmentCalculator.java | 155 + .../internal/DefaultMojoExecutionConfigurator.java | 108 + .../internal/DefaultProjectArtifactFactory.java | 53 + .../lifecycle/internal/DependencyContext.java | 114 + .../lifecycle/internal/ExecutionEventCatapult.java | 40 + .../lifecycle/internal/ExecutionPlanItem.java | 84 + .../apache/maven/lifecycle/internal/GoalTask.java | 45 + .../lifecycle/internal/LifecycleDebugLogger.java | 182 + .../internal/LifecycleDependencyResolver.java | 334 ++ .../internal/LifecycleExecutionPlanCalculator.java | 67 + .../lifecycle/internal/LifecycleModuleBuilder.java | 154 + .../internal/LifecyclePluginResolver.java | 95 + .../maven/lifecycle/internal/LifecycleStarter.java | 150 + .../maven/lifecycle/internal/LifecycleTask.java | 50 + .../internal/LifecycleTaskSegmentCalculator.java | 61 + .../lifecycle/internal/MojoDescriptorCreator.java | 309 + .../maven/lifecycle/internal/MojoExecutor.java | 394 ++ .../maven/lifecycle/internal/PhaseRecorder.java | 78 + .../lifecycle/internal/ProjectArtifactFactory.java | 38 + .../maven/lifecycle/internal/ProjectBuildList.java | 158 + .../maven/lifecycle/internal/ProjectIndex.java | 70 + .../maven/lifecycle/internal/ProjectSegment.java | 106 + .../lifecycle/internal/ReactorBuildStatus.java | 80 + .../maven/lifecycle/internal/ReactorContext.java | 83 + .../maven/lifecycle/internal/TaskSegment.java | 73 + .../maven/lifecycle/internal/builder/Builder.java | 47 + .../lifecycle/internal/builder/BuilderCommon.java | 199 + .../internal/builder/BuilderNotFoundException.java | 29 + .../multithreaded/ConcurrencyDependencyGraph.java | 153 + .../multithreaded/MultiThreadedBuilder.java | 197 + .../builder/multithreaded/ThreadOutputMuxer.java | 477 ++ .../singlethreaded/SingleThreadedBuilder.java | 65 + .../lifecycle/mapping/DefaultLifecycleMapping.java | 111 + .../apache/maven/lifecycle/mapping/Lifecycle.java | 83 + .../maven/lifecycle/mapping/LifecycleMapping.java | 39 + .../plugin/DefaultLifecycleBindingsInjector.java | 171 + .../maven/monitor/event/EventDispatcher.java | 37 + .../apache/maven/monitor/event/EventMonitor.java | 35 + .../apache/maven/plugin/BuildPluginManager.java | 54 + .../java/org/apache/maven/plugin/CacheUtils.java | 211 + .../plugin/CompoundMojoExecutionListener.java | 64 + .../CycleDetectedInPluginGraphException.java | 46 + .../maven/plugin/DebugConfigurationListener.java | 91 + .../maven/plugin/DefaultBuildPluginManager.java | 244 + .../maven/plugin/DefaultExtensionRealmCache.java | 170 + .../maven/plugin/DefaultPluginArtifactsCache.java | 218 + .../maven/plugin/DefaultPluginDescriptorCache.java | 219 + .../maven/plugin/DefaultPluginRealmCache.java | 219 + .../apache/maven/plugin/ExtensionRealmCache.java | 84 + .../plugin/InvalidPluginDescriptorException.java | 44 + .../maven/plugin/InvalidPluginException.java | 48 + .../org/apache/maven/plugin/LegacySupport.java | 59 + .../apache/maven/plugin/MavenPluginManager.java | 128 + .../apache/maven/plugin/MavenPluginValidator.java | 78 + .../org/apache/maven/plugin/MojoExecution.java | 237 + .../apache/maven/plugin/PluginArtifactsCache.java | 91 + .../maven/plugin/PluginConfigurationException.java | 74 + .../maven/plugin/PluginContainerException.java | 88 + .../apache/maven/plugin/PluginDescriptorCache.java | 58 + .../plugin/PluginDescriptorParsingException.java | 58 + .../maven/plugin/PluginExecutionException.java | 90 + .../maven/plugin/PluginIncompatibleException.java | 36 + .../apache/maven/plugin/PluginLoaderException.java | 124 + .../org/apache/maven/plugin/PluginManager.java | 82 + .../maven/plugin/PluginManagerException.java | 197 + .../maven/plugin/PluginNotFoundException.java | 58 + .../maven/plugin/PluginParameterException.java | 192 + .../plugin/PluginParameterExpressionEvaluator.java | 482 ++ .../org/apache/maven/plugin/PluginRealmCache.java | 85 + .../maven/plugin/PluginResolutionException.java | 47 + .../plugin/internal/DefaultLegacySupport.java | 74 + .../plugin/internal/DefaultMavenPluginManager.java | 946 +++ .../DefaultPluginDependenciesResolver.java | 256 + .../plugin/internal/DefaultPluginManager.java | 261 + .../maven/plugin/internal/PlexusUtilsInjector.java | 87 + .../internal/PluginDependenciesResolver.java | 71 + .../PluginDependencyResolutionListener.java | 158 + .../internal/ValidatingConfigurationListener.java | 97 + .../maven/plugin/internal/WagonExcluder.java | 109 + .../plugin/prefix/DefaultPluginPrefixRequest.java | 156 + .../prefix/NoPluginFoundForPrefixException.java | 65 + .../maven/plugin/prefix/PluginPrefixRequest.java | 115 + .../maven/plugin/prefix/PluginPrefixResolver.java | 42 + .../maven/plugin/prefix/PluginPrefixResult.java | 55 + .../internal/DefaultPluginPrefixResolver.java | 294 + .../prefix/internal/DefaultPluginPrefixResult.java | 90 + .../version/DefaultPluginVersionRequest.java | 165 + .../version/PluginVersionNotFoundException.java | 47 + .../maven/plugin/version/PluginVersionRequest.java | 115 + .../version/PluginVersionResolutionException.java | 107 + .../plugin/version/PluginVersionResolver.java | 42 + .../maven/plugin/version/PluginVersionResult.java | 47 + .../internal/DefaultPluginVersionResolver.java | 408 ++ .../internal/DefaultPluginVersionResult.java | 69 + .../DefaultDependencyResolutionRequest.java | 82 + .../project/DefaultDependencyResolutionResult.java | 111 + .../maven/project/DefaultMavenProjectHelper.java | 128 + .../project/DefaultModelBuildingListener.java | 155 + .../maven/project/DefaultProjectBuilder.java | 929 +++ .../project/DefaultProjectBuildingHelper.java | 295 + .../project/DefaultProjectBuildingRequest.java | 339 ++ .../project/DefaultProjectBuildingResult.java | 110 + .../DefaultProjectDependenciesResolver.java | 333 ++ .../maven/project/DefaultProjectRealmCache.java | 147 + .../project/DependencyResolutionException.java | 42 + .../maven/project/DependencyResolutionRequest.java | 81 + .../maven/project/DependencyResolutionResult.java | 80 + .../DuplicateArtifactAttachmentException.java | 64 + .../maven/project/DuplicateProjectException.java | 80 + .../apache/maven/project/ExtensionDescriptor.java | 88 + .../maven/project/ExtensionDescriptorBuilder.java | 168 + .../project/InvalidProjectVersionException.java | 59 + .../org/apache/maven/project/MavenProject.java | 1976 ++++++ .../apache/maven/project/MavenProjectHelper.java | 76 + .../org/apache/maven/project/ProjectBuilder.java | 98 + .../maven/project/ProjectBuildingException.java | 145 + .../maven/project/ProjectBuildingHelper.java | 81 + .../maven/project/ProjectBuildingRequest.java | 194 + .../maven/project/ProjectBuildingResult.java | 74 + .../maven/project/ProjectDependenciesResolver.java | 40 + .../apache/maven/project/ProjectModelResolver.java | 248 + .../apache/maven/project/ProjectRealmCache.java | 79 + .../org/apache/maven/project/ProjectSorter.java | 289 + .../apache/maven/project/ReactorModelCache.java | 103 + .../org/apache/maven/project/ReactorModelPool.java | 106 + .../maven/project/RepositorySessionDecorator.java | 36 + .../project/artifact/ActiveProjectArtifact.java | 403 ++ .../project/artifact/ArtifactWithDependencies.java | 33 + .../maven/project/artifact/AttachedArtifact.java | 185 + .../artifact/DefaultMavenMetadataCache.java | 347 ++ .../project/artifact/DefaultMetadataSource.java | 37 + .../InvalidDependencyVersionException.java | 55 + .../maven/project/artifact/MavenMetadataCache.java | 38 + .../project/artifact/MavenMetadataSource.java | 770 +++ .../maven/project/artifact/PluginArtifact.java | 94 + .../maven/project/artifact/ProjectArtifact.java | 100 + .../project/artifact/ProjectArtifactMetadata.java | 130 + .../apache/maven/project/path/PathTranslator.java | 41 + .../properties/internal/EnvironmentUtils.java | 70 + .../properties/internal/SystemProperties.java | 51 + .../repository/ArtifactDoesNotExistException.java | 34 + .../maven/repository/ArtifactTransferEvent.java | 343 ++ .../ArtifactTransferFailedException.java | 35 + .../maven/repository/ArtifactTransferListener.java | 36 + .../maven/repository/ArtifactTransferResource.java | 66 + .../DelegatingLocalArtifactRepository.java | 195 + .../maven/repository/LocalArtifactRepository.java | 33 + .../LocalRepositoryNotAccessibleException.java | 44 + .../apache/maven/repository/RepositorySystem.java | 164 + .../legacy/metadata/AbstractArtifactMetadata.java | 65 + .../ArtifactMetadataRetrievalException.java | 68 + .../legacy/metadata/ArtifactMetadataSource.java | 78 + .../metadata/DefaultMetadataResolutionRequest.java | 132 + .../legacy/metadata/MetadataResolutionRequest.java | 113 + .../legacy/metadata/ResolutionGroup.java | 83 + .../apache/maven/rtinfo/RuntimeInformation.java | 49 + .../rtinfo/internal/DefaultRuntimeInformation.java | 150 + .../maven/session/scope/internal/SessionScope.java | 169 + .../session/scope/internal/SessionScopeModule.java | 63 + .../settings/DefaultMavenSettingsBuilder.java | 158 + .../maven/settings/MavenSettingsBuilder.java | 81 + .../settings/SettingsConfigurationException.java | 63 + .../org/apache/maven/settings/SettingsUtils.java | 321 + .../apache/maven/toolchain/DefaultToolchain.java | 190 + .../maven/toolchain/DefaultToolchainManager.java | 140 + .../toolchain/DefaultToolchainManagerPrivate.java | 82 + .../maven/toolchain/DefaultToolchainsBuilder.java | 78 + .../toolchain/MisconfiguredToolchainException.java | 39 + .../apache/maven/toolchain/RequirementMatcher.java | 30 + .../maven/toolchain/RequirementMatcherFactory.java | 109 + .../java/org/apache/maven/toolchain/Toolchain.java | 46 + .../apache/maven/toolchain/ToolchainFactory.java | 44 + .../apache/maven/toolchain/ToolchainManager.java | 64 + .../maven/toolchain/ToolchainManagerPrivate.java | 58 + .../apache/maven/toolchain/ToolchainPrivate.java | 48 + .../apache/maven/toolchain/ToolchainsBuilder.java | 46 + .../building/DefaultToolchainsBuilder.java | 138 + .../building/DefaultToolchainsBuildingRequest.java | 63 + .../building/DefaultToolchainsBuildingResult.java | 66 + .../toolchain/building/ToolchainsBuilder.java | 41 + .../building/ToolchainsBuildingException.java | 93 + .../building/ToolchainsBuildingRequest.java | 64 + .../building/ToolchainsBuildingResult.java | 50 + .../toolchain/io/DefaultToolchainsReader.java | 115 + .../toolchain/io/ToolchainsParseException.java | 94 + .../maven/toolchain/io/ToolchainsReader.java | 83 + .../maven/toolchain/java/DefaultJavaToolChain.java | 55 + .../apache/maven/toolchain/java/JavaToolchain.java | 67 + .../maven/toolchain/java/JavaToolchainFactory.java | 127 + .../maven/toolchain/java/JavaToolchainImpl.java | 87 + .../toolchain/merge/MavenToolchainMerger.java | 103 + .../maven-core/src/main/mdo/extension.mdo | 65 + .../maven-core/src/main/mdo/toolchains.mdo | 231 + .../main/resources/META-INF/maven/extension.xml | 173 + .../META-INF/plexus/artifact-handlers.xml | 219 + .../main/resources/META-INF/plexus/components.xml | 134 + .../resources/META-INF/plexus/default-bindings.xml | 399 ++ .../org/apache/maven/messages/build.properties | 23 + .../org/apache/maven/messages/messages.properties | 34 + .../apache/maven/messages/messages_de.properties | 34 + .../apache/maven/messages/messages_el.properties | 33 + .../apache/maven/messages/messages_en.properties | 23 + .../apache/maven/messages/messages_es.properties | 33 + .../apache/maven/messages/messages_fr.properties | 33 + .../apache/maven/messages/messages_ja.properties | 34 + .../apache/maven/messages/messages_ko.properties | 34 + .../apache/maven/messages/messages_nl.properties | 33 + .../apache/maven/messages/messages_no.properties | 33 + .../apache/maven/messages/messages_pl.properties | 33 + .../maven/messages/messages_zh_CN.properties | 34 + .../org/apache/maven/project/standalone.xml | 30 + .../maven-core/src/site/apt/artifact-handlers.apt | 59 + .../src/site/apt/configuration-management.apt | 139 + .../src/site/apt/default-bindings.apt.vm | 67 + .../apt/getting-to-container-configured-mojos.apt | 102 + .../maven-core/src/site/apt/index.apt | 77 + .../maven-core/src/site/apt/inheritance.apt | 100 + .../maven-core/src/site/apt/lifecycles.apt.vm | 49 + .../maven-core/src/site/apt/offline-mode.apt | 269 + .../src/site/apt/plugin-execution-isolation.apt | 57 + .../apt/scripting-support/marmalade-support.apt | 196 + .../2.1-lifecycle-refactor-class-diagram.png | Bin 0 -> 38152 bytes .../2.1-lifecycle-refactor-sequence-diagram.png | Bin 0 -> 87383 bytes .../design/2.1-lifecycle-refactor.graffle | 4024 +++++++++++++ .../maven-core/src/site/site.xml | 42 + .../maven/AbstractCoreMavenComponentTestCase.java | 360 ++ .../java/org/apache/maven/DefaultMavenTest.java | 45 + .../maven/MavenLifecycleParticipantTest.java | 173 + .../src/test/java/org/apache/maven/MavenTest.java | 69 + .../maven/ProjectDependenciesResolverTest.java | 114 + .../artifact/handler/ArtifactHandlerTest.java | 89 + .../configuration/DefaultBeanConfiguratorTest.java | 148 + .../exception/DefaultExceptionHandlerTest.java | 60 + .../DefaultMavenExecutionRequestPopulatorTest.java | 62 + .../maven/execution/DefaultMavenExecutionTest.java | 52 + .../scope/internal/MojoExecutionScopeTest.java | 122 + .../graph/DefaultProjectDependencyGraphTest.java | 172 + .../maven/lifecycle/DefaultLifecyclesTest.java | 59 + .../lifecycle/DelegatingMojoExecutionListener.java | 75 + .../DelegatingProjectExecutionListener.java | 82 + .../lifecycle/EmptyLifecyclePluginAnalyzer.java | 77 + .../lifecycle/LifecycleExecutorSubModulesTest.java | 98 + .../maven/lifecycle/LifecycleExecutorTest.java | 553 ++ .../maven/lifecycle/MavenExecutionPlanTest.java | 77 + .../lifecycle/MojoExecutionXPathContainer.java | 72 + .../internal/BuildListCalculatorTest.java | 49 + .../lifecycle/internal/BuilderCommonTest.java | 76 + .../internal/ConcurrencyDependencyGraphTest.java | 94 + .../LifecycleExecutionPlanCalculatorTest.java | 82 + .../LifecycleTaskSegmentCalculatorImplTest.java | 57 + .../lifecycle/internal/PhaseRecorderTest.java | 49 + .../lifecycle/internal/ProjectBuildListTest.java | 42 + .../multithreaded/ThreadOutputMuxerTest.java | 167 + .../lifecycle/internal/stub/AboutTheStubs.html | 55 + .../internal/stub/BuildPluginManagerStub.java | 56 + .../internal/stub/CompletionServiceStub.java | 89 + .../internal/stub/DefaultLifecyclesStub.java | 63 + .../internal/stub/ExecutionEventCatapultStub.java | 42 + .../internal/stub/LifeCyclePluginAnalyzerStub.java | 74 + .../stub/LifecycleExecutionPlanCalculatorStub.java | 231 + .../stub/LifecycleTaskSegmentCalculatorStub.java | 89 + .../maven/lifecycle/internal/stub/LoggerStub.java | 110 + .../lifecycle/internal/stub/MojoExecutorStub.java | 70 + .../internal/stub/PluginPrefixResolverStub.java | 52 + .../internal/stub/PluginVersionResolverStub.java | 48 + .../stub/ProjectDependenciesResolverStub.java | 109 + .../internal/stub/ProjectDependencyGraphStub.java | 227 + .../stub/ProjectDependencyGraphStubTest.java | 61 + .../org/apache/maven/plugin/PluginManagerTest.java | 342 ++ .../maven/plugin/PluginParameterExceptionTest.java | 164 + .../PluginParameterExpressionEvaluatorTest.java | 447 ++ .../plugin/internal/DefaultLegacySupportTest.java | 74 + .../project/AbstractMavenProjectTestCase.java | 189 + .../project/DefaultMavenProjectBuilderTest.java | 193 + .../maven/project/EmptyLifecycleExecutor.java | 109 + .../maven/project/EmptyProjectBuildingHelper.java | 62 + .../project/ExtensionDescriptorBuilderTest.java | 101 + .../project/LegacyLocalRepositoryManager.java | 192 + .../org/apache/maven/project/MavenProjectTest.java | 197 + .../apache/maven/project/PomConstructionTest.java | 1878 ++++++ .../apache/maven/project/ProjectBuilderTest.java | 87 + .../apache/maven/project/ProjectSorterTest.java | 363 ++ .../apache/maven/project/TestMetadataSource.java | 51 + .../artifact/DefaultMavenMetadataCacheTest.java | 81 + .../project/artifact/MavenMetadataSourceTest.java | 183 + .../canonical/CanonicalProjectBuilderTest.java | 101 + .../maven/project/harness/PomTestWrapper.java | 121 + .../project/harness/Xpp3DomAttributeIterator.java | 89 + .../project/harness/Xpp3DomAttributePointer.java | 105 + .../maven/project/harness/Xpp3DomNodeIterator.java | 161 + .../maven/project/harness/Xpp3DomNodePointer.java | 155 + .../project/harness/Xpp3DomPointerFactory.java | 61 + .../maven/repository/LegacyRepositoryLayout.java | 89 + .../maven/repository/TestArtifactHandler.java | 83 + .../maven/repository/TestRepositoryConnector.java | 123 + .../repository/TestRepositoryConnectorFactory.java | 48 + .../maven/repository/TestRepositorySystem.java | 329 + .../internal/DefaultRuntimeInformationTest.java | 81 + .../settings/PomConstructionWithSettingsTest.java | 159 + .../apache/maven/settings/SettingsUtilsTest.java | 126 + .../DefaultToolchainManagerPrivateTest.java | 166 + .../toolchain/DefaultToolchainManagerTest.java | 153 + .../maven/toolchain/DefaultToolchainTest.java | 158 + .../toolchain/RequirementMatcherFactoryTest.java | 72 + .../building/DefaultToolchainsBuilderTest.java | 185 + .../building/ToolchainsBuildingExceptionTest.java | 73 + .../toolchain/merge/MavenToolchainMergerTest.java | 176 + .../cyclic-reference/module-a/pom.xml | 19 + .../cyclic-reference/module-b/pom.xml | 19 + .../default-maven/cyclic-reference/pom.xml | 14 + .../lifecycle-executor/mojo-configuration/pom.xml | 67 + .../lifecycle-executor/project-basic/pom.xml | 79 + .../pom.xml | 72 + .../java/org/apache/maven/lifecycle/test/App.java | 13 + .../org/apache/maven/lifecycle/test/AppTest.java | 38 + .../project-with-inheritance/pom.xml | 628 ++ .../project-with-multiple-executions/pom.xml | 112 + .../src/main/mdo/remote-resources.mdo | 61 + .../src/main/mdo/supplemental-model.mdo | 61 + .../pom.xml | 42 + .../pom.xml | 30 + .../module-a/pom.xml | 12 + .../module-b/pom.xml | 12 + .../pom.xml | 13 + .../mng-5003-plugin-realm-cache/pom.xml | 8 + .../pom.xml | 44 + .../tools.jar | 0 .../project-with-build-extensions-plugin/pom.xml | 31 + .../project-with-inheritance/pom.xml | 628 ++ .../project-with-plugin-classpath-ordering/pom.xml | 63 + .../sub/pom.xml | 77 + .../org/apache/maven/its/mng3906/a/0.1/a-0.1.jar | Bin 0 -> 5109 bytes .../org/apache/maven/its/mng3906/a/0.1/a-0.1.pom | 56 + .../org/apache/maven/its/mng3906/a/0.2/a-0.2.jar | Bin 0 -> 5111 bytes .../org/apache/maven/its/mng3906/a/0.2/a-0.2.pom | 56 + .../apache/maven/its/mng3906/a/maven-metadata.xml | 13 + .../org/apache/maven/its/mng3906/b/0.1/b-0.1.jar | Bin 0 -> 5108 bytes .../org/apache/maven/its/mng3906/b/0.1/b-0.1.pom | 56 + .../apache/maven/its/mng3906/b/maven-metadata.xml | 12 + .../org/apache/maven/its/mng3906/c/0.1/c-0.1.jar | Bin 0 -> 5109 bytes .../org/apache/maven/its/mng3906/c/0.1/c-0.1.pom | 56 + .../apache/maven/its/mng3906/c/maven-metadata.xml | 12 + .../org/apache/maven/its/mng3906/d/0.1/d-0.1.jar | Bin 0 -> 5108 bytes .../org/apache/maven/its/mng3906/d/0.1/d-0.1.pom | 56 + .../apache/maven/its/mng3906/d/maven-metadata.xml | 12 + .../org/apache/maven/its/mng3906/e/0.1/e-0.1.jar | Bin 0 -> 5107 bytes .../org/apache/maven/its/mng3906/e/0.1/e-0.1.pom | 56 + .../apache/maven/its/mng3906/e/maven-metadata.xml | 12 + .../sub/settings-template.xml | 55 + .../project-builder/it0063/jdk/jre/placeholder.txt | 1 + .../project-builder/it0063/jdk/lib/tools.jar | Bin 0 -> 345 bytes .../test/projects/project-builder/it0063/pom.xml | 55 + .../project-builder/mng-3023/consumer/pom.xml | 66 + .../mng-3023/dependency/dependency-1.jar | Bin 0 -> 345 bytes .../project-builder/mng-3023/dependency/pom.xml | 70 + .../test/projects/project-builder/mng-3023/pom.xml | 37 + .../it0063/jdk/jre/placeholder.txt | 1 + .../it0063/jdk/lib/tools.jar | Bin 0 -> 345 bytes .../project-dependencies-resolver/it0063/pom.xml | 55 + .../project-with-exclusions/pom.xml | 41 + .../org/apache/maven/its/a/0.1/a-0.1.jar | Bin 0 -> 1898 bytes .../org/apache/maven/its/a/0.1/a-0.1.pom | 41 + .../org/apache/maven/its/a/maven-metadata.xml | 12 + .../org/apache/maven/its/b/0.1/b-0.1.jar | Bin 0 -> 1936 bytes .../org/apache/maven/its/b/0.1/b-0.1.pom | 49 + .../org/apache/maven/its/b/maven-metadata.xml | 12 + .../maven-it-plugin/0.1/maven-it-plugin-0.1.jar | Bin 0 -> 13520 bytes .../maven-it-plugin/0.1/maven-it-plugin-0.1.pom | 70 + .../maven/its/plugins/maven-it-plugin/0.1/pom.xml | 70 + .../its/plugins/maven-it-plugin/maven-metadata.xml | 14 + .../apache/maven/its/plugins/maven-metadata.xml | 10 + .../maven-plugin-api/2.0/maven-plugin-api-2.0.jar | Bin 0 -> 10133 bytes .../maven-plugin-api/2.0/maven-plugin-api-2.0.pom | 23 + .../org/apache/maven/maven/2.0/maven-2.0.pom | 264 + .../0.1/maven-clean-plugin-0.1.jar | Bin 0 -> 6767 bytes .../0.1/maven-clean-plugin-0.1.pom | 70 + .../plugins/maven-clean-plugin/maven-metadata.xml | 14 + .../0.1/maven-compiler-plugin-0.1.jar | Bin 0 -> 8085 bytes .../0.1/maven-compiler-plugin-0.1.pom | 70 + .../maven-compiler-plugin/maven-metadata.xml | 14 + .../0.1/maven-deploy-plugin-0.1.jar | Bin 0 -> 6777 bytes .../0.1/maven-deploy-plugin-0.1.pom | 70 + .../plugins/maven-deploy-plugin/maven-metadata.xml | 14 + .../0.1/maven-install-plugin-0.1.jar | Bin 0 -> 6781 bytes .../0.1/maven-install-plugin-0.1.pom | 70 + .../maven-install-plugin/maven-metadata.xml | 14 + .../maven-jar-plugin/0.1/maven-jar-plugin-0.1.jar | Bin 0 -> 6790 bytes .../maven-jar-plugin/0.1/maven-jar-plugin-0.1.pom | 70 + .../plugins/maven-jar-plugin/maven-metadata.xml | 14 + .../org/apache/maven/plugins/maven-metadata.xml | 45 + .../0.1/maven-plugin-plugin-0.1.jar | Bin 0 -> 8007 bytes .../0.1/maven-plugin-plugin-0.1.pom | 70 + .../plugins/maven-plugin-plugin/maven-metadata.xml | 14 + .../0.1/maven-resources-plugin-0.1.jar | Bin 0 -> 8034 bytes .../0.1/maven-resources-plugin-0.1.pom | 70 + .../maven-resources-plugin/maven-metadata.xml | 14 + .../0.1/maven-surefire-plugin-0.1.jar | Bin 0 -> 6827 bytes .../0.1/maven-surefire-plugin-0.1.pom | 70 + .../maven-surefire-plugin/maven-metadata.xml | 14 + .../plexus/plexus-utils/1.1/plexus-utils-1.1.jar | Bin 0 -> 168568 bytes .../plexus/plexus-utils/1.1/plexus-utils-1.1.pom | 27 + .../artifact-id-inheritance/child/pom.xml | 32 + .../artifact-id-inheritance/pom.xml | 35 + .../basedir-aligned-interpolation/pom.xml | 60 + .../pom-with-unusual-name.xml | 39 + .../baseurl-interpolation/pom.xml | 38 + .../boolean-interpolation/pom.xml | 82 + .../build-extension-inheritance/pom.xml | 49 + .../build-extension-inheritance/sub/pom.xml | 75 + .../complete-model/w-parent/pom.xml | 31 + .../complete-model/w-parent/sub/pom.xml | 319 + .../complete-model/wo-parent/pom.xml | 313 + .../config-with-plugin-mng/pom.xml | 39 + .../consecutive_empty_elements/pom.xml | 14 + .../contributors-inheritance/child-2/pom.xml | 45 + .../contributors-inheritance/pom.xml | 35 + .../dependency-inheritance/maven-parent.xml | 31 + .../dependency-inheritance/pom.xml | 48 + .../dependency-inheritance/sub/pom.xml | 34 + .../pom.xml | 19 + .../sub/pom.xml | 17 + .../dependency-order/w-plugin-mngt/pom.xml | 68 + .../dependency-order/wo-plugin-mngt/pom.xml | 66 + .../dependency-scope-inheritance/pom.xml | 16 + .../dependency-scope-inheritance/sub/pom.xml | 19 + .../dependency-scope/pom.xml | 18 + .../dependency-scope/sub/pom.xml | 24 + .../developers-inheritance/child-2/pom.xml | 45 + .../developers-inheritance/pom.xml | 35 + .../distribution-management/pom.xml | 39 + .../dual-execution-ids/pom.xml | 28 + .../dual-execution-ids/sub/pom.xml | 43 + .../nexus-parent.xml | 29 + .../duplicate-exclusions-dependency/pom.xml | 33 + .../duplicate-exclusions-dependency/sub/pom.xml | 16 + .../empty-distMng-repo-url/pom.xml | 15 + .../resources-project-builder/empty-scm/pom.xml | 58 + .../equal-plugin-deps/pom.xml | 64 + .../equal-plugin-exec-ids/pom.xml | 83 + .../execution-configuration-join/pom.xml | 35 + .../execution-configuration-subcollections/pom.xml | 42 + .../execution-configuration/pom.xml | 58 + .../test/resources-project-builder/foo/sub/pom.xml | 418 ++ .../full-interpolation/pom.xml | 66 + .../pom.xml | 97 + .../sub/pom.xml | 84 + .../active-profile/pom.xml | 50 + .../active-profile/sub/pom.xml | 54 + .../no-profile/pom.xml | 41 + .../no-profile/sub/pom.xml | 45 + .../interpolation-cli-wins/pom.xml | 39 + .../jdk-activation/pom.xml | 105 + .../join-different-containers-same-id/pom.xml | 66 + .../licenses-inheritance/child-2/pom.xml | 47 + .../licenses-inheritance/pom.xml | 37 + .../limited-inheritance/child/pom.xml | 61 + .../limited-inheritance/pom.xml | 87 + .../mailing-lists-inheritance/child-2/pom.xml | 45 + .../mailing-lists-inheritance/pom.xml | 35 + .../managed-profile-dependency/pom.xml | 55 + .../managed-profile-dependency/sub/pom.xml | 55 + .../merged-filter-order/pom.xml | 44 + .../merged-filter-order/sub/pom.xml | 49 + .../w-plugin-mngt/pom.xml | 64 + .../w-plugin-mngt/sub/pom.xml | 64 + .../wo-plugin-mngt/pom.xml | 62 + .../wo-plugin-mngt/sub/pom.xml | 64 + .../w-plugin-mngt/pom.xml | 59 + .../w-plugin-mngt/sub/pom.xml | 59 + .../wo-plugin-mngt/pom.xml | 57 + .../wo-plugin-mngt/sub/pom.xml | 59 + .../merged-plugin-exec-order/w-plugin-mngt/pom.xml | 71 + .../w-plugin-mngt/sub/pom.xml | 71 + .../wo-plugin-mngt/pom.xml | 69 + .../wo-plugin-mngt/sub/pom.xml | 71 + .../resources-project-builder/micromailer/pom.xml | 124 + .../micromailer/spice-parent-9.pom | 103 + .../multiple-filters/pom.xml | 17 + .../multiple-repos/pom.xml | 44 + .../multiple-repos/sub/pom.xml | 45 + .../nested-build-dir-interpolation/pom.xml | 55 + .../parent-inheritance/child3.xml | 7 + .../parent-inheritance/pom.xml | 11 + .../parent-inheritance/sub/pom.xml | 9 + .../parent-interpolation/pom.xml | 16 + .../parent-interpolation/sub/pom.xml | 9 + .../parent-pom-packaging/pom.xml | 35 + .../parent-pom-packaging/sub/pom.xml | 40 + .../platform-file-separator/pom.xml | 40 + .../plugin-config-append/no-profile/pom.xml | 80 + .../no-profile/subproject/pom.xml | 70 + .../plugin-config-append/with-profile/pom.xml | 90 + .../with-profile/subproject/pom.xml | 80 + .../plugin-config-attributes/w-plugin-mngt/pom.xml | 62 + .../plugin-config-attributes/w-profile/pom.xml | 74 + .../wo-plugin-mngt/pom.xml | 53 + .../plugin-config-merging/child/pom.xml | 76 + .../plugin-config-merging/pom.xml | 72 + .../plugin-config-order/w-plugin-mngt/pom.xml | 68 + .../plugin-config-order/wo-plugin-mngt/pom.xml | 60 + .../plugin-config-properties/pom.xml | 30 + .../plugin-exec-config-order/w-plugin-mngt/pom.xml | 78 + .../wo-plugin-mngt/pom.xml | 70 + .../plugin-exec-goals-order/w-plugin-mngt/pom.xml | 66 + .../plugin-exec-goals-order/wo-plugin-mngt/pom.xml | 57 + .../plugin-exec-inheritance/pom.xml | 75 + .../plugin-exec-inheritance/w-merge/pom.xml | 48 + .../plugin-exec-inheritance/wo-merge/pom.xml | 43 + .../pom.xml | 56 + .../sub/pom.xml | 59 + .../plugin-exec-merging-wo-version/pom.xml | 55 + .../plugin-exec-merging-wo-version/sub/pom.xml | 58 + .../plugin-exec-merging/w-plugin-mngt/pom.xml | 58 + .../plugin-exec-merging/w-plugin-mngt/sub/pom.xml | 59 + .../plugin-exec-merging/wo-plugin-mngt/pom.xml | 56 + .../plugin-exec-merging/wo-plugin-mngt/sub/pom.xml | 59 + .../plugin-exec-order-and-default-exec/pom.xml | 71 + .../plugin-exec-order-with-lifecycle/pom.xml | 52 + .../plugin-exec-order/w-plugin-mngt/pom.xml | 76 + .../plugin-exec-order/wo-plugin-mngt/pom.xml | 67 + .../plugin-exec-w-and-wo-id/w-plugin-mngt/pom.xml | 72 + .../plugin-exec-w-and-wo-id/wo-plugin-mngt/pom.xml | 64 + .../plugin-inheritance-merge-order/pom.xml | 67 + .../plugin-inheritance-merge-order/sub/pom.xml | 72 + .../plugin-inheritance-order/child/pom.xml | 51 + .../plugin-inheritance-order/pom.xml | 68 + .../plugin-inheritance-simple/pom.xml | 17 + .../plugin-inheritance-simple/sub/pom.xml | 20 + .../plugin-injection-merge-order/pom.xml | 133 + .../plugin-management-dependencies/pom.xml | 25 + .../plugin-management-dependencies/sub/pom.xml | 25 + .../plugin-management-duplicate/pom.xml | 39 + .../plugin-management-duplicate/sub/pom.xml | 64 + .../child/pom.xml | 53 + .../plugin-management-for-implicit-plugin/pom.xml | 61 + .../plugin-management-inheritance/pom.xml | 64 + .../plugin-merge-simple/pom.xml | 17 + .../plugin-order/nexus-parent.xml | 19 + .../resources-project-builder/plugin-order/pom.xml | 28 + .../pluginmanagement-inherited/pom.xml | 18 + .../pluginmanagement-inherited/sub/pom.xml | 17 + .../pom-encoding/latin-1/pom.xml | 36 + .../pom-encoding/utf-8/pom.xml | 36 + .../pom-inheritance/pom.xml | 188 + .../pom-inheritance/sub/pom.xml | 36 + .../prerequisites-inheritance/child/pom.xml | 36 + .../prerequisites-inheritance/pom.xml | 33 + .../profile-default-deactivation/pom.xml | 35 + .../profile-dependencies-multiple-profiles/pom.xml | 81 + .../profile-injected-dependencies/pom.xml | 75 + .../profile-injection-order/pom.xml | 68 + .../profile-module-inheritance/pom.xml | 18 + .../profile-module-inheritance/sub/pom.xml | 12 + .../profile-module/pom.xml | 24 + .../profile-plugin-mng-dependencies/pom.xml | 77 + .../profile-plugin-mng-dependencies/sub/pom.xml | 62 + .../profile-plugins/pom.xml | 52 + .../profile-properties-interpolation/pom.xml | 54 + .../properties-inheritance/pom.xml | 34 + .../properties-inheritance/sub/pom.xml | 40 + .../properties-no-duplication/pom.xml | 12 + .../properties-no-duplication/sub/pom.xml | 17 + .../repo-inheritance/pom.xml | 64 + .../reporting-interpolation/pom.xml | 6 + .../reporting-plugin-config/pom.xml | 51 + .../reporting-plugin-config/sub/pom.xml | 48 + .../jetty-parent.xml | 37 + .../single-configuration-inheritance/pom.xml | 41 + .../sytem-property-interpolation/pom.xml | 30 + .../resources-project-builder/unc-path/pom.xml | 41 + .../resources-project-builder/unc-path/sub/pom.xml | 57 + .../dep-mngt-in-profile/pom.xml | 49 + .../unique-dependency-key/dep-mngt/pom.xml | 44 + .../unique-dependency-key/deps-in-profile/pom.xml | 47 + .../unique-dependency-key/deps/pom.xml | 42 + .../artifact-repo-in-profile/pom.xml | 51 + .../unique-repo-id/artifact-repo/pom.xml | 45 + .../unique-repo-id/plugin-repo-in-profile/pom.xml | 51 + .../unique-repo-id/plugin-repo/pom.xml | 45 + .../child/pom.xml | 104 + .../unprefixed-expression-interpolation/pom.xml | 36 + .../url-append/child/pom.xml | 64 + .../url-append/parent/pom.xml | 53 + .../url-inheritance/another-parent/pom.xml | 36 + .../url-inheritance/another-parent/sub/pom.xml | 35 + .../url-inheritance/pom.xml | 74 + .../url-inheritance/sub/pom.xml | 35 + .../url-no-decoding/pom.xml | 64 + .../xml-coalesce-text/pom.xml | 567 ++ .../xml-markup-interpolation/pom.xml | 41 + .../xml-whitespace/pom.xml | 43 + .../xml-whitespace/sub/pom.xml | 49 + .../test/resources-settings/repositories/pom.xml | 29 + .../resources-settings/repositories/settings.xml | 55 + .../resources-settings/settings-no-pom/pom.xml | 13 + .../settings-no-pom/settings.xml | 20 + .../test-pom-and-settings-interpolation/pom.xml | 78 + .../settings.xml | 35 + .../org.apache.maven/maven-core/pom.properties | 1 + .../test/resources/META-INF/plexus/components.xml | 113 + .../src/test/resources/canonical-pom.xml | 55 + .../test/resources/dependencyManagement-pom.xml | 65 + .../test/resources/distributionManagement-pom.xml | 44 + .../t01/maven-test/jars/maven-test-a-1.0.jar | 1 + .../t01/maven-test/jars/maven-test-a-1.1.jar | 1 + .../t01/maven-test/jars/maven-test-b-1.0.jar | 1 + .../t01/maven-test/jars/maven-test-b-1.1.jar | 1 + .../t01/maven-test/jars/maven-test-c-1.0.jar | 1 + .../t01/maven-test/jars/maven-test-c-1.1.jar | 1 + .../t01/maven-test/jars/maven-test-d-1.0.jar | 1 + .../t01/maven-test/jars/maven-test-d-1.1.jar | 1 + .../t01/maven-test/jars/maven-test-d-1.2.jar | 1 + .../t01/maven-test/poms/maven-test-a-1.0.pom | 14 + .../t01/maven-test/poms/maven-test-a-1.1.pom | 14 + .../t01/maven-test/poms/maven-test-b-1.0.pom | 7 + .../t01/maven-test/poms/maven-test-b-1.1.pom | 7 + .../t01/maven-test/poms/maven-test-c-1.0.pom | 7 + .../t01/maven-test/poms/maven-test-c-1.1.pom | 7 + .../t01/maven-test/poms/maven-test-d-1.0.pom | 7 + .../t01/maven-test/poms/maven-test-d-1.1.pom | 7 + .../t01/maven-test/poms/maven-test-d-1.2.pom | 7 + .../test/resources/imports-repo/t01/p0/p1/pom.xml | 45 + .../test/resources/imports-repo/t01/p0/p2/pom.xml | 56 + .../test/resources/imports-repo/t01/p0/p3/pom.xml | 59 + .../test/resources/imports-repo/t01/p0/p4/pom.xml | 67 + .../src/test/resources/imports-repo/t01/p0/pom.xml | 26 + .../src/test/resources/local-repo/marker.txt | 1 + .../maven-test/jars/maven-test-a-1.0.jar | 1 + .../maven-test/jars/maven-test-b-1.0.jar | 1 + .../maven-test/jars/maven-test-c-1.0.jar | 1 + .../maven-test/jars/maven-test-d-1.0.jar | 1 + .../maven-test/poms/maven-test-a-1.0.pom | 23 + .../maven-test/poms/maven-test-b-1.0.pom | 23 + .../maven-test/poms/maven-test-c-1.0.pom | 16 + .../maven-test/poms/maven-test-d-1.1.pom | 7 + .../maven-test/poms/maven-test-d-1.2.pom | 7 + .../jars/maven-snapshot-a-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-a-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../jars/maven-snapshot-b-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-b-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../jars/maven-snapshot-e-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-e-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../poms/maven-test-snapshot-resolving-1.0.pom | 49 + .../apache/maven/MavenLifecycleParticipantTest.xml | 9 + .../apache/maven/execution/test-extension-1.jar | Bin 0 -> 4208 bytes .../junit/junit/3.8.1/junit-3.8.1.jar | Bin 0 -> 121070 bytes .../junit/junit/3.8.1/junit-3.8.1.jar.md5 | 1 + .../junit/junit/3.8.1/junit-3.8.1.jar.sha1 | 1 + .../junit/junit/3.8.1/junit-3.8.1.pom | 29 + .../junit/junit/3.8.1/junit-3.8.1.pom.md5 | 1 + .../junit/junit/3.8.1/junit-3.8.1.pom.sha1 | 1 + .../org/apache/apache/3/apache-3.pom | 82 + .../org/apache/apache/3/apache-3.pom.md5 | 1 + .../org/apache/apache/3/apache-3.pom.sha1 | 1 + .../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar | Bin 0 -> 163984 bytes .../maven-artifact-3.0-SNAPSHOT.jar.md5 | 1 + .../maven-artifact-3.0-SNAPSHOT.jar.sha1 | 1 + .../3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom | 112 + .../maven-artifact-3.0-SNAPSHOT.pom.md5 | 1 + .../maven-artifact-3.0-SNAPSHOT.pom.sha1 | 1 + .../test/test-extension/1/test-extension-1.jar | Bin 0 -> 4208 bytes .../test/test-extension/1/test-extension-1.pom | 73 + .../test/test-extension/1/test-extension-1.pom.md5 | 1 + .../test-extension/1/test-extension-1.pom.sha1 | 1 + .../1/test-lifecycle-and-artifactHandler-1.jar | Bin 0 -> 2582 bytes .../1/test-lifecycle-and-artifactHandler-1.pom | 44 + .../1/test-lifecycle-and-artifactHandler-1.pom.md5 | 1 + .../test-lifecycle-and-artifactHandler-1.pom.sha1 | 1 + .../apache/maven/maven-parent/4/maven-parent-4.pom | 304 + .../maven/maven-parent/4/maven-parent-4.pom.md5 | 1 + .../maven/maven-parent/4/maven-parent-4.pom.sha1 | 1 + .../apache/maven/maven-parent/5/maven-parent-5.pom | 466 ++ .../maven/maven-parent/5/maven-parent-5.pom.md5 | 1 + .../maven/maven-parent/5/maven-parent-5.pom.sha1 | 1 + .../1.0-beta-2/wagon-provider-api-1.0-beta-2.jar | Bin 0 -> 46326 bytes .../wagon-provider-api-1.0-beta-2.jar.md5 | 1 + .../wagon-provider-api-1.0-beta-2.jar.sha1 | 1 + .../1.0-beta-2/wagon-provider-api-1.0-beta-2.pom | 21 + .../wagon-provider-api-1.0-beta-2.pom.md5 | 1 + .../wagon-provider-api-1.0-beta-2.pom.sha1 | 1 + .../wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom | 170 + .../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.md5 | 1 + .../wagon/1.0-beta-2/wagon-1.0-beta-2.pom.sha1 | 1 + .../plexus-active-collections-1.0-beta-1.jar | Bin 0 -> 15961 bytes .../plexus-active-collections-1.0-beta-1.jar.md5 | 1 + .../plexus-active-collections-1.0-beta-1.jar.sha1 | 1 + .../plexus-active-collections-1.0-beta-1.pom | 51 + .../plexus-active-collections-1.0-beta-1.pom.md5 | 1 + .../plexus-active-collections-1.0-beta-1.pom.sha1 | 1 + .../plexus-classworlds-1.2-alpha-10.jar | Bin 0 -> 42472 bytes .../plexus-classworlds-1.2-alpha-10.jar.md5 | 1 + .../plexus-classworlds-1.2-alpha-10.jar.sha1 | 1 + .../plexus-classworlds-1.2-alpha-10.pom | 94 + .../plexus-classworlds-1.2-alpha-10.pom.md5 | 1 + .../plexus-classworlds-1.2-alpha-10.pom.sha1 | 1 + .../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar | Bin 0 -> 42636 bytes .../plexus-classworlds-1.2-alpha-7.jar.md5 | 1 + .../plexus-classworlds-1.2-alpha-7.jar.sha1 | 1 + .../1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom | 78 + .../plexus-classworlds-1.2-alpha-7.pom.md5 | 1 + .../plexus-classworlds-1.2-alpha-7.pom.sha1 | 1 + .../plexus-component-api-1.0-alpha-16.jar | Bin 0 -> 33149 bytes .../plexus-component-api-1.0-alpha-16.jar.md5 | 1 + .../plexus-component-api-1.0-alpha-16.jar.sha1 | 1 + .../plexus-component-api-1.0-alpha-16.pom | 63 + .../plexus-component-api-1.0-alpha-16.pom.md5 | 1 + .../plexus-component-api-1.0-alpha-16.pom.sha1 | 1 + .../plexus-component-api-1.0-alpha-32.jar | Bin 0 -> 36108 bytes .../plexus-component-api-1.0-alpha-32.jar.md5 | 1 + .../plexus-component-api-1.0-alpha-32.jar.sha1 | 1 + .../plexus-component-api-1.0-alpha-32.pom | 61 + .../plexus-component-api-1.0-alpha-32.pom.md5 | 1 + .../plexus-component-api-1.0-alpha-32.pom.sha1 | 1 + .../1.1.6/plexus-components-1.1.6.pom | 60 + .../1.1.6/plexus-components-1.1.6.pom.md5 | 1 + .../1.1.6/plexus-components-1.1.6.pom.sha1 | 1 + .../plexus-container-default-1.0-alpha-16.jar | Bin 0 -> 210679 bytes .../plexus-container-default-1.0-alpha-16.jar.md5 | 1 + .../plexus-container-default-1.0-alpha-16.jar.sha1 | 1 + .../plexus-container-default-1.0-alpha-16.pom | 56 + .../plexus-container-default-1.0-alpha-16.pom.md5 | 1 + .../plexus-container-default-1.0-alpha-16.pom.sha1 | 1 + .../plexus-container-default-1.0-alpha-32.jar | Bin 0 -> 238880 bytes .../plexus-container-default-1.0-alpha-32.jar.md5 | 1 + .../plexus-container-default-1.0-alpha-32.jar.sha1 | 1 + .../plexus-container-default-1.0-alpha-32.pom | 98 + .../plexus-container-default-1.0-alpha-32.pom.md5 | 1 + .../plexus-container-default-1.0-alpha-32.pom.sha1 | 1 + .../plexus-containers-1.0-alpha-16.pom | 49 + .../plexus-containers-1.0-alpha-16.pom.md5 | 1 + .../plexus-containers-1.0-alpha-16.pom.sha1 | 1 + .../plexus-containers-1.0-alpha-32.pom | 49 + .../plexus-containers-1.0-alpha-32.pom.md5 | 1 + .../plexus-containers-1.0-alpha-32.pom.sha1 | 1 + .../plexus/plexus-utils/1.1/plexus-utils-1.1.jar | Bin 0 -> 168568 bytes .../plexus-utils/1.1/plexus-utils-1.1.jar.md5 | 1 + .../plexus-utils/1.1/plexus-utils-1.1.jar.sha1 | 1 + .../plexus/plexus-utils/1.1/plexus-utils-1.1.pom | 27 + .../plexus-utils/1.1/plexus-utils-1.1.pom.md5 | 1 + .../plexus-utils/1.1/plexus-utils-1.1.pom.sha1 | 1 + .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar | Bin 0 -> 205043 bytes .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.md5 | 1 + .../plexus-utils/1.4.5/plexus-utils-1.4.5.jar.sha1 | 1 + .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom | 61 + .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.md5 | 1 + .../plexus-utils/1.4.5/plexus-utils-1.4.5.pom.sha1 | 1 + .../plexus/plexus/1.0.10/plexus-1.0.10.pom | 273 + .../plexus/plexus/1.0.10/plexus-1.0.10.pom.md5 | 1 + .../plexus/plexus/1.0.10/plexus-1.0.10.pom.sha1 | 1 + .../plexus/plexus/1.0.11/plexus-1.0.11.pom | 308 + .../plexus/plexus/1.0.11/plexus-1.0.11.pom.md5 | 1 + .../plexus/plexus/1.0.11/plexus-1.0.11.pom.sha1 | 1 + .../codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom | 205 + .../plexus/plexus/1.0.4/plexus-1.0.4.pom.md5 | 1 + .../plexus/plexus/1.0.4/plexus-1.0.4.pom.sha1 | 1 + .../codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom | 259 + .../plexus/plexus/1.0.8/plexus-1.0.8.pom.md5 | 1 + .../plexus/plexus/1.0.8/plexus-1.0.8.pom.sha1 | 1 + .../codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom | 257 + .../plexus/plexus/1.0.9/plexus-1.0.9.pom.md5 | 1 + .../plexus/plexus/1.0.9/plexus-1.0.9.pom.sha1 | 1 + .../extension/test-extension-repo/repo-marker.txt | 1 + .../maven/lifecycle/LifecycleExecutorTest.xml | 9 + .../resources/org/apache/maven/lifecycle/pom.xml | 628 ++ .../org/apache/maven/plugin/PluginManagerTest.xml | 9 + .../maven/project/AbstractMavenProjectTestCase.xml | 9 + .../apache/maven/project/PomConstructionTest.xml | 13 + .../maven/project/workspace/buildFromFile/pom.xml | 8 + .../tests/project-caching/1/project-caching-1.pom | 8 + .../tests/project-caching/maven-metadata-local.xml | 11 + .../project/workspace/buildModelLineage/pom.xml | 7 + .../resolveParentPom/childAndParent/child/pom.xml | 10 + .../resolveParentPom/childAndParent/pom.xml | 7 + .../project/workspace/resolveParentPom/pom.xml | 10 + .../settings/PomConstructionWithSettingsTest.xml | 9 + .../org/apache/maven/toolchain/global.xml | 35 + .../toolchain/model/toolchains-jdks-extend.xml | 45 + .../toolchain/model/toolchains-jdks-extra.xml | 45 + .../maven/toolchain/model/toolchains-jdks.xml | 43 + .../resources/org/apache/maven/toolchain/user.xml | 35 + .../plexus/plexus-utils/1.1/plexus-utils-1.1.jar | Bin 0 -> 168568 bytes .../plexus-utils/1.1/plexus-utils-1.1.jar.sha1 | 1 + .../plexus/plexus-utils/1.1/plexus-utils-1.1.pom | 27 + .../plexus-utils/1.1/plexus-utils-1.1.pom.sha1 | 1 + .../maven-core/src/test/resources/pom.xml | 52 + .../project-dynamism/plugin-level-dep.pom.xml | 24 + .../test/resources/project-dynamism/pom-interp.xml | 28 + .../resources/project-dynamism/pom-relative.xml | 36 + .../src/test/resources/project-dynamism/pom.xml | 36 + .../src/test/resources/projects/bad-dependency.xml | 27 + .../src/test/resources/projects/bad-project.xml | 20 + ...oject-which-needs-directory-alignment-child.xml | 33 + .../project-which-needs-directory-alignment.xml | 135 + ...oject-which-needs-directory-alignment-child.xml | 29 + .../projects/build-path-expression-pom.xml | 14 + .../src/test/resources/projects/build.properties | 18 + .../child-which-inherits-from-super-model.xml | 28 + .../resources/projects/child-with-bogus-parent.xml | 29 + .../src/test/resources/projects/child.xml | 33 + .../projects/duplicate-plugins-merged-pom.xml | 48 + .../resources/projects/fully-populated-child.xml | 168 + .../grandchild-check/child/grandchild/pom.xml | 10 + .../projects/grandchild-check/child/pom.xml | 13 + .../resources/projects/grandchild-check/pom.xml | 7 + ...pom-resolves-from-property-based-repository.xml | 31 + .../projects/modelsource/module01/pom.xml | 12 + .../test/resources/projects/modelsource/pom.xml | 13 + .../src/test/resources/projects/project.xml | 162 + .../projects/versionless-managed-dependency.xml | 24 + .../maven-test/jars/maven-test-b-1.0.jar | Bin 0 -> 18874 bytes .../maven-test/jars/maven-test-b-1.0.jar.md5 | 1 + .../maven-test/poms/maven-test-b-1.0.pom | 21 + .../jars/maven-snapshot-a-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-a-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../jars/maven-snapshot-b-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-b-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../jars/maven-snapshot-c-1.0-SNAPSHOT.jar | 1 + ...en-snapshot-c-1.0-SNAPSHOT.jar.snapshot-version | 1 + .../maven-test/jars/maven-test-z-1.0.jar | 1 + .../resources/withActiveByDefaultProfile-pom.xml | 40 + .../apache-maven-3.3.3/maven-embedder/pom.xml | 144 + .../src/examples/simple-project/pom.xml | 39 + .../src/examples/simple-project/settings.xml | 26 + .../main/java/org/apache/maven/embedder/App.java | 28 + .../java/org/apache/maven/embedder/AppTest.java | 53 + .../main/java/org/apache/maven/cli/CLIManager.java | 271 + .../org/apache/maven/cli/CLIReportingUtils.java | 205 + .../main/java/org/apache/maven/cli/CliRequest.java | 120 + .../main/java/org/apache/maven/cli/MavenCli.java | 1610 +++++ .../cli/configuration/ConfigurationProcessor.java | 28 + .../SettingsXmlConfigurationProcessor.java | 290 + .../maven/cli/event/DefaultEventSpyContext.java | 38 + .../maven/cli/event/ExecutionEventLogger.java | 381 ++ .../internal/BootstrapCoreExtensionManager.java | 143 + .../maven/cli/logging/BaseSlf4jConfiguration.java | 45 + .../maven/cli/logging/Slf4jConfiguration.java | 47 + .../cli/logging/Slf4jConfigurationFactory.java | 91 + .../org/apache/maven/cli/logging/Slf4jLogger.java | 145 + .../maven/cli/logging/Slf4jLoggerManager.java | 111 + .../maven/cli/logging/Slf4jStdoutLogger.java | 306 + .../cli/logging/impl/Log4j2Configuration.java | 59 + .../cli/logging/impl/LogbackConfiguration.java | 61 + .../cli/logging/impl/Slf4jSimpleConfiguration.java | 63 + .../impl/UnsupportedSlf4jBindingConfiguration.java | 72 + .../transfer/AbstractMavenTransferListener.java | 90 + .../transfer/BatchModeMavenTransferListener.java | 32 + .../cli/transfer/ConsoleMavenTransferListener.java | 133 + .../cli/transfer/QuietMavenTransferListener.java | 31 + .../cli/transfer/Slf4jMavenTransferListener.java | 97 + .../src/main/java/org/slf4j/MavenSlf4jFriend.java | 35 + .../org/slf4j/impl/MavenSlf4jSimpleFriend.java | 40 + .../src/main/mdo/core-extensions.mdo | 88 + .../src/main/resources/META-INF/MANIFEST.MF | 7 + .../META-INF/maven/slf4j-configuration.properties | 22 + .../maven-embedder/src/site/apt/cli.apt.vm | 28 + .../maven-embedder/src/site/apt/index.apt.vm | 42 + .../maven-embedder/src/site/apt/logging.apt | 112 + .../maven-embedder/src/site/site.xml | 40 + .../src/test/embedder-test-project/pom.xml | 48 + .../src/main/java/org/apache/maven/App.java | 13 + .../src/test/java/org/apache/maven/AppTest.java | 38 + .../aggregate-mojo-failure/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 36 + .../aggregate-mojo-failure/project/pom.xml | 25 + .../bad-build-plan/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 35 + .../bad-build-plan/project/pom.xml | 25 + .../bad-dep-version/pom.xml | 33 + .../test-maven-ext/1/test-maven-ext-1.pom | 34 + .../bad-ext-direct-deps/project/pom.xml | 35 + .../1/bad-ext-plugin-dep-ver-maven-plugin-1.jar | Bin 0 -> 3166 bytes .../1/bad-ext-plugin-dep-ver-maven-plugin-1.pom | 55 + .../bad-ext-plugin-dep-ver/plugin/pom.xml | 57 + .../src/main/java/org/plugin/TestPlugin.java | 33 + .../bad-ext-plugin-dep-ver/project/pom.xml | 37 + .../1/bad-ext-plugin-maven-ver-maven-plugin-1.jar | Bin 0 -> 3166 bytes .../1/bad-ext-plugin-maven-ver-maven-plugin-1.pom | 54 + .../maven-metadata-local.xml | 12 + .../bad-ext-plugin-maven-ver/plugin/pom.xml | 57 + .../src/main/java/org/plugin/TestPlugin.java | 33 + .../bad-ext-plugin-maven-ver/project/pom.xml | 37 + .../bad-maven-version/pom.xml | 11 + .../bad-mg-dep-version/pom.xml | 35 + .../bad-non-dep-version/pom.xml | 35 + .../bad-profile-repo/pom.xml | 7 + .../bad-profile-repo/profiles.xml | 18 + .../config-rdonly-mojo-param/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 39 + .../config-rdonly-mojo-param/project/pom.xml | 47 + .../deploy-repo-creation-err/pom.xml | 41 + .../duplicated-attachments/plugin/pom.xml | 54 + .../src/main/java/org/plugin/TestPlugin.java | 50 + .../duplicated-attachments/project/pom.xml | 25 + .../1/err-loading-plugin-maven-plugin-1.jar | Bin 0 -> 3166 bytes .../1/err-loading-plugin-maven-plugin-1.pom | 55 + .../err-loading-plugin/project/pom.xml | 45 + .../org/apache/maven/errortest/dep/1/dep-1.pom | 16 + .../1/err-resolving-ext-plugin-maven-plugin-1.jar | Bin 0 -> 3166 bytes .../1/err-resolving-ext-plugin-maven-plugin-1.pom | 60 + .../err-resolving-ext-plugin/project/pom.xml | 18 + .../org/apache/maven/errortest/dep/1/dep-1.pom | 16 + .../err-resolving-project-dep/project/pom.xml | 27 + .../apache/maven/test/error/mojoFailure/App.java | 13 + .../maven/test/error/mojoFailure/AppTest.java | 38 + .../test-maven-ext-dep/1/test-maven-ext-dep-1.pom | 26 + .../test-maven-ext/1/test-maven-ext-1.pom | 34 + .../ext-deps-resolve-err/project/pom.xml | 35 + .../ext-plugin-artifact-missing-maven-plugin-1.pom | 55 + .../ext-plugin-artifact-missing/project/pom.xml | 37 + .../ext-plugin-realm-error/plugin/pom.xml | 49 + .../src/main/java/org/plugin/ComponentOne.java | 8 + .../src/main/java/org/plugin/ComponentTwo.java | 8 + .../src/main/java/org/plugin/TestPlugin.java | 39 + .../main/resources/META-INF/plexus/components.xml | 25 + .../ext-plugin-realm-error/project/pom.xml | 36 + .../1/ext-plugin-version-err-maven-plugin-1.jar | Bin 0 -> 3166 bytes .../1/ext-plugin-version-err-maven-plugin-1.pom | 50 + .../maven-metadata-local.xml | 10 + .../ext-plugin-version-err/plugin/pom.xml | 57 + .../src/main/java/org/plugin/TestPlugin.java | 33 + .../ext-plugin-version-err/project/pom.xml | 36 + .../ext-realm-error/ext/pom.xml | 38 + .../ext/src/main/java/org/ext/App.java | 13 + .../main/resources/META-INF/plexus/components.xml | 1 + .../ext-realm-error/project/pom.xml | 35 + .../interp-from-model/pom.xml | 7 + .../local-repo/org/test/bad-pom/1/bad-pom-1.pom | 9 + .../interp-from-project/project/pom.xml | 22 + .../load-extern-profiles-ioex/pom.xml | 7 + .../load-extern-profiles-xex/pom.xml | 7 + .../load-extern-profiles-xex/profiles.xml | 4 + .../missing-direct-invoke-mojo/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 36 + .../missing-module-pom/child1/pom.xml | 19 + .../child1/src/main/java/org/test/App.java | 13 + .../child1/src/test/java/org/test/AppTest.java | 38 + .../missing-module-pom/pom.xml | 13 + .../missing-parent-pom/pom.xml | 11 + .../missing-req-mojo-param/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 38 + .../missing-req-mojo-param/project/pom.xml | 25 + .../mojo-config-error/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 33 + .../src/main/resources/META-INF/maven/plugin.xml | 38 + .../mojo-config-error/project/pom.xml | 45 + .../mojo-exec-err/plugin/pom.xml | 49 + .../src/main/java/org/plugin/TestPlugin.java | 33 + .../mojo-exec-err/project/pom.xml | 26 + .../mojo-lookup-err/plugin/pom.xml | 54 + .../src/main/java/org/plugin/TestPlugin.java | 42 + .../mojo-lookup-err/project/pom.xml | 25 + .../parent-parse-ioex/child/pom.xml | 10 + .../parent-parse-ioex/pom.xml | 0 .../parent-parse-xex/child/pom.xml | 10 + .../parent-parse-xex/pom.xml | 7 + .../profile-activator-err/pom.xml | 39 + .../profile-activator-lookup-err/ext/pom.xml | 38 + .../ext/src/main/java/org/ext/App.java | 13 + .../main/resources/META-INF/plexus/components.xml | 16 + .../profile-activator-lookup-err/project/pom.xml | 46 + .../project-collision/mod1/pom.xml | 7 + .../project-collision/mod2/pom.xml | 7 + .../project-collision/pom.xml | 12 + .../project-cycle/dep/pom.xml | 12 + .../error-reporting-projects/project-cycle/pom.xml | 19 + .../project-dep-missing/pom.xml | 22 + .../apache/maven/test/error/mojoFailure/App.java | 13 + .../maven/test/error/mojoFailure/AppTest.java | 38 + .../project-mojo-failure/pom.xml | 17 + .../apache/maven/test/error/mojoFailure/App.java | 14 + .../maven/test/error/mojoFailure/AppTest.java | 38 + .../project-parse-xex/pom.xml | 25 + .../project-validation/pom.xml | 13 + .../repo-creation-err/pom.xml | 41 + .../test/eventing-projects/read-with-deps/pom.xml | 15 + .../read-with-deps/repo/tests/dep/1/dep-1.pom | 6 + .../eventing-projects/simple-read-project/pom.xml | 6 + .../test/extensions/META-INF/plexus/components.xml | 28 + .../java/org/apache/maven/cli/CLIManagerTest.java | 108 + .../apache/maven/cli/CLIReportingUtilsTest.java | 40 + .../java/org/apache/maven/cli/MavenCliTest.java | 110 + .../src/test/plugin-version-references/jar-pom.xml | 32 + .../plugin-version-references/maven-plugin-pom.xml | 36 + .../bad-module-non-recursive/badmodule/pom.xml | 14 + .../bad-module-non-recursive/goodmodule/pom.xml | 14 + .../test/projects/bad-module-non-recursive/pom.xml | 14 + .../test/projects/config-illegal/.mvn/maven.config | 1 + .../src/test/projects/config/.mvn/maven.config | 2 + .../src/test/projects/invalid-goal/pom.xml | 49 + .../project/pom.xml | 13 + .../src/main/java/org/codehaus/m2eclipse/App.java | 13 + .../test/java/org/codehaus/m2eclipse/AppTest.java | 38 + .../parent/1.0-SNAPSHOT/maven-metadata-company.xml | 11 + .../parent/1.0-SNAPSHOT/parent-1.0-SNAPSHOT.pom | 18 + .../m2eclipse/parent/maven-metadata-local.xml | 11 + .../settings.xml | 23 + .../src/test/projects/optional-dep/pom.xml | 20 + .../readProject-missingModuleIgnored/pom.xml | 13 + .../modules/child1/pom.xml | 13 + .../readProject-withScmInheritance/pom.xml | 19 + .../org.apache.maven/maven-core/pom.properties | 18 + .../resources/pom-with-distribution-status.xml | 30 + .../test/resources/pom-without-dependencies.xml | 30 + .../maven-embedder/src/test/resources/pom.xml | 34 + .../maven-embedder/src/test/resources/pom2.xml | 48 + .../test/resources/settings/invalid-settings.xml | 24 + .../src/test/resources/settings/valid-settings.xml | 27 + .../apache-maven-3.3.3/maven-model-builder/pom.xml | 86 + .../building/AbstractModelBuildingListener.java | 37 + .../maven/model/building/DefaultModelBuilder.java | 1309 ++++ .../model/building/DefaultModelBuilderFactory.java | 243 + .../model/building/DefaultModelBuildingEvent.java | 64 + .../building/DefaultModelBuildingRequest.java | 408 ++ .../model/building/DefaultModelBuildingResult.java | 180 + .../maven/model/building/DefaultModelProblem.java | 175 + .../building/DefaultModelProblemCollector.java | 200 + .../model/building/DefaultModelProcessor.java | 84 + .../maven/model/building/FileModelSource.java | 83 + .../model/building/FilterModelBuildingRequest.java | 285 + .../apache/maven/model/building/ModelBuilder.java | 67 + .../maven/model/building/ModelBuildingEvent.java | 53 + .../model/building/ModelBuildingEventCatapult.java | 48 + .../model/building/ModelBuildingException.java | 180 + .../model/building/ModelBuildingListener.java | 40 + .../maven/model/building/ModelBuildingRequest.java | 338 ++ .../maven/model/building/ModelBuildingResult.java | 99 + .../apache/maven/model/building/ModelCache.java | 56 + .../apache/maven/model/building/ModelCacheTag.java | 132 + .../org/apache/maven/model/building/ModelData.java | 222 + .../apache/maven/model/building/ModelProblem.java | 117 + .../model/building/ModelProblemCollector.java | 41 + .../model/building/ModelProblemCollectorExt.java | 37 + .../building/ModelProblemCollectorRequest.java | 101 + .../maven/model/building/ModelProblemUtils.java | 171 + .../maven/model/building/ModelProcessor.java | 32 + .../apache/maven/model/building/ModelSource.java | 38 + .../apache/maven/model/building/ModelSource2.java | 56 + .../org/apache/maven/model/building/Result.java | 255 + .../maven/model/building/StringModelSource.java | 56 + .../maven/model/building/UrlModelSource.java | 46 + .../DefaultDependencyManagementImporter.java | 83 + .../composition/DependencyManagementImporter.java | 48 + .../inheritance/DefaultInheritanceAssembler.java | 255 + .../model/inheritance/InheritanceAssembler.java | 48 + .../AbstractStringBasedModelInterpolator.java | 271 + .../interpolation/BuildTimestampValueSource.java | 47 + .../model/interpolation/MavenBuildTimestamp.java | 70 + .../model/interpolation/ModelInterpolator.java | 54 + .../PathTranslatingPostProcessor.java | 67 + .../interpolation/ProblemDetectingValueSource.java | 87 + .../StringSearchModelInterpolator.java | 504 ++ .../interpolation/UrlNormalizingPostProcessor.java | 69 + .../apache/maven/model/io/DefaultModelReader.java | 134 + .../apache/maven/model/io/DefaultModelWriter.java | 118 + .../apache/maven/model/io/ModelParseException.java | 93 + .../org/apache/maven/model/io/ModelReader.java | 89 + .../org/apache/maven/model/io/ModelWriter.java | 74 + .../maven/model/locator/DefaultModelLocator.java | 42 + .../apache/maven/model/locator/ModelLocator.java | 44 + .../DefaultDependencyManagementInjector.java | 110 + .../DefaultPluginManagementInjector.java | 137 + .../management/DependencyManagementInjector.java | 44 + .../model/management/PluginManagementInjector.java | 44 + .../apache/maven/model/merge/MavenModelMerger.java | 729 +++ .../normalization/DefaultModelNormalizer.java | 135 + .../maven/model/normalization/ModelNormalizer.java | 54 + .../model/path/DefaultModelPathTranslator.java | 111 + .../model/path/DefaultModelUrlNormalizer.java | 84 + .../maven/model/path/DefaultPathTranslator.java | 66 + .../maven/model/path/DefaultUrlNormalizer.java | 65 + .../maven/model/path/ModelPathTranslator.java | 45 + .../maven/model/path/ModelUrlNormalizer.java | 42 + .../apache/maven/model/path/PathTranslator.java | 43 + .../org/apache/maven/model/path/UrlNormalizer.java | 39 + .../plugin/DefaultPluginConfigurationExpander.java | 83 + .../plugin/DefaultReportConfigurationExpander.java | 65 + .../model/plugin/DefaultReportingConverter.java | 240 + .../model/plugin/LifecycleBindingsInjector.java | 46 + .../model/plugin/PluginConfigurationExpander.java | 43 + .../model/plugin/ReportConfigurationExpander.java | 43 + .../maven/model/plugin/ReportingConverter.java | 43 + .../profile/DefaultProfileActivationContext.java | 259 + .../model/profile/DefaultProfileInjector.java | 249 + .../model/profile/DefaultProfileSelector.java | 143 + .../model/profile/ProfileActivationContext.java | 79 + .../maven/model/profile/ProfileInjector.java | 46 + .../maven/model/profile/ProfileSelector.java | 49 + .../profile/activation/FileProfileActivator.java | 192 + .../activation/JdkVersionProfileActivator.java | 224 + .../OperatingSystemProfileActivator.java | 168 + .../model/profile/activation/ProfileActivator.java | 59 + .../activation/PropertyProfileActivator.java | 126 + .../resolution/InvalidRepositoryException.java | 73 + .../maven/model/resolution/ModelResolver.java | 93 + .../resolution/UnresolvableModelException.java | 126 + .../model/resolution/WorkspaceModelResolver.java | 33 + .../model/superpom/DefaultSuperPomProvider.java | 87 + .../maven/model/superpom/SuperPomProvider.java | 42 + .../model/validation/DefaultModelValidator.java | 1076 ++++ .../maven/model/validation/ModelValidator.java | 54 + .../maven-model-builder/src/main/mdo/profiles.mdo | 399 ++ .../resources/org/apache/maven/model/pom-4.0.0.xml | 150 + .../maven-model-builder/src/site/apt/index.apt | 187 + .../src/site/apt/super-pom.apt.vm | 30 + .../maven-model-builder/src/site/site.xml | 40 + .../model/building/ComplexActivationTest.java | 60 + .../building/DefaultModelBuilderFactoryTest.java | 59 + .../model/building/SimpleProblemCollector.java | 89 + .../DefaultInheritanceAssemblerTest.java | 108 + .../AbstractModelInterpolatorTest.java | 494 ++ .../interpolation/MavenBuildTimestampTest.java | 38 + .../StringSearchModelInterpolatorTest.java | 505 ++ .../maven/model/path/DefaultUrlNormalizerTest.java | 85 + .../activation/AbstractProfileActivatorTest.java | 92 + .../activation/JdkVersionProfileActivatorTest.java | 185 + .../activation/PropertyProfileActivatorTest.java | 185 + .../validation/DefaultModelValidatorTest.java | 630 ++ .../src/test/resources/poms/factory/complex.xml | 49 + .../src/test/resources/poms/factory/simple.xml | 81 + .../inheritance/plugin-configuration-child.xml | 61 + .../inheritance/plugin-configuration-expected.xml | 87 + .../inheritance/plugin-configuration-parent.xml | 89 + .../validation/bad-dependency-exclusion-id.xml | 40 + .../poms/validation/bad-dependency-scope.xml | 69 + .../poms/validation/bad-dependency-version.xml | 43 + .../validation/bad-import-scope-classifier.xml | 38 + .../poms/validation/bad-import-scope-type.xml | 37 + .../resources/poms/validation/bad-modelVersion.xml | 25 + .../validation/bad-plugin-dependency-scope.xml | 70 + .../validation/bad-plugin-dependency-version.xml | 46 + .../poms/validation/bad-plugin-version.xml | 55 + .../poms/validation/bad-repository-id.xml | 50 + .../poms/validation/bad-snapshot-version.xml | 25 + .../test/resources/poms/validation/bad-version.xml | 25 + .../poms/validation/basedir-system-path.xml | 42 + .../validation/distribution-management-status.xml | 29 + .../resources/poms/validation/duplicate-module.xml | 31 + .../poms/validation/duplicate-plugin-execution.xml | 103 + .../resources/poms/validation/duplicate-plugin.xml | 81 + .../poms/validation/duplicate-profile-id.xml | 35 + .../resources/poms/validation/empty-module.xml | 30 + .../poms/validation/empty-plugin-version.xml | 34 + .../poms/validation/hard-coded-system-path.xml | 42 + .../poms/validation/incomplete-parent.xml | 30 + .../invalid-aggregator-packaging-pom.xml | 30 + .../resources/poms/validation/invalid-ids-pom.xml | 26 + .../resources/poms/validation/missing-1-pom.xml | 21 + .../poms/validation/missing-artifactId-pom.xml | 25 + .../missing-dependency-artifactId-pom.xml | 32 + .../validation/missing-dependency-exclusion-id.xml | 39 + .../validation/missing-dependency-groupId-pom.xml | 32 + .../missing-dependency-mgmt-artifactId-pom.xml | 34 + .../missing-dependency-mgmt-groupId-pom.xml | 34 + .../missing-dependency-mgmt-version-pom.xml | 34 + .../validation/missing-dependency-version-pom.xml | 32 + .../poms/validation/missing-groupId-pom.xml | 25 + .../poms/validation/missing-modelVersion-pom.xml | 25 + .../validation/missing-plugin-artifactId-pom.xml | 33 + .../missing-plugin-dependency-artifactId.xml | 41 + .../missing-plugin-dependency-groupId.xml | 41 + .../missing-plugin-dependency-version.xml | 41 + .../poms/validation/missing-plugin-version-pom.xml | 33 + .../validation/missing-report-artifactId-pom.xml | 33 + .../poms/validation/missing-report-version-pom.xml | 57 + .../poms/validation/missing-repository-id-pom.xml | 36 + .../validation/missing-resource-directory-pom.xml | 38 + .../resources/poms/validation/missing-type-pom.xml | 26 + .../poms/validation/missing-version-pom.xml | 25 + .../poms/validation/reserved-repository-id.xml | 50 + .../maven/apache-maven-3.3.3/maven-model/pom.xml | 132 + .../apache/maven/model/io/xpp3/package-info.java | 30 + .../org/apache/maven/model/merge/ModelMerger.java | 2924 +++++++++ .../org/apache/maven/model/merge/package-info.java | 24 + .../java/org/apache/maven/model/package-info.java | 25 + .../maven-model/src/main/mdo/maven.mdo | 3649 ++++++++++++ .../maven-model/src/site/apt/index.apt | 39 + .../maven-model/src/site/site.xml | 36 + .../maven-model/src/site/xdoc/navigation.xml | 35 + .../org/apache/maven/model/ActivationFileTest.java | 56 + .../org/apache/maven/model/ActivationOSTest.java | 56 + .../apache/maven/model/ActivationPropertyTest.java | 56 + .../org/apache/maven/model/ActivationTest.java | 56 + .../java/org/apache/maven/model/BuildTest.java | 56 + .../org/apache/maven/model/CiManagementTest.java | 56 + .../org/apache/maven/model/ContributorTest.java | 56 + .../maven/model/DependencyManagementTest.java | 56 + .../org/apache/maven/model/DependencyTest.java | 56 + .../maven/model/DeploymentRepositoryTest.java | 56 + .../java/org/apache/maven/model/DeveloperTest.java | 56 + .../maven/model/DistributionManagementTest.java | 56 + .../java/org/apache/maven/model/ExclusionTest.java | 56 + .../java/org/apache/maven/model/ExtensionTest.java | 56 + .../apache/maven/model/IssueManagementTest.java | 56 + .../java/org/apache/maven/model/LicenseTest.java | 56 + .../org/apache/maven/model/MailingListTest.java | 56 + .../java/org/apache/maven/model/ModelTest.java | 56 + .../java/org/apache/maven/model/NotifierTest.java | 56 + .../org/apache/maven/model/OrganizationTest.java | 56 + .../java/org/apache/maven/model/ParentTest.java | 56 + .../maven/model/PluginConfigurationTest.java | 56 + .../apache/maven/model/PluginContainerTest.java | 56 + .../apache/maven/model/PluginExecutionTest.java | 56 + .../apache/maven/model/PluginManagementTest.java | 56 + .../java/org/apache/maven/model/PluginTest.java | 56 + .../org/apache/maven/model/PrerequisitesTest.java | 56 + .../java/org/apache/maven/model/ProfileTest.java | 56 + .../org/apache/maven/model/RelocationTest.java | 56 + .../org/apache/maven/model/ReportPluginTest.java | 56 + .../java/org/apache/maven/model/ReportSetTest.java | 56 + .../java/org/apache/maven/model/ReportingTest.java | 56 + .../apache/maven/model/RepositoryPolicyTest.java | 56 + .../org/apache/maven/model/RepositoryTest.java | 56 + .../java/org/apache/maven/model/ResourceTest.java | 56 + .../test/java/org/apache/maven/model/ScmTest.java | 56 + .../test/java/org/apache/maven/model/SiteTest.java | 56 + .../apache-maven-3.3.3/maven-plugin-api/pom.xml | 91 + .../apache/maven/monitor/logging/DefaultLog.java | 131 + .../java/org/apache/maven/plugin/AbstractMojo.java | 198 + .../plugin/AbstractMojoExecutionException.java | 53 + .../org/apache/maven/plugin/ContextEnabled.java | 45 + .../main/java/org/apache/maven/plugin/Mojo.java | 72 + .../maven/plugin/MojoExecutionException.java | 80 + .../apache/maven/plugin/MojoFailureException.java | 69 + .../apache/maven/plugin/MojoNotFoundException.java | 85 + .../DuplicateMojoDescriptorException.java | 34 + .../descriptor/DuplicateParameterException.java | 31 + .../descriptor/InvalidParameterException.java | 37 + .../InvalidPluginDescriptorException.java | 38 + .../maven/plugin/descriptor/MojoDescriptor.java | 719 +++ .../apache/maven/plugin/descriptor/Parameter.java | 207 + .../maven/plugin/descriptor/PluginDescriptor.java | 445 ++ .../plugin/descriptor/PluginDescriptorBuilder.java | 358 ++ .../maven/plugin/descriptor/Requirement.java | 72 + .../java/org/apache/maven/plugin/logging/Log.java | 158 + .../maven/plugin/logging/SystemStreamLog.java | 196 + .../maven-plugin-api/src/main/mdo/lifecycle.mdo | 129 + .../maven-plugin-api/src/main/mdo/plugin.mdo | 525 ++ .../maven-plugin-api/src/site/apt/index.apt | 39 + .../maven-plugin-api/src/site/site.xml | 40 + .../descriptor/PluginDescriptorBuilderTest.java | 133 + .../plugin/lifecycle/LifecycleXpp3ReaderTest.java | 55 + .../src/test/resources/lifecycle.xml | 39 + .../maven-plugin-api/src/test/resources/plugin.xml | 89 + .../maven-repository-metadata/pom.xml | 63 + .../src/main/mdo/metadata.mdo | 371 ++ .../src/site/apt/index.apt | 52 + .../maven-repository-metadata/src/site/site.xml | 36 + .../maven-settings-builder/pom.xml | 85 + .../settings/building/DefaultSettingsBuilder.java | 277 + .../building/DefaultSettingsBuilderFactory.java | 71 + .../building/DefaultSettingsBuildingRequest.java | 160 + .../building/DefaultSettingsBuildingResult.java | 58 + .../settings/building/DefaultSettingsProblem.java | 166 + .../building/DefaultSettingsProblemCollector.java | 70 + .../settings/building/FileSettingsSource.java | 59 + .../maven/settings/building/SettingsBuilder.java | 40 + .../building/SettingsBuildingException.java | 90 + .../settings/building/SettingsBuildingRequest.java | 131 + .../settings/building/SettingsBuildingResult.java | 50 + .../maven/settings/building/SettingsProblem.java | 100 + .../building/SettingsProblemCollector.java | 41 + .../maven/settings/building/SettingsSource.java | 35 + .../settings/building/StringSettingsSource.java | 69 + .../maven/settings/building/UrlSettingsSource.java | 60 + .../settings/crypto/DefaultSettingsDecrypter.java | 110 + .../crypto/DefaultSettingsDecryptionRequest.java | 120 + .../crypto/DefaultSettingsDecryptionResult.java | 81 + .../maven/settings/crypto/SettingsDecrypter.java | 38 + .../settings/crypto/SettingsDecryptionRequest.java | 65 + .../settings/crypto/SettingsDecryptionResult.java | 71 + .../maven/settings/io/DefaultSettingsReader.java | 113 + .../maven/settings/io/DefaultSettingsWriter.java | 118 + .../maven/settings/io/SettingsParseException.java | 93 + .../apache/maven/settings/io/SettingsReader.java | 82 + .../apache/maven/settings/io/SettingsWriter.java | 74 + .../maven/settings/merge/MavenSettingsMerger.java | 142 + .../validation/DefaultSettingsValidator.java | 285 + .../settings/validation/SettingsValidator.java | 41 + .../maven-settings-builder/src/site/site.xml | 36 + .../DefaultSettingsBuilderFactoryTest.java | 53 + .../validation/DefaultSettingsValidatorTest.java | 244 + .../src/test/resources/settings/factory/simple.xml | 24 + .../apache-maven-3.3.3/maven-settings/pom.xml | 63 + .../org/apache/maven/settings/RuntimeInfo.java | 55 + .../maven-settings/src/main/mdo/settings.mdo | 1077 ++++ .../maven-settings/src/site/apt/index.apt | 36 + .../maven-settings/src/site/site.xml | 36 + framework/src/maven/apache-maven-3.3.3/pom.xml | 654 ++ .../src/site/resources/images/maven-deps.png | Bin 0 -> 73105 bytes .../src/maven/apache-maven-3.3.3/src/site/site.xml | 75 + .../apache-maven-3.3.3/src/site/xdoc/index.xml | 76 + .../src/site/xdoc/maven-deps.odg | Bin 0 -> 32324 bytes 4134 files changed, 576696 insertions(+), 6 deletions(-) create mode 100644 framework/src/ant/apache-ant-1.9.6/CONTRIBUTORS create mode 100644 framework/src/ant/apache-ant-1.9.6/INSTALL create mode 100644 framework/src/ant/apache-ant-1.9.6/KEYS create mode 100644 framework/src/ant/apache-ant-1.9.6/LICENSE create mode 100644 framework/src/ant/apache-ant-1.9.6/NOTICE create mode 100644 framework/src/ant/apache-ant-1.9.6/README create mode 100644 framework/src/ant/apache-ant-1.9.6/WHATSNEW create mode 100644 framework/src/ant/apache-ant-1.9.6/bootstrap.bat create mode 100755 framework/src/ant/apache-ant-1.9.6/bootstrap.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/build.bat create mode 100755 framework/src/ant/apache-ant-1.9.6/build.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/contributors.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/fetch.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/get-m2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/lib/README create mode 100644 framework/src/ant/apache-ant-1.9.6/lib/libraries.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/lib/optional/hamcrest-core-1.3.jar create mode 100644 framework/src/ant/apache-ant-1.9.6/lib/optional/junit-3.8.2.jar create mode 100644 framework/src/ant/apache-ant-1.9.6/lib/optional/junit-4.11.jar create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Integration/anttool1.gif create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Integration/jext-plugin.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Integration/remacc.gif create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Integration/toolmenu.gif create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/LICENSE create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/BorlandEJBTasks.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/BorlandGenerateClient.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/ant.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/antcall.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/antlr.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/antstructure.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/antversion.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/apply.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/apt.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/attrib.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/augment.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/available.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/basename.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/bindtargets.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/buildnumber.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/cab.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/ccm.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/changelog.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/checksum.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/chgrp.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/chmod.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/chown.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/clearcase.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/common.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/componentdef.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/concat.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/condition.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/conditions.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/copy.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/copydir.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/copyfile.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/cvs.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/cvspass.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/cvstagdiff.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/cvsversion.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/defaultexcludes.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/delete.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/deltree.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/depend.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/dependset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/diagnostics.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/dirname.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/ear.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/echo.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/echoproperties.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/echoxml.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/ejb.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/exec.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/fail.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/filter.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/fixcrlf.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/ftp.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/genkey.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/get.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/gunzip.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/gzip.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/hostinfo.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/image-classdiagram.gif create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/image.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/import.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/include.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/input.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jar.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jarlib-available.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jarlib-display.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jarlib-manifest.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jarlib-resolve.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/java.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/javac.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/javacc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/javadoc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/javah.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jdepend.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jjdoc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jjtree.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jlink.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/jspc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/junit.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/junitreport.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/length.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/loadfile.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/loadproperties.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/loadresource.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/local.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/macrodef.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/mail.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/makeurl.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/manifest.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/manifestclasspath.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/mimemail.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/mkdir.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/move.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/native2ascii.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/netrexxc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/nice.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/pack.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/parallel.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/patch.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/pathconvert.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/presetdef.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/projecthelper.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/property.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/propertyfile.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/propertyhelper.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/pvcstask.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/recorder.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/rename.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/renameextensions.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/replace.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/replaceregexp.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/resourcecount.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/retry.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/rexec.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/rmic.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/rpm.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/schemavalidate.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/scp.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/script.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/scriptdef.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sequential.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/serverdeploy.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/setproxy.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/signjar.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sleep.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sos.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sound.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/splash.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sql.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sshexec.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sshsession.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/style.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/subant.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/symlink.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/sync.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/tar.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/taskdef.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/telnet.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/tempfile.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/touch.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/translate.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/truncate.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/tstamp.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/typedef.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/unpack.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/untar.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/unzip.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/uptodate.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/verifyjar.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/vss.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/waitfor.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/war.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/whichresource.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/wljspc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/xmlproperty.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/xmlvalidate.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Tasks/zip.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/antlib.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/assertions.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/classfileset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/custom-programming.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/description.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/dirset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/extension.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/extensionset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/filelist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/fileset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/filterchain.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/filterset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/mapper.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/multirootfileset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/namespace.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/patternset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/permissions.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/propertyset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/redirector.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/regexp.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/resources.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/selectors-program.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/selectors.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/tarfileset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/xmlcatalog.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/Types/zipfileset.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/antexternal.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/anttaskslist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/argumentprocessor.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/base_task_classes.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/clonevm.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/conceptstypeslist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/cover.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/credits.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/develop.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/developlist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/dirtasks.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/favicon.ico create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/feedback.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/ide.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/ifunless.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/images/ant_logo_large.gif create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/index.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/inputhandler.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/install.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/installlist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/intro.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/javacprops.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/listeners.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/platform.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/projecthelper.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/properties.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/proxy.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/running.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/runninglist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/stylesheets/style.css create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/sysclasspath.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/targets.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tasklist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tasksoverview.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/toc.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tutorial-HelloWorldWithAnt.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tutorial-tasks-filesets-properties.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tutorial-tasks-filesets-properties.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tutorial-writing-tasks-src.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tutorial-writing-tasks.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/tutorials.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/using.html create mode 100644 framework/src/ant/apache-ant-1.9.6/manual/usinglist.html create mode 100644 framework/src/ant/apache-ant-1.9.6/patch.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/antidote/WHAT-IS-THIS-P create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/ant-bin.wxs create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/ant-msi.wxs create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/ant-update.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/changelog.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/RequiredHeader.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-config create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-frames-sortby-check.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-text.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-xdoc.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/common2master.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/coverage-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/jdepend-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/jdepend.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames-xalan1.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/junit-noframes.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/log.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/manifest create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/maudit-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/mmetrics-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/performance/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/performance/dirscanner.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/README.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-antlr/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bcel/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bsf/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-log4j/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-oro/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-regexp/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-resolver/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-xalan2/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-logging/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-net/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jai/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-javamail/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jdepend/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jmf/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jsch/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit4/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-launcher/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-netrexx/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-swing/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-testutil/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/poms/pom.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/printFailingTests.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/tagdiff.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/asf-logo.gif create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/buildfiletest-base.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/antclassloader.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/case.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/containersrc/test/SpecialSeq.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/directoryscanner.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/dispatch/dispatch.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target-imported.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/executor.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/extended-taskdef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/immutable.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.inc create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/relative.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.inc create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/relative.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/simple.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/included_file.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/included_file.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/included_file.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/included_file.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.inc create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/relative.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/simple.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/loaderref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/src/Task1.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/location.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/taskcontainer.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/notarget.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/targetlevelant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/toplevelant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/unknownelement.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/concat.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/dynamicfilter.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/escapeunicode.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.head.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headAllSkip.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLines.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLinesSkip.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headSkip.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headtail.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tail.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailAllSkip.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLines.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLinesSkip.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailSkip.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/linecontains.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/negatelinecontains.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.double.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/stripjavacomments.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/head-tail.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/escapeunicode.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.small.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/linecontains.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.double.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.mustache.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/sample.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/stripjavacomments.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/tokenfilter.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/abstractcvstask.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.topleveltest.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/ant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/references.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.current-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antstructure.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/available.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bar.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/basename.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bunzip2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bzip2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/calltarget.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/Bar create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/zap/Eenie create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/classloader.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/A create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/B create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/condition.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/antversion.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/http.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfailure.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfileselected.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreachable.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreference.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/issigned.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/apassword.jar create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/nosign.jar create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/pass.jar create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/parsersupports.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/typefound.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/xor.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.filterset create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/expected/utf-8 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/input/iso8859-1 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copydir.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copyfile.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/cvspass.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/defaultexcludes.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/delete.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/deltree.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dirname.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dynamictask.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/echoxml.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/email/mail.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/exec.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/parrot.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/spawn.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo-huge.tar.bz2 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo-huge.tar.gz create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.bz2 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.gz create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5sum create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.pattern create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.svf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.bz2 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.gz create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/copy.filterset.filtered create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fail.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter1.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter2.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter3.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filterdefs.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/expected.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/input.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/foo.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/get.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gunzip.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gzip.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/a.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/b.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/bad.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/c.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_bad_import.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_same_target.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/imported.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/importtargetfirst.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/recursive-selfimport.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/same_target.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential-inner.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget-inner.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/serial.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d1/p1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d2/p2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d3a/p3.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/targetfirst.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamedImport.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/initializeclass.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.stdin create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/jar.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/java.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/java/ClassToJavadoc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/javadoc.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/loadfile.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/macrodef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/makeurl.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifest.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Alpha.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Beta.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test1.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test2.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test3.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test4.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test5.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test6.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test7.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/mkdir.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/move.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/multimap.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nice.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nopermissions.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/antlr.g create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/antlr.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/extended.calc.g create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.g create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.tree.g create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/depend.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/A.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/B.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/C.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/D.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/E.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/A.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/B.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/A.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/B.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/A.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/B.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/expected/de/template.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/resources_ger_DE.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/template.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/translate.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/image.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/src/badimage.jpg create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/src/largeimage.jpg create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/javah/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/javah/input/org/example/Foo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/1nvalid-classname.jsp create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/WEB-INF/web.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/default.jsp create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/missing_tld.jsp create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/simple.jsp create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/uriroot.jsp create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/xml.jsp create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jspc.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/cdataoutput.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/matches.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/teardownlistener.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-import.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/INCOMPLETE-sampleproject.incomplete.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/NAMESPACE-sampleproject.namespace.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.coins.CoinTest.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.util.UniqueStringTest.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/WRONGELEMENT-sampleproject.wrongelement.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/ZEROBYTES-sampleproject.package.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/expected/iso8859-1.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/input/iso8859-1.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/net/ftp.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/propertyfile.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/pvcs.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.result.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/schemavalidate.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script/scriptdef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script_reference.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/sos/sos.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/splash-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/unix/symlink.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/vss/vss.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/about.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/apache.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/books.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/catalog create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc-in-ns.xsd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.dtd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/docwithentity.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema-invalid.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-ns-no-location.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/entity.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/iso-2022-jp.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/utf-8.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/validate.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xmlvalidate.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xslt.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/parallel.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/pathconvert.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/presetdef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property2.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property3.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property4.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property5.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest1.result create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest2.result create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest3.result create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest4.result create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest5.result create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest6.result create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rename.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/result.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/source.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/value.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/rmic.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/AntTimestamp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestamp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestampImpl.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/signjar.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/skinconfig.dtd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sleep.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/build.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/data.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printFilename.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printParams.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/testNewerStylesheet.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/genericsubant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test1/mysubant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test2/mysubant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sync.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/tar.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/taskdef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/template.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test.antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test2.antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelantcall.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelsubant.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/touch.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typeadapter.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typedef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/untar.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/unzip.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/uptodate.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/war.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/whichresource.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlns.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-original.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-override.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-original.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-include.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-override.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-original.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-multi.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-original.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-include-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-input1.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-locations.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-paths.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-references.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/input1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/locations.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/multi.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/original.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/override.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/paths.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/references.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.dtd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_needscat.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_withdtd.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip/zipgroupfileset1.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip/zipgroupfileset2.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip/zipgroupfileset3.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/testkeystore create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/addtype.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionMain.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description3.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description4.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filelist.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterset.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterseta.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetb.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetc.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetd.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile1 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile2 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/flexinteger.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset1.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset2.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset3.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mapper.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/define.mapperresult.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/globmapper.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/regexpmapper.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/scriptmapper.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/poly.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/redirector.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/javaresource.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/resourcelist.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/tarentry.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/scriptselector.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/signedselector.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlfragment.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/simple.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/unusual.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/etc/yearcheck.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntClassLoader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntTypeDefinition.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildEvent.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ComponentHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultDefinitions.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Diagnostics.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DirectoryScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttributeNS.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfigurator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfiguratorNS.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElement.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElementNS.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicObjectAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Evaluable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Executor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitStatusException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExtensionPoint.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/FileScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/IntrospectionHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Location.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/MagicNames.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Main.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/NoBannerLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PathTokenizer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Project.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectComponent.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PropertyHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/RuntimeConfigurable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/SubBuildListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Target.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Task.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskConfigurationChecker.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskContainer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TypeAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnknownElement.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedAttributeException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedElementException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/XmlLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/AttributeNamespace.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/BaseIfAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/EnableAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfBlankAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfSetAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfTrueAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/defaultManifest.mf create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/Dispatchable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseFilterReader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseParamFilterReader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ChainableReader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ClassConstants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ConcatFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/EscapeUnicode.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ExpandProperties.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/FixCrLfFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/HeadFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContains.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/PrefixLines.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ReplaceTokens.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SortFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StringInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripJavaComments.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineBreaks.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineComments.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SuffixLines.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TabsToSpaces.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TailFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TokenFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/UniqFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/JavaClassHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/DefaultExecutor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/IgnoreDependenciesExecutor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelper2.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelperImpl.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/SingleCheckExecutor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/DefaultInputHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/GreedyInputHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputRequest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/MultipleChoiceInputRequest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/PropertyFileInputHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/SecureInputHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/AntMain.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/LaunchException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Launcher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Locator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/AnsiColorLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/BigProjectLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/Log4jListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/MailLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/ProfileLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SilentLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SimpleBigProjectLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/TimestampedLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/defaults.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader2.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader5.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/GetProperty.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalProperties.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalPropertyStack.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/NullReturn.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseNextProperty.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseProperties.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/PropertyExpander.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/package.html create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractJarSignerTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Ant.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntStructure.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntlibDefinition.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Apt.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AttributeNamespaceDef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AugmentReference.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Available.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/BUnzip2.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/BZip2.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Basename.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/BindTargets.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/BuildNumber.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/CVSPass.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/CallTarget.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Checksum.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Chmod.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Classloader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/CloseResources.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/CommandLauncherTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Componentdef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Concat.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ConditionTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Copy.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/CopyPath.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Copydir.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Copyfile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Cvs.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/DefBase.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/DefaultExcludes.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Definer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Delete.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Deltree.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/DependSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/DiagnosticsTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Dirname.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Ear.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Echo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/EchoXML.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Exec.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ExecTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Execute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ExecuteJava.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ExecuteStreamHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ExecuteWatchdog.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Exit.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Expand.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Filter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/GUnzip.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/GZip.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/GenerateKey.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Get.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/HostInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ImportTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Input.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/JDBCTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Jar.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Java.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Javac.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Javadoc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Jikes.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/JikesOutputParser.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/KeySubst.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Length.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/LoadFile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/LoadResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Local.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/LogStreamHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/MacroDef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/MakeUrl.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Manifest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ManifestException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ManifestTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/MatchingTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Mkdir.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Move.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Nice.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Pack.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Parallel.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Patch.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/PathConvert.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/PreSetDef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ProcessDestroyer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ProjectHelperTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Property.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/PropertyHelperTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Recorder.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/RecorderEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Redirector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Rename.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Replace.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/ResourceCount.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Retry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Rmic.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/SQLExec.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/SendEmail.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Sequential.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/SignJar.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Sleep.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/SubAnt.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Sync.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tar.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/TaskOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Taskdef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/TempFile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Touch.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Transform.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Truncate.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Tstamp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Typedef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Unpack.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Untar.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/UpToDate.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/VerifyJar.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WaitFor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/War.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/WhichResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison2.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison3.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTLiaison4.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTLoggerAware.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XSLTProcess.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/XmlProperty.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Zip.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/AptCompilerAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/AptExternalCompilerAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterExtension.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Gcj.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Javac12.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Javac13.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Jikes.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Jvc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Kjc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/compilers/Sj.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/And.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/AntVersion.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Condition.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/ConditionBase.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Contains.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Equals.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/FilesMatch.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/HasFreeSpace.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/HasMethod.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Http.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsFailure.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsFalse.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsFileSelected.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsLastModified.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsReference.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsSigned.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/IsTrue.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Matches.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Not.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Or.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Os.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/ParserSupports.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/ResourceContains.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/ResourceExists.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/ResourcesMatch.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Socket.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/TypeFound.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/condition/Xor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/CVSEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParser.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/ChangeLogWriter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsUser.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsVersion.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/RCSFile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/RedirectingOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/cvslib/RedirectingStreamHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/defaults.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/EmailAddress.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/Header.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/Message.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/PlainMailer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/email/UUMailer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/CommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/CommandLauncherProxy.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/Java13CommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/MacCommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/OS2CommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/PerlScriptCommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/ScriptCommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/launcher/WinNTCommandLauncher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ANTLR.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/EchoProperties.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/NetRexxC.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/PropertyFile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/RenameExtensions.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/Rpm.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/SchemaValidate.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/Script.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/XMLValidateTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/XSLTTraceSupport.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCheck.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCheckin.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCheckinDefault.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCheckout.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCreateTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMReconfigure.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ccm/Continuus.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCCheckin.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCCheckout.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCLock.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMkattr.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMkbl.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMkdir.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMkelem.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMklabel.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMklbtype.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCRmtype.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCUnCheckout.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCUnlock.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCUpdate.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/ClearCase.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/AntAnalyzer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/ClassFile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/ClassFileIterator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/ClassFileUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/DirectoryIterator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/JarFileIterator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ClassCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPoolEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/DoubleCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/FieldRefCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/FloatCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/IntegerCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InterfaceMethodRefCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/LongCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodHandleCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodRefCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodTypeCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/NameAndTypeCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/StringCPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/Utf8CPInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandGenerateClient.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/DescriptorHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EJBDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/IPlanetDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/IPlanetEjbc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/IPlanetEjbcTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/InnerClassFilenameFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JbossDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/JonasDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WeblogicDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WeblogicTOPLinkDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ejb/WebsphereDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/Compatability.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/Compatibility.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/DeweyDecimal.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/Extension.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionResolver.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtraAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibAvailableTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibDisplayTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibManifestTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/JarLibResolveTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/LibFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/LibraryDisplayer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/Specification.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/resolvers/AntResolver.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/resolvers/LocationResolver.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/extension/resolvers/URLResolver.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/i18n/Translate.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/j2ee/AbstractHotDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/j2ee/GenericHotDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/j2ee/HotDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/j2ee/JonasHotDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/j2ee/ServerDeploy.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/j2ee/WebLogicHotDeploymentTool.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javacc/JJDoc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javacc/JJTree.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javacc/JavaCC.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javah/Gcjh.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javah/Kaffeh.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/Jasper41Mangler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspMangler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/WLJspc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/DefaultJspCompilerAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/BaseTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/Constants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/DOMUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestResult.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitResultFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirror.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirrorImpl.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/OutErrSummaryJUnitResultFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/PlainJUnitResultFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/SummaryJUnitResultFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrash.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TestIgnored.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/TestListenerWrapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLConstants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/DefaultNative2Ascii.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/KaffeNative2Ascii.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/Native2AsciiAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/Native2AsciiAdapterFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/native2ascii/SunNative2Ascii.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPConfigurator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskConfig.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskMirror.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/FTPTaskMirrorImpl.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/MimeMail.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/RExecTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/SetProxy.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/PvcsProject.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDef.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/script/ScriptDefBase.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOS.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSCheckin.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSCheckout.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSCmd.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSGet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/SOSLabel.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sos/package.html create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/SoundTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/splash/SplashScreen.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/splash/SplashTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/AbstractSshMessage.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/Directory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/LogListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHBase.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHExec.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHSession.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/SSHUserInfo.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/Scp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessage.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpFromMessageBySftp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessage.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/ssh/ScpToMessageBySftp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/testing/BlockFor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/testing/BuildTimeoutException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/testing/Funtest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/unix/AbstractAccessTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/unix/Chgrp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/unix/Chown.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/unix/Symlink.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSS.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSADD.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSCHECKIN.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSCHECKOUT.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSCP.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSCREATE.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSConstants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSGET.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSHISTORY.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/vss/MSVSSLABEL.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/windows/Attrib.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/DefaultRmicAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/ForkingSunRmic.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/KaffeRmic.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/RmicAdapterFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/SunRmic.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/WLRmic.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/rmic/XNewRmic.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/AbstractFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/AntFilterReader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ArchiveFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ArchiveScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Assertions.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Commandline.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/CommandlineJava.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Comparison.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/DTDLocation.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/DataType.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Description.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/DirSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/EnumeratedAttribute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Environment.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/FileList.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/FileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/FilterChain.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/FilterSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/FilterSetCollection.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/FlexInteger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/LogLevel.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Mapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Parameter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Parameterizable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Path.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Permissions.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PropertySet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Quantifier.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/RedirectorElement.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Reference.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/RegularExpression.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Resource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ResourceCollection.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ResourceFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ResourceLocation.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/Substitution.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/TarFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/TarScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/TimeComparison.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/XMLCatalog.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ZipFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/ZipScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/conditions/antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/defaults.properties create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/mappers/CutDirsMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/mappers/FilterMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/AbstractScriptComponent.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/ScriptCondition.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/ScriptFilter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/ScriptMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/ScriptSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/depend/ClassfileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/depend/DependScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Arc.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/BasicShape.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/ColorMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Draw.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/DrawOperation.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Ellipse.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/ImageOperation.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Rectangle.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Rotate.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Scale.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/Text.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/optional/image/TransformOperation.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resolver/ApacheCatalog.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resolver/ApacheCatalogResolver.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resolver/package.html create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/AbstractResourceCollectionWrapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/AllButFirst.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/AllButLast.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Appendable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/ArchiveResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Archives.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BCFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BZip2Resource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionWrapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/CompressedResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/ContentTransformingResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Difference.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/FailFast.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/FileProvider.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/FileResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/FileResourceIterator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Files.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/First.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/GZipResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/ImmutableResourceException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Intersect.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/JavaConstantResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/JavaResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Last.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/LazyResourceCollectionWrapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/LogOutputResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/MappedResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/MappedResourceCollection.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/MultiRootFileSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/PropertyResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/ResourceDecorator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/ResourceList.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Resources.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Restrict.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/SizeLimitCollection.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Sort.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/StringResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/TarResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Tokens.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Touchable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/URLProvider.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/URLResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/Union.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/ZipResource.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Content.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Date.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/DelegatedResourceComparator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Exists.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/FileSystem.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Name.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/ResourceComparator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Reverse.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Size.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/comparators/Type.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/And.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Compare.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Date.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Exists.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/InstanceOf.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Majority.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Name.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/None.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Not.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Or.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/ResourceSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/ResourceSelectorContainer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Size.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/selectors/Type.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/AbstractSelectorContainer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/AndSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/BaseExtendSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/BaseSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/ContainsRegexpSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/ContainsSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/DateSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/DependSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/DepthSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/DifferentSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/ExtendFileSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/ExtendSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/FileSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/FilenameSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/MajoritySelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/MappingSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/NoneSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/NotSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/OrSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/PresentSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/ReadableSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/SelectSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/SelectorContainer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/SelectorScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/SignedSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/SizeSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/TokenizedPath.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/TokenizedPattern.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/TypeSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/WritableSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/Algorithm.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/Cache.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ChecksumAlgorithm.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/DigestAlgorithm.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/EqualComparator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/HashvalueAlgorithm.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/ModifiedSelector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/selectors/modifiedselector/PropertiesfileCache.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/spi/Provider.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/spi/Service.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/Base64Converter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ChainedMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ClasspathUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/CollectionUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/CompositeMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ConcatFileInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ConcatResourceInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ContainerMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/DOMElementWriter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/DOMUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/DateUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/DeweyDecimal.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/FileNameMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/FileTokenizer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/FileUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/FirstMatchMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/FlatFileNameMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/GlobPatternMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/IdentityMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/IdentityStack.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/JAXPUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/JavaEnvUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/KeepAliveInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/KeepAliveOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LayoutPreservingProperties.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LazyFileOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LazyHashtable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LineOrientedOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LineOrientedOutputStreamRedirector.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LineTokenizer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LinkedHashtable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LoaderUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/MergingMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/OutputStreamFunneler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/PackageNameMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ProcessUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/PropertyOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ProxySetup.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ReaderInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ReflectUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ReflectWrapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ResourceUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/RetryHandler.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/Retryable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ScriptFixBSFPath.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ScriptRunner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ScriptRunnerBase.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ScriptRunnerCreator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/ScriptRunnerHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/SourceFileScanner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/SplitClassLoader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringTokenizer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/TaskLogger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/TeeOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/TimeoutObserver.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/Tokenizer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/UUEncoder.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/UnPackageNameMapper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/UnicodeUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/VectorSet.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/Watchdog.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/WeakishReference.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/WorkerAnt.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/XMLFragment.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/XmlConstants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/depend/AbstractAnalyzer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/depend/DependencyAnalyzer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/depend/bcel/AncestorAnalyzer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/depend/bcel/DependencyVisitor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/depend/bcel/FullAnalyzer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/facade/ImplementationSpecificArgument.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/java15/ProxyDiagnostics.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/optional/JavaxScriptRunner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/optional/NoExitSecurityManager.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/optional/ScriptRunner.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/optional/WeakishReference12.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/JakartaOroMatcher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/JakartaOroRegexp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/JakartaRegexpMatcher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/JakartaRegexpRegexp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/Jdk14RegexpMatcher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/Jdk14RegexpRegexp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/Regexp.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/RegexpFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/RegexpMatcher.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/RegexpMatcherFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/regexp/RegexpUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/version.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/bzip2/BZip2Constants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/bzip2/BlockSort.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/bzip2/CBZip2InputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/bzip2/CRC.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/mail/ErrorInQuitException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/mail/MailMessage.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/mail/SmtpResponseReader.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarArchiveSparseEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarBuffer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarConstants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarInputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/tar/TarUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/AbstractUnicodeExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/AsiExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/CentralDirectoryParsingZipExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ExtraFieldUtils.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/FallbackZipEncoding.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/GeneralPurposeBit.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/JarMarker.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/NioZipEncoding.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/Simple8BitZipEncoding.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/UnicodeCommentExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/UnicodePathExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/UnixStat.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/UnparseableExtraFieldData.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/UnrecognizedExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/UnsupportedZipFeatureException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/Zip64ExtendedInformationExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/Zip64Mode.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/Zip64RequiredException.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipConstants.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipEightByteInteger.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipEncoding.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipEncodingHelper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipEntry.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipExtraField.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipFile.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipLong.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipOutputStream.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipShort.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/zip/ZipUtil.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/resources/org/apache/tools/ant/taskdefs/javadoc-frame-injections-fix.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/resources/org/apache/tools/ant/types/resources/comparators/antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/resources/org/apache/tools/ant/types/resources/selectors/antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/ant create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/ant.bat create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/ant.cmd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/antRun create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/antRun.bat create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/antRun.pl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/antenv.cmd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/complete-ant-cmd.pl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/envset.cmd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/lcp.bat create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/runant.pl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/runant.py create mode 100644 framework/src/ant/apache-ant-1.9.6/src/script/runrc.cmd create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/antunit-base.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/bugfixes/README.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/bugfixes/br50866/br50866-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/bugfixes/br50866/common.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/bugfixes/br50866/middle.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/bugfixes/bugzilla-43324-stackoverflow-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/ant-attribute-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/bindtargets-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/classloader-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/createtask-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/dirscanner-symlinks-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/extension-point-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/extension/include-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/extension/module1.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/location/location.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/location/src/task/EchoLocation.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/magic-names-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/nested-elements-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/nested-text-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-cross-extension-ref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-cross-extension-ref.xmlref create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-cross-extension.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-cross-targets-ref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-cross-targets-ref.xmlref create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-cross-targets.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import-common.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import-commonref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import-ref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import-ref.xmlref create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import2-ref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/projecthelpers/build-many-import2-ref.xmlref create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/ref-propertyhelper-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/ref-psyntax-hint-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/target-test-helper.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/target-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/uuencode/src/task/BaseTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/uuencode/src/task/UUDecodeTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/uuencode/src/task/UUEncodeTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/core/uuencode/uuencode-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expandproperties-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expected/sort.sortComparator.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expected/sort.sortDefault.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expected/sort.sortReverse.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expected/sortuniq.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expected/uniq.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/expected/unique-columns.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/input/sort.sortDefault.test create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/input/uniq.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/input/unique-columns.txt create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/replacetokens-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/sort-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/striplinecomments-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/suffix-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/filters/uniq-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/junit-frames.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/junit-noframes.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/propertyhelpers.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/ant-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/antcall-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/apt-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/apt/AptExample.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/apt/Distributed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/apt/DistributedAnnotationFactory.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/apt/DistributedAnnotationProcessor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/augment-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/broken_cd.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/bunzip2-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/bzip2/expected create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/bzip2/multiple.bz2 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/checksum-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/commandlauncher/commandlauncher-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/concat-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/antversion-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/equals-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/filesmatch-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/hasfreespace-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/hasmethod-text.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/islastmodified-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/resourcecontains-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/condition/resourceexists-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/copy-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/cvs.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/checkoutlist create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/checkoutlist,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/commitinfo create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/commitinfo,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/config create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/config,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/cvswrappers create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/cvswrappers,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/history create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/loginfo create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/loginfo,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/modules create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/modules,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/notify create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/notify,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/postadmin create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/postadmin,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/postproxy create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/postproxy,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/posttag create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/posttag,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/postwatch create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/postwatch,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/preproxy create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/preproxy,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/rcsinfo create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/rcsinfo,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/taginfo create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/taginfo,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/val-tags create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/verifymsg create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/CVSROOT/verifymsg,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/ant module 2/test.txt,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/antmodule1/foo.txt,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/cvs/repository/antmodule3/yet another test.txt,v create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/defaultexcludes-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/delete-and-symlinks-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/delete-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/dependset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/dirname-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/ear-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/echo-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/echoxml-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/exec/apply-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/exec/exec-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/exec/expected/utf-8 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/exec/input/iso8859-1 create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/exec/parrot.sh create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/fail-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/get-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/gzip-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/hostinfo-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/import-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/import-url-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/a.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/b.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/nested.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/override.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/w.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/x.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/y.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/importtests/z.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/include-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/jar-spi-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/jar-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/java-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/javac-dir/bad-src/Bad.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/javac-dir/good-src/Simple.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/javac-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/javadoc-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/length-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/loadproperties-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/loadresource-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/local-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/macrodef-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/manifest-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/manifestclasspath-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/move-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/depend/depend-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/funtest-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/javah-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/junit/junit-formatter-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/junit/junit-outputtoformatters-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/junit/junit-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/junit/src/ExampleTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/junit/xmlformatter-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/native2ascii-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/propertyfile-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/propertyfilelayout-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/replaceregexp-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/script/scriptdef-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/unix/symlink-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/optional/windows/attrib-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/parallel-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/pathconvert-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/property-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/propertyfile-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/propertyhelper-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/replace-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/retry-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/rmic-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/secure-input.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/signjar-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/subant-helper/echo.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/subant-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/sync-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/tar-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/taskdef-antlib-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/taskdef-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/tempfile-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/touch-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/truncate/truncate-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/unzip-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/uptodate-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/utf-16.expected create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/utf-16.expected.windows create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/war-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/web.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/whichresource-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/xmlproperty-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/xmlproperty.inline-expansion.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/xmlproperty.multi.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/xslt-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/xslt/printParams-invalid.xsl create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/zip-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/taskdefs/zip/Bugzilla-42940.zip create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/build-embedded-ref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/conditions/isreference-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/conditions/matches-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/cutdirs-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/defer-reference-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/fileset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/filterset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/firstmatch-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/javaresource-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/mapper-ref.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/mappers/glob-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/mappers/packagemapper-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/modified-selector-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/path-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/patternset-invert-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/patternset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/propertyset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/archives-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/comparators/test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/concat-resource-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/fileresource-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/files-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/first-last-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/javaresource-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/latepath-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/multirootfileset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/resourcelist-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/resources-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/selectors/name-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/selectors/readwrite-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/selectors/test-componentdef.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/selectors/test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/tokens-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/resources/utf-16.in create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/depend-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/different-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/filename-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/modified-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/present-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/readwrite-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/selectors/select-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/tarfileset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/antunit/types/zipfileset-test.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/AntAssert.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/AntClassLoaderDelegationTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/AntClassLoaderPerformance.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/AntClassLoaderTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/BuildFileRule.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/BuildFileTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/CaseTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DefaultLoggerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DirectoryScannerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DispatchTaskTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskAbstract.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskInterface.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskOk.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskOkNonTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskWithNonPublicExecute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskWithNonVoidExecute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskWithoutDefaultConstructor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskWithoutExecute.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/DummyTaskWithoutPublicConstructor.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/ExecutorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/ExtendedTaskdefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/FileUtilities.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/ImmutableTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/IncludeTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/IntrospectionHelperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/LoaderRefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/LocationTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/MockBuildListener.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/PickOneTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/ProjectComponentTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/ProjectHelperRepositoryTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/ProjectTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/PropertyExpansionTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/PropertyFileCLITest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/TaskContainerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/TopLevelTaskTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/UnknownElementTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/XmlLoggerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/ConcatFilterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/DynamicFilterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/EscapeUnicodeTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/HeadTailTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/LineContainsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/NoNewLineTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/ReplaceTokensTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/StripJavaCommentsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/filters/TokenFilterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/launch/LocatorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/loader/AntClassLoader5Test.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/AbstractCvsTaskTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/AntLikeTasksAtTopLevelTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/AntStructureTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/AntTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/AntlibTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/AvailableTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/BUnzip2Test.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/BZip2Test.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/BasenameTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/CVSPassTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/CallTargetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ChecksumTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ConcatTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ConditionTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/CopyTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/CopydirTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/CopyfileTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DefaultExcludesTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DeleteTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DeltreeTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DemuxOutputTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DirnameTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DynamicTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/DynamicTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/EchoTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/EchoXMLTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ExecTaskTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ExecuteJavaTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ExecuteWatchdogTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/FailTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/FilterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/FixCrLfTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/GUnzipTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/GetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/GzipTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ImportTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/InitializeClassTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/InputTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/JarTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/JavacTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/JavadocTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/LoadFileTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/MacroDefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/MakeUrlTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ManifestTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/MkdirTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/MoveTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/MultiMapTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/NiceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ParallelTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/PathConvertTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/PreSetDefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ProcessDestroyerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/PropertyTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ProtectedJarMethodsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/RecorderTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/RenameTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ReplaceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/RmicAdvancedTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/RmicTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/SQLExecTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/SignJarTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/SleepTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/StyleTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/SubAntTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/SyncTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TStampTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TarTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TaskdefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TaskdefsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TestProcess.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TimeProcess.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TouchTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TypeAdapterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/TypedefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/UntarTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/UnzipTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/UpToDateTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/WarTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/WhichResourceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/XmlPropertyTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/XmlnsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ZipExtraFieldTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/ZipTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/AntVersionTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/ContainsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/EqualsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/HttpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/IsFailureTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/IsFileSelectedTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/IsReachableTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/IsReferenceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/IsSignedTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/ParserSupportsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/TypeFoundTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/condition/XorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/cvslib/ChangeLogParserTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/cvslib/ChangeLogWriterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/dir1/B.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/dir2/A.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/email/EmailAddressTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/email/EmailTaskTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/email/MessageTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/ANTLRTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/BeanShellScriptTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/JavahTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/JspcTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/Native2AsciiTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/PropertyFileTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/PvcsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/ReplaceRegExpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/RhinoReferenceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/RhinoScriptTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/RpmTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/SchemaValidateTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/XmlValidateCatalogTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/XmlValidateTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/XsltTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/i18n/TranslateTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/image/ImageTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/BatchTestTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/DOMUtilTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitClassLoaderTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestListenerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunnerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/JUnitVersionHelperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/NoVmCrash.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/Printer.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/Sleeper.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/SuiteMethodTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/TearDownOnVmCrashTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/TestFormatter.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/VmCrash.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/XMLFormatterWithCDATAOnSystemOut.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregatorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/net/FTPTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/script/ScriptDefTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/sos/SOSTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/splash/SplashScreenTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/ssh/ScpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/unix/SymlinkTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/taskdefs/optional/vss/MSVSSTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/AbstractFileSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/AddTypeTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/AssertionsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/CommandlineJavaTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/CommandlineTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/DescriptionTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/DirSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/EnumeratedAttributeTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/FileListTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/FileSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/FilterSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/FlexIntegerTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/MapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/PathTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/PatternSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/PermissionsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/PolyTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/RedirectorElementTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/ResourceOutputTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/TarFileSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/XMLCatalogBuildFileTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/XMLCatalogTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/ZipFileSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/mappers/GlobMapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/mappers/MapperResult.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/mappers/RegexpPatternMapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/optional/ScriptMapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/optional/ScriptSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/optional/depend/ClassFileSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/resources/FileResourceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/resources/JavaResourceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/resources/LazyResourceCollectionTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/resources/MultiRootFileSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/resources/ResourceListTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/resources/TarResourceTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/BaseSelectorRule.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/BaseSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/ContainsRegexpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/ContainsSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/DateSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/DependSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/DepthSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/FilenameSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/MockAlgorithm.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/MockCache.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/MockComparator.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/ModifiedSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/PresentSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/README create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/SignedSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/SizeSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/TokenizedPatternTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/types/selectors/TypeSelectorTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/Base64ConverterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/ClasspathUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/CollectionUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/DateUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/DeweyDecimalTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/GlobPatternMapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/JAXPUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/LayoutPreservingPropertiesTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/LazyFileOutputStreamTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/LineOrientedOutputStreamTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/LinkedHashtableTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/LoaderUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/PackageNameMapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/ReaderInputStreamTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/ResourceUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/StringUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/SymlinkUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/UnPackageNameMapperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/UnicodeUtilTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/XMLFragmentTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/facade/FacadeTaskHelperTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/facade/ImplementationSpecificArgumentTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/JakartaOroMatcherTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/JakartaOroRegexpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/JakartaRegexpMatcherTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/JakartaRegexpRegexpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/Jdk14RegexpMatcherTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/Jdk14RegexpRegexpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpMatcherTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/ant/util/regexp/RegexpTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/bzip2/BlockSortTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/bzip2/CBZip2StreamTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/mail/MailMessageTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/tar/TarEntryTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/tar/TarOutputStreamTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/tar/TarRoundTripTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/AsiExtraFieldTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/ExtraFieldUtilsTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/UTF8ZipFilesTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/ZipEncodingTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/ZipLongTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/ZipOutputStreamTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/apache/tools/zip/ZipShortTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/AbstractJUnit3TestMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/AbstractJUnit3TestNotMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/AbstractTestMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/AbstractTestNotMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/JUnit3NonTestMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/JUnit3TestNotMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/JUnit4Skippable.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/MultilineAsserts.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/NonTestMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/Output.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/TestNotMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/TestWithSuiteNotMissed.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/ThreadedOutput.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/Timeout.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/junit/XmlParserTest.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/tasks/TaskdefTestContainerTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/tasks/TaskdefTestSimpleTask.java create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/tasks/antlib.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/tasks/antlib2.xml create mode 100644 framework/src/ant/apache-ant-1.9.6/src/tests/junit/org/example/types/TypedefTestType.java create mode 100644 framework/src/maven/apache-maven-3.3.3/DEPENDENCIES create mode 100644 framework/src/maven/apache-maven-3.3.3/LICENSE create mode 100644 framework/src/maven/apache-maven-3.3.3/NOTICE create mode 100644 framework/src/maven/apache-maven-3.3.3/README.md create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/README.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/bin/m2.conf create mode 100755 framework/src/maven/apache-maven-3.3.3/apache-maven/src/bin/mvn create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/bin/mvn.cmd create mode 100755 framework/src/maven/apache-maven-3.3.3/apache-maven/src/bin/mvnDebug create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/bin/mvnDebug.cmd create mode 100755 framework/src/maven/apache-maven-3.3.3/apache-maven/src/bin/mvnyjp create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/conf/logging/simplelogger.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/conf/settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/conf/toolchains.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/lib/ext/README.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/main/appended-resources/META-INF/LICENSE.vm create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/main/assembly/bin.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/main/assembly/src.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/apache-maven/src/test/java/org/apache/maven/settings/GlobalSettingsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/build.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/deploySite.sh create mode 100644 framework/src/maven/apache-maven-3.3.3/doap_Maven.rdf create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorReaderDelegate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/LocalSnapshotMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/LocalSnapshotMetadataGenerator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenAetherModule.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenSnapshotMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/MavenWorkspaceReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/RelocatedArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/RemoteSnapshotMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/RemoteSnapshotMetadataGenerator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/SnapshotMetadataGeneratorFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/VersionsMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/VersionsMetadataGenerator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/VersionsMetadataGeneratorFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/package-info.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReaderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/DefaultVersionResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/MavenRepositorySystemUtilsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/RepositorySystemTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/util/ConsoleRepositoryListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/java/org/apache/maven/repository/internal/util/ConsoleTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/org/apache/maven/its/dep-mng5324/07.20.3-SNAPSHOT/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/org/apache/maven/its/dep-mng5459/0.4.0-SNAPSHOT/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/artifact/1.0/artifact-1.0-classifier.zip create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/artifact/1.0/artifact-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/artifact/1.0/artifact-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/artifact/1.0/artifact-1.0.zip create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/artifact/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/dependency/1.0/dependency-1.0-sources.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/dependency/1.0/dependency-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/dependency/1.0/dependency-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/dependency/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/parent/1.0/parent-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-aether-provider/src/test/resources/repo/ut/simple/parent/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-ant-tasks-2.1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/Artifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/ArtifactUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/DefaultArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/InvalidArtifactRTException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/handler/ArtifactHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/repository/ArtifactRepository.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryPolicy.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/repository/Authentication.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/repository/layout/ArtifactRepositoryLayout.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/repository/layout/ArtifactRepositoryLayout2.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataStoreException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/AbstractArtifactResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ArtifactNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/CyclicDependencyException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/MultipleArtifactsNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/resolver/filter/ArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ArtifactVersion.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/DefaultArtifactVersion.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/InvalidVersionSpecificationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/OverConstrainedVersionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/Restriction.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/VersionRange.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/repository/Proxy.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/ComparableVersionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/VersionRangeTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/DefaultProblem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/DefaultProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/FileSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/Problem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/ProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/ProblemCollectorFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/Source.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/StringSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/main/java/org/apache/maven/building/UrlSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/java/org/apache/maven/building/DefaultProblemCollectorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/java/org/apache/maven/building/DefaultProblemTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/java/org/apache/maven/building/FileSourceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/java/org/apache/maven/building/ProblemCollectorFactoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/java/org/apache/maven/building/StringSourceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/java/org/apache/maven/building/UrlSourceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-builder-support/src/test/resources/source.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactScopeEnum.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/ArtifactStatus.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/UnknownRepositoryLayoutException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/deployer/ArtifactDeployer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/deployer/ArtifactDeploymentException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/installer/ArtifactInstallationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/installer/ArtifactInstaller.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/installer/DefaultArtifactInstaller.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/manager/WagonConfigurationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/manager/WagonManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/ArtifactRepositoryFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepository.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/layout/FlatRepositoryLayout.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/GroupRepositoryMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/MetadataBridge.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/MetadataUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataReadException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/repository/metadata/SnapshotArtifactRepositoryMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/ArtifactCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DebugResolutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/ResolutionListenerForDepMgmt.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/UnresolvedArtifacts.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/WarningResolutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/filter/InversionArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/filter/OrArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/resolver/filter/TypeArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/artifact/versioning/ManagedVersionMap.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/execution/RuntimeInformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/DefaultMavenProfilesBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/DefaultProfileManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/MavenProfilesBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/ProfileManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/ProfilesConversionUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/DetectedProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/FileProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/JdkPrefixProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/OperatingSystemProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/ProfileActivationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/ProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/profiles/activation/SystemPropertyProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/DefaultProjectBuilderConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/InvalidProjectModelException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/MavenProjectBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/MissingRepositoryElementException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/ModelUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/ProjectBuilderConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/ProjectUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/inheritance/ModelInheritanceAssembler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/AbstractStringBasedModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/BuildTimestampValueSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/ModelInterpolationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/ModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/PathTranslatingPostProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/RegexBasedModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/interpolation/StringSearchModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/path/DefaultPathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/validation/DefaultModelValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/validation/ModelValidationResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/project/validation/ModelValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/reporting/MavenReportException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/DefaultMirrorSelector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/MavenArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/MetadataGraph.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/MetadataGraphNode.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/MetadataResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/MetadataResolutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/MirrorSelector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/UserLocalArtifactRepository.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/VersionNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/ChecksumFailedException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultWagonManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/LegacyRepositorySystem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/MavenArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/TransferListenerAdapter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/UpdateCheckManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/WagonConfigurationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/WagonManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/repository/ArtifactRepositoryFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/repository/DefaultArtifactRepositoryFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/LegacyArtifactCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/ConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/ConflictResolverFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/ConflictResolverNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/DefaultConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/DefaultConflictResolverFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/FarthestConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/NearestConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/OldestConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/AbstractVersionTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/ArtifactTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/ArtifactTransformationManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/DefaultArtifactTransformationManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/LatestArtifactTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/ReleaseArtifactTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/transform/SnapshotTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/ArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/ClasspathContainer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/ClasspathTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/DefaultClasspathTransformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolutionPolicy.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/GraphConflictResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/GraphConflictResolutionPolicy.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/GraphConflictResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataGraph.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataGraphEdge.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataGraphTransformationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataGraphVertex.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataResolution.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataResolutionRequestTypeEnum.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataResolutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataRetrievalException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/repository/metadata/MetadataTreeNode.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/usability/plugin/ExpressionDocumentationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/java/org/apache/maven/usability/plugin/ExpressionDocumenter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/mdo/paramdoc.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/mdo/profiles.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/resources/META-INF/maven/plugin-expressions/project.paramdoc.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/resources/META-INF/maven/plugin-expressions/rootless.paramdoc.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/resources/META-INF/maven/plugin-expressions/settings.paramdoc.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/main/resources/META-INF/maven/plugin.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/ArtifactUtilsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/DefaultArtifactTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/deployer/SimpleArtifactMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/factory/DefaultArtifactFactoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/handler/ArtifactHandlerMock.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/installer/ArtifactInstallerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/metadata/TestMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/repository/MavenArtifactRepositoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolutionExceptionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/TestFileWagon.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/TestTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilterTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/FilterHashEqualsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/OrArtifactFilterTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/ScopeArtifactFilterTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/testutils/TestFileManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/profiles/manager/DefaultProfileManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/ClasspathArtifactResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/EmptyLifecyclePluginAnalyzer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/LegacyLocalRepositoryManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/ModelUtilsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/ProjectClasspathTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/TestArtifactResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/TestMavenRepositorySystem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/TestProjectBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/AbstractProjectInheritanceTestCase.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t00/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t01/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t02/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t03/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t04/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t05/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t06/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t07/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t08/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t09/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t10/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t11/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t12/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/inheritance/t12scm/ProjectInheritanceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/project/path/DefaultPathTranslatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/DefaultMirrorSelectorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositoryLayout.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/MirrorProcessorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/LegacyRepositorySystemTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/PerLookupWagon.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/StringWagon.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/WagonA.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/WagonB.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/WagonC.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/WagonMock.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/AbstractConflictResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/FarthestConflictResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/NearestConflictResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/conflict/OldestConflictResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultClasspathTransformationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolutionPolicyTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/metadata/DefaultGraphConflictResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/java/org/apache/maven/repository/metadata/TestMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/remote-repo/org/apache/maven/its/a/0.1/a-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/remote-repo/org/apache/maven/its/a/0.1/a-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/remote-repo/org/apache/maven/its/a/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/remote-repo/org/apache/maven/its/b/0.1/b-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/remote-repo/org/apache/maven/its/b/0.1/b-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/remote-repo/org/apache/maven/its/b/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/repository-system/maven-core-2.1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/artifact-install/artifact-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t00/maven/poms/p0-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t00/maven/poms/p1-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t00/maven/poms/p2-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t00/maven/poms/p3-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t00/maven/poms/p4-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t01/maven.t01/poms/p0-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t01/maven.t01/poms/p1-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t01/maven.t01/poms/p2-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t01/maven.t01/poms/p3-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t01/maven.t01/poms/p4-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t02/p0/p1/p2/p3/p4/p5/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t02/p0/p1/p2/p3/p4/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t02/p0/p1/p2/p3/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t02/p0/p1/p2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t02/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t02/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t03/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t03/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/jars/t04-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/jars/t04-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/jars/t04-b-2.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/jars/t04-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/jars/t04-c-2.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/poms/t04-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/poms/t04-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/poms/t04-b-2.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/poms/t04-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/maven-test/poms/t04-c-2.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t04/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-a-2.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-b-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-b-2.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-d-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/jars/t05-d-1.2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-a-2.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-b-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-b-2.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-d-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/maven-test/poms/t05-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t05/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-b-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-d-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/jars/t06-d-1.2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-b-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-d-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/maven-test/poms/t06-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t06/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-b-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-d-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/jars/t07-d-1.2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-b-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-d-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/maven-test/poms/t07-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t07/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-b-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-d-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/jars/t08-d-1.2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-b-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-d-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/maven-test/poms/t08-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t08/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/jars/t09-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/jars/t09-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/jars/t09-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/jars/t09-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/poms/t09-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/poms/t09-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/poms/t09-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/maven-test/poms/t09-d-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/p0/p2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t09/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/maven-test/jars/t10-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/maven-test/jars/t10-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/maven-test/jars/t10-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/maven-test/poms/t10-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/maven-test/poms/t10-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/maven-test/poms/t10-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t10/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t11/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t11/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t12/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t12/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t12scm/maven/p0/1.0/p0-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t12scm/maven/p1/1.0/p1-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t12scm/p0/modules/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/inheritance-repo/t12scm/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/marker.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/jars/maven-test-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/jars/maven-test-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/jars/maven-test-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/jars/maven-test-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/poms/maven-test-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/poms/maven-test-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/poms/maven-test-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/poms/maven-test-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/maven-test/poms/maven-test-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-a-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-a-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-b-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-b-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-e-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-e-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/local-repo/snapshot-test/poms/maven-test-snapshot-resolving-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/org/apache/maven/artifact/deployer/ArtifactDeployerTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/org/apache/maven/artifact/installer/ArtifactInstallerTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/org/apache/maven/artifact/manager/DefaultWagonManagerTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/org/apache/maven/artifact/resolver/ArtifactResolverTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/org/apache/maven/artifact/resolver/ArtifactUpdatePolicyTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/org/apache/maven/project/AbstractMavenProjectTestCase.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/projects/scope/project-with-scoped-dependencies.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/projects/scope/transitive-compile-dep.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/projects/scope/transitive-default-dep.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/projects/scope/transitive-provided-dep.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/projects/scope/transitive-runtime-dep.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-compat/src/test/resources/projects/scope/transitive-test-dep.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/lifecycle-executor.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/plugin-manager.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/project-builder.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/ArtifactFilterManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/ArtifactFilterManagerDelegate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/BuildAbort.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/BuildFailureException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/DefaultArtifactFilterManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/DefaultMaven.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/DuplicateProjectException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/InternalErrorException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/Maven.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/MavenExecutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/MissingModuleException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/ProjectBuildFailureException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/ProjectCycleException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/ProjectDependenciesResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/ReactorReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/SessionScoped.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/DependencyResolutionRequiredException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/InvalidRepositoryException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/factory/ArtifactFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/factory/DefaultArtifactFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/handler/DefaultArtifactHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/handler/manager/ArtifactHandlerManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/handler/manager/DefaultArtifactHandlerManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/metadata/AbstractArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadataRetrievalException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/metadata/ArtifactMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/metadata/ResolutionGroup.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/DefaultRepositoryRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/LegacyLocalRepositoryManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/MavenArtifactRepository.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/RepositoryCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/RepositoryRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/layout/DefaultRepositoryLayout.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/AbstractRepositoryMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/ArtifactRepositoryMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataDeploymentException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataInstallationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/RepositoryMetadataResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/io/DefaultMetadataReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/io/MetadataParseException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/repository/metadata/io/MetadataReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/ArtifactResolutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/DefaultResolutionErrorHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/ResolutionErrorHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/ResolutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/ResolutionNode.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/AbstractScopeArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/CumulativeScopeArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ExcludesArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ExclusionSetFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/IncludesArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/artifact/resolver/filter/ScopeArtifactFilter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/ArtifactClassRealmConstituent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmConstituent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmManagerDelegate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/ClassRealmRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/ExceptionHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/exception/ExceptionSummary.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/AbstractExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/BuildFailure.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/BuildSuccess.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/BuildSummary.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequestPopulator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/ExecutionEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/ExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequestPopulationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequestPopulator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MojoExecutionEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/MojoExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/ProjectExecutionEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/ProjectExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/SettingsAdapter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/scope/MojoExecutionScoped.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/scope/WeakMojoExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/scope/internal/MojoExecutionScope.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/scope/internal/MojoExecutionScopeCoreModule.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/execution/scope/internal/MojoExecutionScopeModule.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExports.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExtensionEntry.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/graph/FilteredProjectDependencyGraph.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/graph/GraphBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/internal/aether/LoggingRepositoryListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/LifeCyclePluginAnalyzer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/Lifecycle.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleMappingDelegate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/MavenExecutionPlan.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/MissingProjectException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/MojoExecutionConfigurator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/NoGoalSpecifiedException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuildListCalculator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuildThreadFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/CompoundProjectExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultExecutionEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultExecutionEventCatapult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultMojoExecutionConfigurator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultProjectArtifactFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DependencyContext.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionEventCatapult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ExecutionPlanItem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/GoalTask.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDebugLogger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecyclePluginResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleTask.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoDescriptorCreator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/PhaseRecorder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ProjectArtifactFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ProjectBuildList.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ProjectIndex.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ProjectSegment.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ReactorBuildStatus.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ReactorContext.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/TaskSegment.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/Builder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ConcurrencyDependencyGraph.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/singlethreaded/SingleThreadedBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/mapping/DefaultLifecycleMapping.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/mapping/Lifecycle.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/lifecycle/mapping/LifecycleMapping.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/monitor/event/EventDispatcher.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/monitor/event/EventMonitor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/BuildPluginManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/CacheUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/CompoundMojoExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/CycleDetectedInPluginGraphException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DebugConfigurationListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginDescriptorException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/LegacySupport.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginConfigurationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginContainerException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorParsingException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginExecutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginLoaderException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginParameterExpressionEvaluator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/PluginResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultLegacySupport.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/PlexusUtilsInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/PluginDependenciesResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/PluginDependencyResolutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/ValidatingConfigurationListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/internal/WagonExcluder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/DefaultPluginPrefixRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/NoPluginFoundForPrefixException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/PluginPrefixRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/PluginPrefixResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/PluginPrefixResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/DefaultPluginVersionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/PluginVersionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultDependencyResolutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectHelper.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultModelBuildingListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DependencyResolutionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DuplicateArtifactAttachmentException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/DuplicateProjectException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/InvalidProjectVersionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/MavenProject.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/MavenProjectHelper.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingHelper.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectDependenciesResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectModelResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectRealmCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ProjectSorter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ReactorModelCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/ReactorModelPool.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/RepositorySessionDecorator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/ActiveProjectArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/ArtifactWithDependencies.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/AttachedArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/InvalidDependencyVersionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/PluginArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/ProjectArtifact.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/artifact/ProjectArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/project/path/PathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/properties/internal/EnvironmentUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/properties/internal/SystemProperties.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/ArtifactDoesNotExistException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/ArtifactTransferEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/ArtifactTransferFailedException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/ArtifactTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/ArtifactTransferResource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/DelegatingLocalArtifactRepository.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/LocalArtifactRepository.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/LocalRepositoryNotAccessibleException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/RepositorySystem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/legacy/metadata/AbstractArtifactMetadata.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataRetrievalException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/legacy/metadata/DefaultMetadataResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/legacy/metadata/MetadataResolutionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/repository/legacy/metadata/ResolutionGroup.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScope.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScopeModule.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/settings/DefaultMavenSettingsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/settings/MavenSettingsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/settings/SettingsConfigurationException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/settings/SettingsUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchain.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainManagerPrivate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/DefaultToolchainsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/MisconfiguredToolchainException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcher.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/Toolchain.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainManagerPrivate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/ToolchainsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/DefaultToolchainsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/DefaultToolchainsBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/DefaultToolchainsBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/ToolchainsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/ToolchainsBuildingException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/ToolchainsBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/building/ToolchainsBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/io/DefaultToolchainsReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/io/ToolchainsParseException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/io/ToolchainsReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/java/DefaultJavaToolChain.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/toolchain/merge/MavenToolchainMerger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/mdo/extension.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/mdo/toolchains.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/META-INF/maven/extension.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/META-INF/plexus/artifact-handlers.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/META-INF/plexus/components.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/build.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_de.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_el.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_en.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_es.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_fr.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_ja.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_ko.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_nl.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_no.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_pl.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/messages/messages_zh_CN.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/main/resources/org/apache/maven/project/standalone.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/artifact-handlers.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/configuration-management.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/default-bindings.apt.vm create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/getting-to-container-configured-mojos.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/inheritance.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/lifecycles.apt.vm create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/offline-mode.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/plugin-execution-isolation.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/apt/scripting-support/marmalade-support.apt create mode 100755 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/resources/design/2.1-lifecycle-refactor-class-diagram.png create mode 100755 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/resources/design/2.1-lifecycle-refactor-sequence-diagram.png create mode 100755 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/resources/design/2.1-lifecycle-refactor.graffle create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/DefaultMavenTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/MavenTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/ProjectDependenciesResolverTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/artifact/handler/ArtifactHandlerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/exception/DefaultExceptionHandlerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/execution/DefaultMavenExecutionRequestPopulatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/execution/DefaultMavenExecutionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/execution/scope/internal/MojoExecutionScopeTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/graph/DefaultProjectDependencyGraphTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/DelegatingMojoExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/DelegatingProjectExecutionListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/EmptyLifecyclePluginAnalyzer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorSubModulesTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/MojoExecutionXPathContainer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuildListCalculatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ConcurrencyDependencyGraphTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculatorImplTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/PhaseRecorderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ProjectBuildListTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/AboutTheStubs.html create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/BuildPluginManagerStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/CompletionServiceStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ExecutionEventCatapultStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifeCyclePluginAnalyzerStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleTaskSegmentCalculatorStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LoggerStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/PluginPrefixResolverStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/PluginVersionResolverStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependenciesResolverStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependencyGraphStub.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependencyGraphStubTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExceptionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/plugin/PluginParameterExpressionEvaluatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/plugin/internal/DefaultLegacySupportTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/EmptyProjectBuildingHelper.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/ExtensionDescriptorBuilderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/LegacyLocalRepositoryManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/MavenProjectTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/ProjectSorterTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/TestMetadataSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/artifact/DefaultMavenMetadataCacheTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/artifact/MavenMetadataSourceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/canonical/CanonicalProjectBuilderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/harness/PomTestWrapper.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/harness/Xpp3DomAttributeIterator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/harness/Xpp3DomAttributePointer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/harness/Xpp3DomNodeIterator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/harness/Xpp3DomNodePointer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/project/harness/Xpp3DomPointerFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/repository/LegacyRepositoryLayout.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/repository/TestArtifactHandler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/repository/TestRepositoryConnector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/repository/TestRepositoryConnectorFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/repository/TestRepositorySystem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/settings/SettingsUtilsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerPrivateTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/DefaultToolchainTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/RequirementMatcherFactoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/building/DefaultToolchainsBuilderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/building/ToolchainsBuildingExceptionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/java/org/apache/maven/toolchain/merge/MavenToolchainMergerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/default-maven/cyclic-reference/module-a/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/default-maven/cyclic-reference/module-b/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/default-maven/cyclic-reference/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/mojo-configuration/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-basic/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/src/main/java/org/apache/maven/lifecycle/test/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/src/test/java/org/apache/maven/lifecycle/test/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-multiple-executions/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-multiple-executions/src/main/mdo/remote-resources.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-multiple-executions/src/main/mdo/supplemental-model.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-executor/project-with-plugin-level-configuration-only/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-listener/lifecycle-participant-reactor-dependency-injection/module-a/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-listener/lifecycle-participant-reactor-dependency-injection/module-b/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/lifecycle-listener/lifecycle-participant-reactor-dependency-injection/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/mng-5003-plugin-realm-cache/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-contributing-system-scope-plugin-dep/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-contributing-system-scope-plugin-dep/tools.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-build-extensions-plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/a/0.1/a-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/a/0.1/a-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/a/0.2/a-0.2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/a/0.2/a-0.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/a/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/b/0.1/b-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/b/0.1/b-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/b/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/c/0.1/c-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/c/0.1/c-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/c/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/d/0.1/d-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/d/0.1/d-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/d/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/e/0.1/e-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/e/0.1/e-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/repo/org/apache/maven/its/mng3906/e/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/plugin-manager/project-with-plugin-classpath-ordering/sub/settings-template.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/it0063/jdk/jre/placeholder.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/it0063/jdk/lib/tools.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/it0063/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/mng-3023/consumer/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/mng-3023/dependency/dependency-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/mng-3023/dependency/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-builder/mng-3023/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-dependencies-resolver/it0063/jdk/jre/placeholder.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-dependencies-resolver/it0063/jdk/lib/tools.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-dependencies-resolver/it0063/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/projects/project-dependencies-resolver/project-with-exclusions/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/a/0.1/a-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/a/0.1/a-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/a/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/b/0.1/b-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/b/0.1/b-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/b/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/plugins/maven-it-plugin/0.1/maven-it-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/plugins/maven-it-plugin/0.1/maven-it-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/plugins/maven-it-plugin/0.1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/plugins/maven-it-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/its/plugins/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/maven/2.0/maven-2.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-clean-plugin/0.1/maven-clean-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-clean-plugin/0.1/maven-clean-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-clean-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-compiler-plugin/0.1/maven-compiler-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-compiler-plugin/0.1/maven-compiler-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-compiler-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-deploy-plugin/0.1/maven-deploy-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-deploy-plugin/0.1/maven-deploy-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-deploy-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-install-plugin/0.1/maven-install-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-install-plugin/0.1/maven-install-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-install-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-jar-plugin/0.1/maven-jar-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-jar-plugin/0.1/maven-jar-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-plugin-plugin/0.1/maven-plugin-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-plugin-plugin/0.1/maven-plugin-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-plugin-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-resources-plugin/0.1/maven-resources-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-resources-plugin/0.1/maven-resources-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-resources-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-surefire-plugin/0.1/maven-surefire-plugin-0.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-surefire-plugin/0.1/maven-surefire-plugin-0.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/apache/maven/plugins/maven-surefire-plugin/maven-metadata.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/remote-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/artifact-id-inheritance/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/artifact-id-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/basedir-aligned-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/basedir-interpolation/pom-with-unusual-name.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/baseurl-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/boolean-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/build-extension-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/build-extension-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/complete-model/w-parent/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/complete-model/w-parent/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/complete-model/wo-parent/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/config-with-plugin-mng/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/consecutive_empty_elements/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/contributors-inheritance/child-2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/contributors-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-inheritance/maven-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-management-with-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-management-with-interpolation/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-scope-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-scope-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-scope/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dependency-scope/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/developers-inheritance/child-2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/developers-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/distribution-management/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dual-execution-ids/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/dual-execution-ids/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/duplicate-exclusions-dependency/nexus-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/duplicate-exclusions-dependency/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/duplicate-exclusions-dependency/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/empty-distMng-repo-url/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/empty-scm/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/equal-plugin-deps/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/equal-plugin-exec-ids/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/execution-configuration-join/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/execution-configuration-subcollections/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/execution-configuration/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/foo/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/full-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/id-container-joining-with-empty-elements/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/id-container-joining-with-empty-elements/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/inherited-properties-interpolation/active-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/inherited-properties-interpolation/active-profile/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/inherited-properties-interpolation/no-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/inherited-properties-interpolation/no-profile/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/interpolation-cli-wins/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/jdk-activation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/join-different-containers-same-id/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/licenses-inheritance/child-2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/licenses-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/limited-inheritance/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/limited-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/mailing-lists-inheritance/child-2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/mailing-lists-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/managed-profile-dependency/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/managed-profile-dependency/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-filter-order/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-filter-order/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-class-path-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-class-path-order/w-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-class-path-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-class-path-order/wo-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-goals-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-goals-order/w-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-goals-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-goals-order/wo-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-order/w-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/merged-plugin-exec-order/wo-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/micromailer/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/micromailer/spice-parent-9.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/multiple-filters/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/multiple-repos/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/multiple-repos/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/nested-build-dir-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-inheritance/child3.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-interpolation/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-pom-packaging/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/parent-pom-packaging/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/platform-file-separator/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-append/no-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-append/no-profile/subproject/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-append/with-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-append/with-profile/subproject/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-attributes/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-attributes/w-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-attributes/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-merging/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-merging/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-config-properties/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-config-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-config-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-goals-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-goals-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-inheritance/w-merge/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-inheritance/wo-merge/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging-version-insensitive/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging-version-insensitive/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging-wo-version/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging-wo-version/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging/w-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-merging/wo-plugin-mngt/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-order-and-default-exec/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-order-with-lifecycle/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-order/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-order/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-w-and-wo-id/w-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-exec-w-and-wo-id/wo-plugin-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-inheritance-merge-order/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-inheritance-merge-order/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-inheritance-order/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-inheritance-order/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-inheritance-simple/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-inheritance-simple/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-dependencies/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-dependencies/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-duplicate/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-duplicate/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-for-implicit-plugin/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-for-implicit-plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-management-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-merge-simple/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-order/nexus-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/plugin-order/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/pluginmanagement-inherited/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/pluginmanagement-inherited/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/pom-encoding/latin-1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/pom-encoding/utf-8/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/pom-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/pom-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/prerequisites-inheritance/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/prerequisites-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-default-deactivation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-dependencies-multiple-profiles/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-injected-dependencies/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-injection-order/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-module-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-module-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-module/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-plugin-mng-dependencies/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-plugin-mng-dependencies/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-plugins/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/profile-properties-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/properties-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/properties-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/properties-no-duplication/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/properties-no-duplication/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/repo-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/reporting-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/reporting-plugin-config/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/reporting-plugin-config/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/single-configuration-inheritance/jetty-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/single-configuration-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/sytem-property-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unc-path/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unc-path/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-repo-id/artifact-repo-in-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-repo-id/artifact-repo/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-repo-id/plugin-repo-in-profile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unique-repo-id/plugin-repo/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unprefixed-expression-interpolation/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/unprefixed-expression-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-append/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-append/parent/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-inheritance/another-parent/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-inheritance/another-parent/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-inheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-inheritance/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/url-no-decoding/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/xml-coalesce-text/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/xml-markup-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/xml-whitespace/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-project-builder/xml-whitespace/sub/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-settings/repositories/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-settings/repositories/settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-settings/settings-no-pom/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-settings/settings-no-pom/settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-settings/test-pom-and-settings-interpolation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources-settings/test-pom-and-settings-interpolation/settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/META-INF/plexus/components.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/canonical-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/dependencyManagement-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/distributionManagement-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-a-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-b-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-c-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-d-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/jars/maven-test-d-1.2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-a-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-b-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-c-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-d-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/maven-test/poms/maven-test-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/p0/p1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/p0/p2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/p0/p3/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/p0/p4/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/imports-repo/t01/p0/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/marker.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/jars/maven-test-a-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/jars/maven-test-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/jars/maven-test-c-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/jars/maven-test-d-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/poms/maven-test-a-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/poms/maven-test-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/poms/maven-test-c-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/poms/maven-test-d-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/maven-test/poms/maven-test-d-1.2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-a-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-a-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-b-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-b-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-e-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/jars/maven-snapshot-e-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/local-repo/snapshot-test/poms/maven-test-snapshot-resolving-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/MavenLifecycleParticipantTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/execution/test-extension-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/junit/junit/3.8.1/junit-3.8.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/junit/junit/3.8.1/junit-3.8.1.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/junit/junit/3.8.1/junit-3.8.1.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/junit/junit/3.8.1/junit-3.8.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/junit/junit/3.8.1/junit-3.8.1.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/junit/junit/3.8.1/junit-3.8.1.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/apache/3/apache-3.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/apache/3/apache-3.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/apache/3/apache-3.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/artifact/maven-artifact/3.0-SNAPSHOT/maven-artifact-3.0-SNAPSHOT.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-extension/1/test-extension-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-extension/1/test-extension-1.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/core/test/test-lifecycle-and-artifactHandler/1/test-lifecycle-and-artifactHandler-1.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/maven-parent/4/maven-parent-4.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/maven-parent/4/maven-parent-4.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/maven-parent/5/maven-parent-5.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/maven-parent/5/maven-parent-5.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/maven-parent/5/maven-parent-5.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon-provider-api/1.0-beta-2/wagon-provider-api-1.0-beta-2.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/apache/maven/wagon/wagon/1.0-beta-2/wagon-1.0-beta-2.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-active-collections/1.0-beta-1/plexus-active-collections-1.0-beta-1.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-10/plexus-classworlds-1.2-alpha-10.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-component-api/1.0-alpha-32/plexus-component-api-1.0-alpha-32.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-components/1.1.6/plexus-components-1.1.6.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-16/plexus-container-default-1.0-alpha-16.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-container-default/1.0-alpha-32/plexus-container-default-1.0-alpha-32.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-containers/1.0-alpha-32/plexus-containers-1.0-alpha-32.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-containers/1.0-alpha-32/plexus-containers-1.0-alpha-32.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-containers/1.0-alpha-32/plexus-containers-1.0-alpha-32.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus-utils/1.4.5/plexus-utils-1.4.5.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.11/plexus-1.0.11.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.11/plexus-1.0.11.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.11/plexus-1.0.11.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.4/plexus-1.0.4.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.8/plexus-1.0.8.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/extension/test-extension-repo/repo-marker.txt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/lifecycle/LifecycleExecutorTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/lifecycle/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/plugin/PluginManagerTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/AbstractMavenProjectTestCase.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/PomConstructionTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/buildFromFile/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/buildFromRepo/tests/project-caching/1/project-caching-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/buildFromRepo/tests/project-caching/maven-metadata-local.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/buildModelLineage/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/resolveParentPom/childAndParent/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/resolveParentPom/childAndParent/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/project/workspace/resolveParentPom/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/settings/PomConstructionWithSettingsTest.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/toolchain/global.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/toolchain/model/toolchains-jdks-extend.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/toolchain/model/toolchains-jdks-extra.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/toolchain/model/toolchains-jdks.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/apache/maven/toolchain/user.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom.sha1 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/project-dynamism/plugin-level-dep.pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/project-dynamism/pom-interp.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/project-dynamism/pom-relative.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/project-dynamism/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/bad-dependency.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/bad-project.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/base-directory-alignment/project-which-needs-directory-alignment-child.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/base-directory-alignment/project-which-needs-directory-alignment.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/base-directory-alignment/subproject/project-which-needs-directory-alignment-child.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/build-path-expression-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/build.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/child-which-inherits-from-super-model.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/child-with-bogus-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/child.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/duplicate-plugins-merged-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/fully-populated-child.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/grandchild-check/child/grandchild/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/grandchild-check/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/grandchild-check/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/import-scope-pom-resolves-from-property-based-repository.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/modelsource/module01/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/modelsource/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/project.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/projects/versionless-managed-dependency.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/maven-test/jars/maven-test-b-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/maven-test/jars/maven-test-b-1.0.jar.md5 create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/maven-test/poms/maven-test-b-1.0.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/snapshot-test/jars/maven-snapshot-a-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/snapshot-test/jars/maven-snapshot-a-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/snapshot-test/jars/maven-snapshot-b-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/snapshot-test/jars/maven-snapshot-b-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/snapshot-test/jars/maven-snapshot-c-1.0-SNAPSHOT.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-1/snapshot-test/jars/maven-snapshot-c-1.0-SNAPSHOT.jar.snapshot-version create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/remote-repo-2/maven-test/jars/maven-test-z-1.0.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-core/src/test/resources/withActiveByDefaultProfile-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/examples/simple-project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/examples/simple-project/settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/examples/simple-project/src/main/java/org/apache/maven/embedder/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/examples/simple-project/src/test/java/org/apache/maven/embedder/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/CliRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/configuration/ConfigurationProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/configuration/SettingsXmlConfigurationProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/DefaultEventSpyContext.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/BaseSlf4jConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jConfigurationFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jLogger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jLoggerManager.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/Slf4jStdoutLogger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Log4j2Configuration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/LogbackConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/Slf4jSimpleConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/UnsupportedSlf4jBindingConfiguration.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/transfer/AbstractMavenTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/transfer/BatchModeMavenTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/transfer/ConsoleMavenTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/transfer/QuietMavenTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/apache/maven/cli/transfer/Slf4jMavenTransferListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/slf4j/MavenSlf4jFriend.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/java/org/slf4j/impl/MavenSlf4jSimpleFriend.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/mdo/core-extensions.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/resources/META-INF/MANIFEST.MF create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/main/resources/META-INF/maven/slf4j-configuration.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/site/apt/cli.apt.vm create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/site/apt/index.apt.vm create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/site/apt/logging.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/embedder-test-project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/embedder-test-project/src/main/java/org/apache/maven/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/embedder-test-project/src/test/java/org/apache/maven/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/aggregate-mojo-failure/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/aggregate-mojo-failure/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/aggregate-mojo-failure/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-build-plan/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-build-plan/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-build-plan/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-dep-version/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-direct-deps/local-repo/org/apache/maven/errortest/test-maven-ext/1/test-maven-ext-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-direct-deps/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-dep-ver/local-repo/org/apache/maven/errortest/bad-ext-plugin-dep-ver-maven-plugin/1/bad-ext-plugin-dep-ver-maven-plugin-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-dep-ver/local-repo/org/apache/maven/errortest/bad-ext-plugin-dep-ver-maven-plugin/1/bad-ext-plugin-dep-ver-maven-plugin-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-dep-ver/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-dep-ver/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-dep-ver/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-maven-ver/local-repo/org/apache/maven/errortest/bad-ext-plugin-maven-ver-maven-plugin/1/bad-ext-plugin-maven-ver-maven-plugin-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-maven-ver/local-repo/org/apache/maven/errortest/bad-ext-plugin-maven-ver-maven-plugin/1/bad-ext-plugin-maven-ver-maven-plugin-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-maven-ver/local-repo/org/apache/maven/errortest/bad-ext-plugin-maven-ver-maven-plugin/maven-metadata-local.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-maven-ver/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-maven-ver/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-ext-plugin-maven-ver/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-maven-version/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-mg-dep-version/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-non-dep-version/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-profile-repo/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/bad-profile-repo/profiles.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/config-rdonly-mojo-param/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/config-rdonly-mojo-param/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/config-rdonly-mojo-param/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/deploy-repo-creation-err/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/duplicated-attachments/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/duplicated-attachments/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/duplicated-attachments/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-loading-plugin/local-repo/org/apache/maven/errortest/err-loading-plugin-maven-plugin/1/err-loading-plugin-maven-plugin-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-loading-plugin/local-repo/org/apache/maven/errortest/err-loading-plugin-maven-plugin/1/err-loading-plugin-maven-plugin-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-loading-plugin/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-ext-plugin/local-repo/org/apache/maven/errortest/dep/1/dep-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-ext-plugin/local-repo/org/apache/maven/errortest/err-resolving-ext-plugin-maven-plugin/1/err-resolving-ext-plugin-maven-plugin-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-ext-plugin/local-repo/org/apache/maven/errortest/err-resolving-ext-plugin-maven-plugin/1/err-resolving-ext-plugin-maven-plugin-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-ext-plugin/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-project-dep/project/local-repo/org/apache/maven/errortest/dep/1/dep-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-project-dep/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-project-dep/project/src/main/java/org/apache/maven/test/error/mojoFailure/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/err-resolving-project-dep/project/src/test/java/org/apache/maven/test/error/mojoFailure/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-deps-resolve-err/local-repo/org/apache/maven/errortest/test-maven-ext-dep/1/test-maven-ext-dep-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-deps-resolve-err/local-repo/org/apache/maven/errortest/test-maven-ext/1/test-maven-ext-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-deps-resolve-err/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-artifact-missing/local-repo/org/apache/maven/errortest/ext-plugin-artifact-missing-maven-plugin/1/ext-plugin-artifact-missing-maven-plugin-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-artifact-missing/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-realm-error/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-realm-error/plugin/src/main/java/org/plugin/ComponentOne.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-realm-error/plugin/src/main/java/org/plugin/ComponentTwo.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-realm-error/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-realm-error/plugin/src/main/resources/META-INF/plexus/components.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-realm-error/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-version-err/local-repo/org/apache/maven/errortest/ext-plugin-version-err-maven-plugin/1/ext-plugin-version-err-maven-plugin-1.jar create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-version-err/local-repo/org/apache/maven/errortest/ext-plugin-version-err-maven-plugin/1/ext-plugin-version-err-maven-plugin-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-version-err/local-repo/org/apache/maven/errortest/ext-plugin-version-err-maven-plugin/maven-metadata-local.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-version-err/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-version-err/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-plugin-version-err/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-realm-error/ext/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-realm-error/ext/src/main/java/org/ext/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-realm-error/ext/src/main/resources/META-INF/plexus/components.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/ext-realm-error/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/interp-from-model/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/interp-from-project/project/local-repo/org/test/bad-pom/1/bad-pom-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/interp-from-project/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/load-extern-profiles-ioex/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/load-extern-profiles-xex/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/load-extern-profiles-xex/profiles.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-module-pom/child1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-module-pom/child1/src/main/java/org/test/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-module-pom/child1/src/test/java/org/test/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-module-pom/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-parent-pom/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-req-mojo-param/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-req-mojo-param/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/missing-req-mojo-param/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-config-error/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-config-error/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-config-error/plugin/src/main/resources/META-INF/maven/plugin.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-config-error/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-exec-err/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-exec-err/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-exec-err/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-lookup-err/plugin/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-lookup-err/plugin/src/main/java/org/plugin/TestPlugin.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/mojo-lookup-err/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/parent-parse-ioex/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/parent-parse-ioex/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/parent-parse-xex/child/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/parent-parse-xex/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/profile-activator-err/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/profile-activator-lookup-err/ext/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/profile-activator-lookup-err/ext/src/main/java/org/ext/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/profile-activator-lookup-err/ext/src/main/resources/META-INF/plexus/components.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/profile-activator-lookup-err/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-collision/mod1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-collision/mod2/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-collision/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-cycle/dep/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-cycle/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-dep-missing/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-dep-missing/src/main/java/org/apache/maven/test/error/mojoFailure/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-dep-missing/src/test/java/org/apache/maven/test/error/mojoFailure/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-mojo-failure/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-mojo-failure/src/main/java/org/apache/maven/test/error/mojoFailure/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-mojo-failure/src/test/java/org/apache/maven/test/error/mojoFailure/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-parse-xex/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/project-validation/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/error-reporting-projects/repo-creation-err/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/eventing-projects/read-with-deps/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/eventing-projects/read-with-deps/repo/tests/dep/1/dep-1.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/eventing-projects/simple-read-project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/extensions/META-INF/plexus/components.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/java/org/apache/maven/cli/CLIReportingUtilsTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/plugin-version-references/jar-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/plugin-version-references/maven-plugin-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/bad-module-non-recursive/badmodule/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/bad-module-non-recursive/goodmodule/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/bad-module-non-recursive/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/config/.mvn/maven.config create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/invalid-goal/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/project/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/project/src/main/java/org/codehaus/m2eclipse/App.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/project/src/test/java/org/codehaus/m2eclipse/AppTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/repository/org/codehaus/m2eclipse/parent/1.0-SNAPSHOT/maven-metadata-company.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/repository/org/codehaus/m2eclipse/parent/1.0-SNAPSHOT/parent-1.0-SNAPSHOT.pom create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/repository/org/codehaus/m2eclipse/parent/maven-metadata-local.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/isolated-project-getting-parent-pom/settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/optional-dep/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/readProject-missingModuleIgnored/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/readProject-withScmInheritance/modules/child1/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/projects/readProject-withScmInheritance/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/pom-with-distribution-status.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/pom-without-dependencies.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/pom2.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/settings/invalid-settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-embedder/src/test/resources/settings/valid-settings.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/AbstractModelBuildingListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/FileModelSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/FilterModelBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingEvent.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingEventCatapult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingListener.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCache.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheTag.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelData.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollectorExt.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemCollectorRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblemUtils.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelSource2.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/Result.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/StringModelSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/building/UrlModelSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/composition/DefaultDependencyManagementImporter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/composition/DependencyManagementImporter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/DefaultInheritanceAssembler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/InheritanceAssembler.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/BuildTimestampValueSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/MavenBuildTimestamp.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/ModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/PathTranslatingPostProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/ProblemDetectingValueSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/UrlNormalizingPostProcessor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/io/DefaultModelWriter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelParseException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/io/ModelWriter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/locator/DefaultModelLocator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/locator/ModelLocator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultPluginManagementInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/management/PluginManagementInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/merge/MavenModelMerger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/normalization/DefaultModelNormalizer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/normalization/ModelNormalizer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/DefaultModelPathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/DefaultModelUrlNormalizer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/DefaultPathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/DefaultUrlNormalizer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/ModelPathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/ModelUrlNormalizer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/PathTranslator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/path/UrlNormalizer.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/DefaultPluginConfigurationExpander.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/DefaultReportConfigurationExpander.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/DefaultReportingConverter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/LifecycleBindingsInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/PluginConfigurationExpander.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/ReportConfigurationExpander.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/plugin/ReportingConverter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileActivationContext.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileSelector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/ProfileActivationContext.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/ProfileInjector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/ProfileSelector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/FileProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/OperatingSystemProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/ProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/PropertyProfileActivator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/resolution/InvalidRepositoryException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/resolution/ModelResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/resolution/UnresolvableModelException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/resolution/WorkspaceModelResolver.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/superpom/DefaultSuperPomProvider.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/superpom/SuperPomProvider.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/java/org/apache/maven/model/validation/ModelValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/mdo/profiles.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/site/apt/super-pom.apt.vm create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/building/ComplexActivationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/building/DefaultModelBuilderFactoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/building/SimpleProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/AbstractModelInterpolatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/MavenBuildTimestampTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/path/DefaultUrlNormalizerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/profile/activation/AbstractProfileActivatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/profile/activation/JdkVersionProfileActivatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/profile/activation/PropertyProfileActivatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/factory/complex.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/factory/simple.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/inheritance/plugin-configuration-child.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/inheritance/plugin-configuration-expected.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/inheritance/plugin-configuration-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-dependency-exclusion-id.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-dependency-scope.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-dependency-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-import-scope-classifier.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-import-scope-type.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-modelVersion.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-plugin-dependency-scope.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-plugin-dependency-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-plugin-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-repository-id.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-snapshot-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/bad-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/basedir-system-path.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/distribution-management-status.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/duplicate-module.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/duplicate-plugin-execution.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/duplicate-plugin.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/duplicate-profile-id.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/empty-module.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/empty-plugin-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/hard-coded-system-path.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/incomplete-parent.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/invalid-aggregator-packaging-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/invalid-ids-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-1-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-artifactId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-artifactId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-exclusion-id.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-groupId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-mgmt-artifactId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-mgmt-groupId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-mgmt-version-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-dependency-version-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-groupId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-modelVersion-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-plugin-artifactId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-plugin-dependency-artifactId.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-plugin-dependency-groupId.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-plugin-dependency-version.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-plugin-version-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-report-artifactId-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-report-version-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-repository-id-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-resource-directory-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-type-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/missing-version-pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model-builder/src/test/resources/poms/validation/reserved-repository-id.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/main/java/org/apache/maven/model/io/xpp3/package-info.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/main/java/org/apache/maven/model/merge/ModelMerger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/main/java/org/apache/maven/model/merge/package-info.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/main/java/org/apache/maven/model/package-info.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/main/mdo/maven.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/site/xdoc/navigation.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ActivationFileTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ActivationOSTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ActivationPropertyTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ActivationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/BuildTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/CiManagementTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ContributorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/DependencyManagementTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/DependencyTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/DeploymentRepositoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/DeveloperTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/DistributionManagementTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ExclusionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ExtensionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/IssueManagementTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/LicenseTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/MailingListTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ModelTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/NotifierTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/OrganizationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ParentTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/PluginConfigurationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/PluginContainerTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/PluginExecutionTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/PluginManagementTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/PluginTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/PrerequisitesTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ProfileTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/RelocationTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ReportPluginTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ReportSetTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ReportingTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/RepositoryPolicyTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/RepositoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ResourceTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/ScmTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-model/src/test/java/org/apache/maven/model/SiteTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/monitor/logging/DefaultLog.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/AbstractMojo.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/AbstractMojoExecutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/ContextEnabled.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/Mojo.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoExecutionException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoFailureException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoNotFoundException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/DuplicateMojoDescriptorException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/DuplicateParameterException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/InvalidParameterException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/InvalidPluginDescriptorException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Parameter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/Requirement.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/logging/Log.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/java/org/apache/maven/plugin/logging/SystemStreamLog.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/mdo/lifecycle.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/main/mdo/plugin.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/test/java/org/apache/maven/plugin/lifecycle/LifecycleXpp3ReaderTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/test/resources/lifecycle.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-plugin-api/src/test/resources/plugin.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-repository-metadata/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-repository-metadata/src/main/mdo/metadata.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-repository-metadata/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-repository-metadata/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactory.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsProblem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/FileSettingsSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsBuilder.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsBuildingException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsBuildingRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsBuildingResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsProblem.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsProblemCollector.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/SettingsSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/StringSettingsSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/building/UrlSettingsSource.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/crypto/DefaultSettingsDecrypter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/crypto/DefaultSettingsDecryptionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/crypto/DefaultSettingsDecryptionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/crypto/SettingsDecrypter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/crypto/SettingsDecryptionRequest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/crypto/SettingsDecryptionResult.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/io/DefaultSettingsReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/io/DefaultSettingsWriter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/io/SettingsParseException.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/io/SettingsReader.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/io/SettingsWriter.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/merge/MavenSettingsMerger.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/DefaultSettingsValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/main/java/org/apache/maven/settings/validation/SettingsValidator.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/test/java/org/apache/maven/settings/building/DefaultSettingsBuilderFactoryTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/test/java/org/apache/maven/settings/validation/DefaultSettingsValidatorTest.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings-builder/src/test/resources/settings/factory/simple.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings/src/main/java/org/apache/maven/settings/RuntimeInfo.java create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings/src/main/mdo/settings.mdo create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings/src/site/apt/index.apt create mode 100644 framework/src/maven/apache-maven-3.3.3/maven-settings/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/pom.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/src/site/resources/images/maven-deps.png create mode 100644 framework/src/maven/apache-maven-3.3.3/src/site/site.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/src/site/xdoc/index.xml create mode 100644 framework/src/maven/apache-maven-3.3.3/src/site/xdoc/maven-deps.odg diff --git a/build.sh b/build.sh index eb80f04f..d26f4964 100755 --- a/build.sh +++ b/build.sh @@ -25,9 +25,6 @@ GERRITURL="git clone ssh://im2bz2pee@gerrit.opnfv.org:29418/onosfw" ONOSURL="https://github.com/opennetworkinglab/onos" SURICATAURL="https://github.com/inliniac/suricata" ONOSGIT="git clone --recursive $ONOSURL" -GERRITROOT="$(pwd)" -ONOSROOT=$GERRITROOT/framework/src/onos/ -BUILDROOT=$GERRITROOT/framework/build JAVA_VERSION=1.8 ANT_VERSION=1.9.6 MAVEN_VERSION=3.3.3 @@ -40,7 +37,14 @@ PATCH_PATH_1=onos/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/sfc ##### End Patches ##### ##### Set build environment ##### -source ./setenv.sh +export GERRITROOT="$(pwd)" +export ONOSROOT=$GERRITROOT/framework/src/onos/ +export BUILDROOT=$GERRITROOT/framework/build +export JAVA_HOME=/etc/alternatives/java_sdk +export ANT_HOME=$GERRITROOT/framework/src/ant/apache-ant-1.9.6 +export M2_HOME=$GERRITROOT/framework/build/maven +export M2=$M2_HOME/bin +export PATH=$PATH:$ANT_HOME/bin:$M2:$JAVA_HOME/bin ##### End Set build environment ##### ##### Ask Function ##### @@ -105,6 +109,7 @@ updateONOS() cp $PATCHES/$PATCH_PATH_1/* $SOURCES/$PATCH_PATH_1/ # End applying patches fi + printf "\n" } ##### End Update ONOS ##### @@ -120,11 +125,27 @@ checkJAVA() sudo yum install java-$JAVA_VERSION.0-openjdk-devel fi else - printf "Installed Java version meets the requirements. \n" + printf "Installed Java version meets the requirements. \n\n" fi } ##### End Check Java ##### +##### Install Ant ##### +installAnt() +{ + if [ ! -d "$ANT_HOME/bin" ]; then + printf "You may have Ant installed on your system, but to avoid build issues, we'd like \n" + printf "to use our own. It will be installed at $ANT_HOME. \n" + if ask "May we proceed with installing ant here?"; then + cd $ANT_HOME + sh build.sh install + fi + else + printf "Ant looks to be properly installed at $ANT_HOME. \n\n" + fi +} +##### Install Ant ##### + ##### Install Maven ##### installMaven() { @@ -134,11 +155,13 @@ installMaven() clear printf "Maven version $MAVEN_VERSION is being installed in: \n" printf "$GERRITROOT/framework/build/maven.\n\n" - sleep 5 + sleep 3 cd $GERRITROOT/framework/src/maven/apache-maven-$MAVEN_VERSION ant cd $GERRITROOT fi + else + printf "Maven looks to be peroply installed at $M2_HOME. \n\n" fi } ##### End Install Maven ##### @@ -147,4 +170,5 @@ installMaven() displayVersion updateONOS checkJAVA +installAnt installMaven diff --git a/framework/src/ant/apache-ant-1.9.6/CONTRIBUTORS b/framework/src/ant/apache-ant-1.9.6/CONTRIBUTORS new file mode 100644 index 00000000..e78bd62e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/CONTRIBUTORS @@ -0,0 +1,417 @@ +Amongst other, the following people contributed to ant: + +Adam Blinkinsop +Adam Bryzak +Adam Sotona +Adrian Nistor +Aleksandr Ishutin +Alex Rosen +Alexei Yudichev +Alexey Panchenko +Alexey Solofnenko +Alfred Theorin +Alison Winters +Andreas Ames +Andreas Mross +Andrew Eisenberg +Andrew Everitt +Andrew Stevens +Andrey Urazov +André-John Mas +Andy Wood +Anil K. Vijendran +Anli Shundi +Anthony Goubard +Anthony Green +Anthony Wat +Antoine Baudoux +Antoine Levy-Lambert +Anton Mazkovoi +Arjan Veenstra +Arnaud Vandyck +Arnout J. Kuiper +Aslak Hellesôy +Atsuhiko Yamanaka +Avik Sengupta +Balazs Fejes 2 +Bart Vanhaute +Benjamin Burgess +Ben Galbraith +Ben Gertzfield +Benoit Moussaud +Bernd Dutkowski +Bernhard Rosenkraenzer +Brad Clark +Brant Langer Gurganus +Brian Curnow +Brian Deitte +Brian Felder +Brian Repko +Bruce Atherton +Cedomir Igaly +Charles Hudak +Charlie Hubbard +Chris Povirk +Christian Knorr +Christian Schmidt +Christoph Gysin +Christoph Wilhelms +Christophe Labouisse +Christopher A. Longo +Christopher Charlier +Clark Archer +Clemens Hammacher +Clement OUDOT +Clive Brettingham-Moore +Conor MacNeill +Craeg Strong +Craig Cottingham +Craig R. McClanahan +Craig Richardson +Craig Ryan +Craig Sandvik +Curt Arnold +Curtis White +Cyrille Morvan +D'Arcy Smith +Dale Anson +Dale Sherwood +Dan Armbrust +Daniel Henrique +Daniel Ribagnac +Daniel Spilker +Daniel Trebbien +Danno Ferrin +Danny Yates +Dante Briones +Davanum Srinivas +Dave Brondsema +Dave Brosius +David A. Herman +David Crossley +David Gärtner +David S. Johnson +David Kavanagh +David LeRoy +David Leal +David M. Lloyd +David Maclean +David Rees +Denis Hennessy +Derek Slager +Devon C. Miller +Diane Holt +dIon Gillard +Dmitry A. Kuminov +Dominique Devienne +Donal Quinlan +Don Brown +Don Ferguson +Don Jeffery +Drew Sudell +Edison Guo +Eduard Wirch +Edwin Woudt +Eli Tucker +Emmanuel Bourg +Eric Barboni +Eric Olsen +Eric Pugh +Erik Costlow +Erik Hatcher +Erik Langenbach +Erik Meade +Ernst de Haan +Frank Harnack +Frank Somers +Frank Zeyda +Frantisek Kucera +Frederic Bothamy +Frederic Lavigne +Gary S. Weaver +Gautam Guliani +Gene-Sung Chung +Georges-Etienne Legendre +Gero Vermaas +Gerrit Riessen +Gilbert Rebhan +Gilles Scokart +Glenn McAllister +Glenn Twiggs +Greg Nelson +Greg Roodt +Greg Schueler +Grégoire Vatry +Günther Kögel +Harish Prabandham +Haroon Rafique +Hiroaki Nakamura +Holger Engels +Holger Joest +Ignacio Coloma +Ingenonsya France +Ingmar Stein +Irene Rusman +Isaac Shabtay +Ivan Ivanov +J Bleijenbergh +Jack J. Woehr +James Duncan Davidson +Jan Cumps +Jan Matèrne +Jan Mynarik +Jan Stolze +Jason Hunter +Jason Pettiss +Jason Salter +Jason Yip +Jay Dickon Glanville +Jay Peck +Jay van der Meer +JC Mann +J D Glanville +Jean-Francois Brousseau +Jean-Louis Boudart +Jeff Gettle +Jeff Martin +Jeff Tulley +Jeff Turner +Jene Jasper +Jeremy Mawson +Jerome Lacoste +Jesse Glick +Jesse Stockall +Jim Allers +Joerg Wassmer +Joel Tucci +Joey Richey +Johann Herunter +John Elion +John Sisson +Jon Dickinson +Jon S. Stevens +Jon Skeet +Jose Alberto Fernandez +Joseph Walton +Josh Lucas +Juerg Wanner +Julian Simpson +Justin Vallon +Keiron Liddle +Keith Visco +Kevin Connor Arpe +Kevin Greiner +Kevin Jackson +Kevin Ross +Kevin Z Grey +Kim Hansen +Kirk Wylie +Kristian Rosenvold +Kyle Adams +Lajos Veres +Larry Shatzer +Larry Streepy +Les Hughes +Levi Cook +lucas +Lucas Werkmeister +Ludovic Claude +Maarten Coene +Magesh Umasankar +Maneesh Sahu +Marcel Schutte +Marcus Börger +Mario Frasca +Mariusz Nowostawski +Mark A. Ziesemer +Mark DeLaFranier +Mark Hecker +Mark R. Diggory +Mark Salter +Markus Kahl +Martijn Kruithof +Martin Landers +Martin Poeschl +Martin van den Bemt +Martin von Gagern +Mathieu Champlon +Mathieu Peltier +Matt Albrecht +Matt Benson +Matt Bishop +Matt Foemmel +Matt Grosso +Matt Humphrey +Matt Small +Matt Wildig +Matthew Hawthorne +Matthew Inger +Matthew Kuperus Heun +Matthew Watson +Matthias Bhend +Michael Bayne +Michael Clarke +Michael Davey +Michael J. Sikorsky +Michael McCallum +Michael Montuori +Michael Newcomb +Micheal Nygard +Michael Saunders +Miha +Mike Davis +Mike Roberts +Mike Williams +Miroslav ZaÅ¥ko +mnowostawski +Mounir El Hajj +Nathan Beyer +Nick Chalko +Nick Fortescue +Nick Crossley +Nick Pellow +Nicola Ken Barozzi +Nico Seessle +Nigel Magnay +Oliver Merkel +Oliver Rossmueller +Ondra Medek +Omer Shapira +Oystein Gisnas +Patrick Altaie +Patrick C. Beard +Patrick Chanezon +Patrick G. Heck (Gus Heck) +Patrick Martin +Paul Austin +Paul Christmann +Paul Galbraith +Paul King +Paulo Gaspar +Pavan Bayyapu +Pavel Jisl +Pawel Zuzelski +Peter B. West +Peter Donald +Peter Doornbosch +Peter Hulst +Peter Janes +Peter Reilly +Petr KureÅ¡ +Phil Hanna +Philip Hourihane +Phillip Wells +Pierre Delisle +Pierre Dittgen +riasol +R Handerson +Ralf Hergert +Rami Ojares +Randy Watler +Raphael Pierquin +Ray Waldin +Remie Bolte +René Krell +Richard Evans +Richard Steele +Rick Beton +Robbie Gibson +Robert Anderson +Robert Clark +Robert Flaherty +Robert Shaw +Robert Streich +Robert Watkins +Roberto Scaramuzzi +Robin Green +Robin Power +Robin Verduijn +Rob Oxspring +Rob van Oostrum +Rodrigo Schmidt +Roger Vaughn +Roman Ivashin +Roman Savko +Ronen Mashal +Russell Gold +Ryan Bennitt +Sam Ruby +Sandra Metz +Scott Carlson +Scott Ellsworth +Scott Johnson +Scott M. Stirling +Sean Egan +Sean P. Kane +Sebastien Arod +Shiraz Kanga +Sebastian Kantha +Simon Law +Simone Bordet +Stefan Bodewig +Stefan Heimann +Stefano Mazzocchi +Stephan Strittmatter +Stephane Bailliez +stephan +Stephan Michels +Stephen Chin +Stephen Goetze +Steve Cohen +Steve Langley +Steve Loughran +Steve Morin +Steve Wadsworth +Steven E. Newton +Sudheer Chigurupati +Takashi Okamoto +TAMURA Kent +Taoufik Romdhane +Tariq Master +Thomas Aglassinger +Thomas Butz +Thomas Christen +Thomas Christensen +Thomas Haas +Thomas Quas +Tim Boemker +Tim Drury +Tim Fennell +Tim Stephenson +Tim Whittington +Timoteo Ohara +Timothy Gerard Endres +Tom Ball +Tom Brus +Tom Cunningham +Tom Dimock +Tom Eugelink +Tom May +Tomasz Bech +Trejkaz Xaoza +Ulrich Schmidt +Uwe Schindler +Valentino Miazzo +Victor Toni +Vimil Saju +Vincent Legoll +Vitold Sedyshev +Volker Leidl +Waldek Herka +Wang Weijun +Will Wang +William Bernardet +William Ferguson +William Webber +Wolf Siberski +Wolfgang Baer +Wolfgang Frech +Wolfgang Glas +Wolfgang Werner +Xavier Hanin +Xavier Witdouck +Yohann Roussel +Yuji Yamano +Yves Martin +Zach Garner +Zdenek Wagner diff --git a/framework/src/ant/apache-ant-1.9.6/INSTALL b/framework/src/ant/apache-ant-1.9.6/INSTALL new file mode 100644 index 00000000..83c11675 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/INSTALL @@ -0,0 +1,2 @@ +For installation instructions see the manual in the docs subdirectory +or online at . diff --git a/framework/src/ant/apache-ant-1.9.6/KEYS b/framework/src/ant/apache-ant-1.9.6/KEYS new file mode 100644 index 00000000..fb21736d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/KEYS @@ -0,0 +1,1497 @@ +This file contains the PGP keys of various developers. + +Users: pgp < KEYS + gpg --import KEYS +Developers: + pgp -kxa and append it to this file. + (pgpk -ll && pgpk -xa ) >> this file. + (gpg --list-sigs + && gpg --armor --export ) >> this file. + +Type Bits/KeyID Date User ID +pub 1024/FEECAAED 1998/11/11 Stefan Bodewig + Stefan Bodewig + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: 2.6.3i + +mQCNAzZJoiMAAAEEAMzhUxTOC20Nprp6K4nLTiARt+EXii/dovNWWcfzZcYXi/lX +r3zpUTTZxlKQpd4RaHjFmGgoOraZE4jCRFARVcFJgYmGUKpcWJZO7YKL36WUizTM ++dyB2ycOtzlty1W5VmRL3FGqo67pKA9F/QHg3NSu9hY1W9xPPK7Kq3f+7KrtAAUR +tCBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPokAlQIFEDZSrGXHcgyK +jiW9zQEBshEEAMlG4qVjKp4/agdJG56M6izx9oaKecFLXHQJrFUy3w2PvZHFYtXc +osXKorX6bPrE8uB57MxbY2WapKeVRodlG0+j39vAf501duK8q2rktfWt9Cl4JjJ4 +DbWhSWfV1ci62u2gCxwYQe22F9Wh+vhOR5NK9RTbSKhupdlFsnrk/i7xiQCVAwUQ +NkmiI67Kq3f+7KrtAQGdxQQAlcFOzSv7G6M4uGbgvw7IGgrhx7rawtIyv9hLXgVC +7ua9xaZV8G0Fl9gh8RnbdcZ4R/aT+KIiAFaslfZ3t6hlC4MTbnAJqvdS/NO98ZkJ +YvnzZSKHflAbd5gyE7IVxBC9/xRlF/Wls5sYNwb6RjoRCaOjxN/y3WCLa3Va101v +zNy0I1N0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+iQCVAwUQOxIo +BK7Kq3f+7KrtAQGn6gP/SBACdHakA4H//otpyESSrk4PmyOaYF0Kyok43Gee2mT+ +m9+jZ3jLcC0oav6iH+otL/lhk9t/JDM8LjD2kAkdWWoIvvuPyCx97gOzojIo0Ve2 +1wuxJTF/VIjwyOtE8FzE7p4tkc6EubVpeZkV9Pq9HFRBCUcyKJDLnF4tbstScLU= +=OBLe +-----END PGP PUBLIC KEY BLOCK----- + + +pub 1024D/51898504 2001-05-29 Conor MacNeill +sig 3 51898504 2001-05-29 Conor MacNeill +sig 5F6B8B72 2002-01-11 Stefan Bodewig +uid Conor MacNeill +sig 3 51898504 2001-05-29 Conor MacNeill +sig 5F6B8B72 2002-01-11 Stefan Bodewig +sub 1024g/D1ECBA5D 2001-05-29 +sig 51898504 2001-05-29 Conor MacNeill + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBDsTqygRBACiZckNdclTlQFonLaIKBFGhMy0KKByw0x8XA4iwdbCXuF6xNIc +HIFHajJ74AHchQ4d8xtomBy6b8yvFgWVeaZensvn69BlLeqGdyeJRzfPt6TgRnzZ +2eWhb0HXdG3JwxL/2BabDhHfs4YJOrgB/vhRFQku6oCMRiBPtJj2werD6wCg0/zp +jacYTw6+CR+sVvneCNyySFED/R3j10c4RnR8djgv1jKT8CKPuHYraupI9INEe+I6 +7qWjtJ02GzvMO6TElAtUsf4aysu45GgwkwEBnuG6mYb3Pq0V2c5tJc2A3Tj3DrdR +i3HUNwurbus76I0sPyyENPu12QPeC6mvWLEsxVJ9o0hRKFayGvYUmrwWK9UFLjvp +p9cXBACDHgLn7MAVLqUdYhRrUj/M+GOUpvBikEgoJJrEUmb5X4+++dffMh5HBIO4 +5LA11qEKuM2xnKqOilP7NLYXz1Fe0ocqv0jsHB4SprFTTai7ma31uwuRQvCQXVv1 +yJ5CLqYda64h/UA2kmmR2dfopmvDogYEMz/HU5voozxe7BEI7bQhQ29ub3IgTWFj +TmVpbGwgPGNvbm9yQGFwYWNoZS5vcmc+iFcEExECABcFAjsTqygFCwcKAwQDFQMC +AxYCAQIXgAAKCRCBBGRPUYmFBDgIAKCZztXqKhK6kXOnoGy7opCNmWU0lwCgsPDa +4m+ruW3ch0rfbqtR75S52R+IRgQQEQIABgUCPD6eTgAKCRCiEVrhX2uLcqCcAKCr +1Wylqju9YjBi5Twej9ze69JFBQCeOaMgo6yjnkcV3PnVInLlaMwPr5q0LUNvbm9y +IE1hY05laWxsIDxjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1PohXBBMRAgAX +BQI7E6xMBQsHCgMEAxUDAgMWAgECF4AACgkQgQRkT1GJhQTY0ACgmZmKheHzjPJs +5hybpyvnvEiPYqYAn2+ryxdtz8XyOMExGRmHNlhG7svsiEYEEBECAAYFAjw+nlUA +CgkQohFa4V9ri3JYYACg1WN+NCptfKVP1mbrIa+0ajztsiIAnAn+m70iwRRFZCxr +jcULoY5SjyTLuQENBDsTqy0QBACfsCxJ6iCtgX8zjlVtMsMfDqu72x5sYatWKn8c +u+4Oj5mi0x6azZIhwCa+K3ihLVOyG1mCRnzztGTIxWYRhq3TESIVOfgm+NgLGrmA +XUTFyCT+21TExLCpuVZKmUHsWXLxDtfQ1diPeQpiQ8+Fvb/4jLGFjFIrQ2VjtFQn +kumkSwADBgP9H0bF4hdMuVEcSJ9imxSoJshcOOA3Vd2+YiCTZhBygWM49wY5jNos +/DArIjNCE53IlOu/UtHB2jqkSqjF0soGYsUjeCWouiTP9hLuMKPjnqj9ryJPTDKz +nTCZ4TuB5CtzrKTlWLmPCPpFsGqe4KjMeKg/mqGqjPKl97xgStK9N9GIRgQYEQIA +BgUCOxOrLQAKCRCBBGRPUYmFBMM6AJsF3FFyZGEmbt9aGG1W/u0oI9mcLgCfQyJ+ +aalbspazea4J9zgi59SSwOM= +=cBdR +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024R/697ECEDD 2000-04-06 Henri Gomez +sig 697ECEDD 2000-04-06 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQCNAzjsydwAAAEEAMpwFU/ci3/wR3ryCGp9Exr+Rx/hTQ7hWAJcVw8ejlBXlT4T +yITlRUs0HGfRWxME2J55PuXXsIEPZzjfozNtvOyq8WlLlJ7iaiyWxVRoPJ25sSEj +C9etm6wjj4E66ZgzuElZkm1m69uEsCHPPNuz1oQ/g1O+SmIVxIYirlxpfs7dAAUR +tBxIZW5yaSBHb21leiA8aGdvbWV6QHNsaWIuZnI+iQCVAwUQOOzJ3IYirlxpfs7d +AQFQyQQAj0D9G0hEL7SQGaSCkkoXwvamQw42N8+tNm+jfWHWdE4HAiVlhJmI2GyD +sdcXVAcR8R7ILIRB5AY7a3bF+qMk0r+vO6oR878RKKn9AvtaAIOnrh6tr0tiPwf5 +XDUMySxIWJEF3SmJAy9Lq3bAl5GMzZCFHiS0NW2gtWgmr/u1RuM= +=6l+I +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024R/397DCAD5 2002-07-03 Henri Gomez +sig 397DCAD5 2002-07-03 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQCNAz0i0UUAAAEEALXePN6IHne0W96YRMnR+4EXB6402QY5f8ZLcnSUZUH55Fb1 +qcZGBc3WRKlPiUvwBD+eVYgCpNSXF/H+oV1mawxNJN5XwqBEpfYmY8MRIPcqa61h +bJc3LBSm1qNf05G5Cwxeed+OgVm0r1HBy6DAgDHAqNlkC8DZ/BVgqMA5fcrVAAUR +tCpIZW5yaSBHb21leiA8aGdvbWV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD6JAJUD +BRA9ItFFFWCowDl9ytUBASNyA/458T84LUVhqq6Y9fPBAfcFMWY2kehuDWsQEXkO +46XoK+AnFZCkKuyDLqPHchVUO5pK/gZYsDK/xJkfh3u4FTDTsecb9wFmIeyayVIN +SI8o6l8EZzDX/PGwqEwzxHrbQkIgIktNn5ApIoazvdBpbkQfNj1vr2wWoMYPLAWM +8xzecA== +=UmZ8 +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/307A10A5 2002-07-18 Henri Gomez +sig 3 307A10A5 2002-07-18 Henri Gomez +sub 2048g/862B8F70 2002-07-18 +sig 307A10A5 2002-07-18 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBD02vbERBAC1v8fR6gjERpaz4UMfdy0hRVWCPSbOdF+Swm/IenjVzErco6zb +MTa13umUNrDPBy/tTWiCCZrOnqi7fgDzWqPEqrXJjKAFVLEWE6MmKylPPEPG1/bm +idkNGERSAZduvhKv777PzvEJJ/8eGe3wy/O8NbgIjCPtr4UklwCZS8cFuwCg8oMO +UdT8qZRtzdxdAyu1m5fUb+MD/3IKJYWXsdtb6iBphCU4f/BoyjVC9EZJ1ywLuiVM +siKbuaDUaXU9nWcbNKv+fx8uZ1NaadpfLokqqhnWcpnSiqw8HNR7SwsF1D33rkXK +O4FSuVss/tIoqGdWFcJyPkP4yP5shxqR335narVw2vDa0+BiWkALbA2qVsSIdZDB +LeFZA/47AMBS0U2BRk2rQT8LmMuFl7mR+wNBM4n7FUGdxsGn3TcYd4pXTNrEQPrV +YNdooKlikgGk4hgFnIFX09Spmimqgq0goFue81rttVdZZ4uep8dTghY6gwmvcOxX +jATbhWStBhdu9B35kzfHc+1QihD5Z94u4uyWIVBIzikcdiY8LbQqSGVucmkgR29t +ZXogPGhnb21lekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+iFcEExECABcFAj02vbEF +CwcKAwQDFQMCAxYCAQIXgAAKCRAZMdaEMHoQpYijAKCCP68ndU/kTXR9XAKLvibC +3S8+1QCfUFQYte3Jo+MHKaWjsu9JGptRzo+5Ag0EPTa93RAIAKlsRJ5gOGTFsmaR +W9k6MIh4c/MCy7J7HUxT5xTdHROa+3zUh+FAE/JaOx9ZtZtH863DFHA8cP4L+tpi +PjBT6g2E94dwGcuH/OiSSCT4JSBukbGbOuLLdmFXqUl8+4gsL90Xal67FtNLwyLG +1n7geLir0byD+OT7VLA5w+6G0NOpJEveV/FIa2qLgdRZ8vz73ybgMh18hBUrUmro +jncp0rln2VU7VCH1C2aClKm7kK4mGAjIFIzKbguK+kM3b8NDHmXKpT6syyCtIM3h +prkV1TUCAFqLI32aSdlTN79lpeA2zDga9k4/4X/RDHsFpRN2neRFGTNUtuUgYpQQ +E5zWBmMAAwUH/RiGxyeBsad923IwE1+GAjxFl2tqF9xWk0J6yTnSK4nfhYAE9evV +jwDEok9jRl4ILCcXx6YN/d/lWNuSbARKHz/3hLiTouPpwd3SSJ8is2x9PgpJz5JX +cD0y1SkbPLvs3jH3ZmdcxZpuAmJeI/typqFKK5pWP44oXIH+XH/8nWDtmLEBkgKQ +/ATQWenMTmZ6MIJ6aWKWGkO9QS6iYRz3PPPGQ1O8W02CeprM2wBtlb8J1Z3RxNhM +rZcg/1Qi3V3D1HI4zw6tAFmDeBb8J4PaBQzqlhzx2EBTbfwNPhV8AlPvpxHEeGGn +v+O1yhZr33SnyZdINNoNDn+owVMdmkobe9GIRgQYEQIABgUCPTa93QAKCRAZMdaE +MHoQpRsTAJ4qst3MhLm48fBAEnzuzi/BIKr+AgCfYaCB/AvPoncQbHc8BcNGRimR +P9A= +=hQhz +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/EDF62C35 2002-04-10 Magesh Umasankar +sig 3 EDF62C35 2002-04-10 Magesh Umasankar +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig +sub 1024g/B5FFC53F 2002-04-10 +sig EDF62C35 2002-04-10 Magesh Umasankar + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBDy0ebgRBADuKIKD8PuJ4wKEV1h2AprwJjxCRx8vn48XNwfLZuvhw8cpArtK +rZwhoGPPUPEEXgtTNerlKq4VwpAwcnvRz7oC/7aWkUbcR2sAyhfe2scohwPgw7Xv ++isWC0NDPdrxvXG/PUOG/cnELunr51ymybBqBxUd2gMhYIxPo67D+YPYLwCgwcZp +yc/6kJa116ESWHrti342GD8D/1srpnRs9CiS1DQF1uZ1wW4vzj4VD61tKsjdWD8D +V573R22iMDLSj4oMB536WxUH7snz8XsAKm/peqJ6G9m0smtmWA1ago5yzQj70WqF +xzWBhHn2I/YfAQ8pb2s9q1lClj8elnCxT65L27ydBAZteejb2VqjtQ6iGy86PUT2 +wRUvBADZmoV1eIZJEM5NnxBv1EtvRYZtIQEzZ8dO2A1LOS7qlVr8IypljNPLGhzX +VHNvVsjC9QMUSWeBsDedvQHQ3hJpIMnTI32XE1V4gX06gfVTZdhf2fLTtwnsHZp0 +oumqshGDVRhNJJdDYLikxWOxOfkNveKEqJFvtuBR+ZqqluQKebQlTWFnZXNoIFVt +YXNhbmthciA8dW1hZ2VzaEBhcGFjaGUub3JnPohXBBMRAgAXBQI8tHm4BQsHCgME +AxUDAgMWAgECF4AACgkQ76Pnee32LDWSRwCfeASWXvpdt7bSFPMtszU/7uPEktsA +n23mYUN5WKJA1ZreW+0CcZ2ESnOviEYEExECAAYFAj5ogYgACgkQohFa4V9ri3IW +YACgsxGig0PL0M86rJsA/IpXjBdg3ysAoJzsoUZ/7s2BxDfzF/FRTVIzS+TMuQEN +BDy0eb8QBACBVb9YDJRp9Irzmq71Jf9FIPw+4g/cWpF3t/Eb7eSzMcOvTAXyNIWz +aaOjHre7lFctHfq8ls/6gR7uqajiAnfQcfTcu7pp+F5KsU0Embt83SFzZ3aoJwET +mB/LqUyrrGDiue3lU+flJO7UmcsRvtk0+BDkyCeB9HgfdpXbBLCyuwADBQP+PNxX +4e1tg3ZJo/xNEnD2Re3HjmQRrr0RYJLUGjgQrAEONSgowx3IW8/JssmNJVjnYm0q +jSKsb8rergCFJhPNZ8Dd/k00pKcrq+IN6j7WTYLqPce87zrGAZUtmDwDSp5mxy5E +xWJJxsgBPk4YBQLzJt21A3BgK/i24Sze2VLbaZuIRgQYEQIABgUCPLR5vwAKCRDv +o+d57fYsNa8xAJ4mLfonZbd64+YY9rfvhIh3Vsl3AACeLPPKtma2K6XCfhTBEDnj +hzSr4vo= +=lBfF +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/5F6B8B72 2001-05-28 +uid Stefan Bodewig +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig 51898504 2002-01-11 Conor MacNeill +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig D6298F01 2003-04-27 Paulo Henrique Gaspar Jorge +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig E4136392 2005-07-21 Noel J. Bergman +sig 8408F755 2005-07-21 Christian Geisert +sig 2 FC243F3C 2005-07-20 Henk P. Penning +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User ID not found] +sig 3 2A623F72 2005-07-25 [User ID not found] +sig 3 F8EA2967 2005-07-26 [User ID not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +sig CE419C8F 2007-01-05 Upayavira +sig E222DE4F 2007-05-02 Mathias Herberts +sig 911203E4 2007-05-02 [User ID not found] +sig F12F6072 2007-05-05 [User ID not found] +sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen +sig 3 311A3DE5 2007-05-05 Ruediger Pluem +sig 3 88817402 2007-05-06 Thomas Vandahl +sig 5F298824 2007-05-06 Simon Pepping +sig 4CEED75F 2007-05-06 Nick Burch +sig 4358C584 2007-05-06 Vincent Hennebert +sig 0B7E6CFA 2007-05-06 Sami Siren +sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) +sig 40581837 2007-05-08 Nick Kew +uid Stefan Bodewig +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 51898504 2005-06-21 Conor MacNeill +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig 8408F755 2005-07-21 Christian Geisert +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User ID not found] +sig 3 2A623F72 2005-07-25 [User ID not found] +sig 3 F8EA2967 2005-07-26 [User ID not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +sig E222DE4F 2007-05-02 Mathias Herberts +sig 911203E4 2007-05-02 [User ID not found] +sig F12F6072 2007-05-05 [User ID not found] +sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen +sig 3 311A3DE5 2007-05-05 Ruediger Pluem +sig 3 88817402 2007-05-06 Thomas Vandahl +sig 4CEED75F 2007-05-06 Nick Burch +sig 4358C584 2007-05-06 Vincent Hennebert +sig 0B7E6CFA 2007-05-06 Sami Siren +sig 3 DE8884A0 2007-05-07 Xavier Hanin +sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) +sig 40581837 2007-05-08 Nick Kew +uid Stefan Bodewig +sig 3 5F6B8B72 2005-05-31 Stefan Bodewig +sig 51898504 2005-06-21 Conor MacNeill +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User ID not found] +sig 3 2A623F72 2005-07-25 [User ID not found] +sig 3 F8EA2967 2005-07-26 [User ID not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +sig E222DE4F 2007-05-02 Mathias Herberts +sig 911203E4 2007-05-02 [User ID not found] +sig F12F6072 2007-05-05 [User ID not found] +sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen +sig 3 311A3DE5 2007-05-05 Ruediger Pluem +sig 3 88817402 2007-05-06 Thomas Vandahl +sig 4CEED75F 2007-05-06 Nick Burch +sig 4358C584 2007-05-06 Vincent Hennebert +sig 0B7E6CFA 2007-05-06 Sami Siren +sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) +sig 40581837 2007-05-08 Nick Kew +sub 1024g/24774157 2001-05-28 +sig 5F6B8B72 2001-05-28 Stefan Bodewig + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.2 (GNU/Linux) + +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 +b0zPjKjGuiwdKSnkFbNcFS3g +=UxMc +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/C152431A 2005-07-18 [expires: 2010-07-17] +uid Steve Loughran +sig 3 C152431A 2005-07-18 Steve Loughran +sig 2 FC243F3C 2005-07-20 Henk P. Penning +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 8103A37E 2005-07-20 Andre Malo +sig 5793498F 2005-07-21 Tim Ellison +sig E4136392 2005-07-21 Noel J. Bergman +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 2261D073 2005-07-20 Astrid Kessler (Kess) +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 Christoph Probst +sig 3 2A623F72 2005-07-25 Christoph Probst +sig 3 F8EA2967 2005-07-26 Brian McCallister +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 152924AF 2005-07-29 Sander Temme +sig 3 87315C31 2005-07-23 Raphaël Luta +sub 2048g/59066D7B 2005-07-18 [expires: 2010-07-17] +sig C152431A 2005-07-18 Steve Loughran + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.2 (GNU/Linux) + +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 +0N6XOghJAJ4mSgdwgv+sIOaPKQqCm+PL2M0lPw== +=4TlI +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/AA0077B0 2006-06-13 +uid Kev Jackson (apache key) +sig 3 AA0077B0 2006-06-13 Kev Jackson (apache key) +sub 2048g/8A6DD738 2006-06-13 +sig AA0077B0 2006-06-13 Kev Jackson (apache key) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.1 (Darwin) + +mQGiBESOfuoRBADiCLjvY8EG8cDrfNvPaVJr1/8d8GDoLjBCeJWl50M7j1IQDB+r +rzBPXOzhoqiNRbZMkpjv8ofa5hVOQitVS4B69FA07RbuiQNTKg142h8ogtJeAI1g +eXuTZtmGE47TOpj7FMG8bHOmoJdQMkzUsdOhEAyqRu4noknuuIKgsE1kYwCgnhaH +9KBlpKaRG7Bb2BH6da+wmKUEAIaBeZ1aSQodUzDqnGjCd4hZbpzjyWg7O5BylNhK +ogMY95BvwFRD8WFdSvhvH9VKBtSuNqg/6gIkqAljRRESVxL4QrzlYSqF513kK1ds +lUTmqU9Dvaf7dkH+MYnkPVTP5tMZVCT7HEt4F6HcqlaZKlz5jsu3R53KBx6XZATc +SEGbA/wOournJ64We8sXTJGHFupvSLBy3nh68mPLaplzTnH2al1DLBnoF2giC32v +ZGG+e12kWE+fyyQ3pdAIRHgVjZ/ckPmcmxnVcYrhzbgV99fo2+JRh2SVrLrmvw+G +CKiUtNHn0HS1klBKSj+3ML1AQQlbyfrcVSf0Fefug51BqoqU+rQqS2V2IEphY2tz +b24gKGFwYWNoZSBrZXkpIDxrZXZqQGFwYWNoZS5vcmc+iF4EExECAB4FAkSOfuoC +GwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQoL/5PaoAd7BnTACff9f8Y2RFB7O7 +Wjncyb1XbEwJB/gAninrR0isW9jGx49GmSnQCjtO9k34uQINBESOfzMQCACP+GP2 +x2nE2JxjUUjj16ftOxUivbL8L9ksplx41n7yeRvu+RzOXcjlonuld0LYxprNsHGv +mbAoZj93QozHQIMfC2kfnia+hxCcBPMbev9RPCqgogpb90BtV0f9HGyWXs2QTgWG +R2hyjq/RpwtA3obSXw3pb1CnXW4stV65WAdd72KDc66wRR1gmjxKQx6b1dGcC+E4 +HyOgu2CDtr1ULPeI5U4BA4y8FLgDfYwkxp6vj5ViegGP7GlMa3bSgNRGsYX7VwgZ +pmI8WY4B5k3/Pyv2Toe6/5zTmKH8WlyZd00ede/tbFTqQLg+EylAcWJ8c3asood+ +SjCwTuD8l8a0wpO3AAMHB/9GXkbBUE8cbMTaS4yj7UL5iWRVhSPo9IzMSrzaXmZN +8ykX96ud35BCEfmYgty3USMk90Rs/PbwB4Mh3h1ZTXqRWcfOXzJ8kMabm2RANyf2 +H2DvGKoFPtpX/9I13vo9qRLRHVRENNg+3JCa1ii8cq7h8bWvTT0VxX/rOG0cl8nO +XkHTUARR19cGPf6XkHEcl+u1pAxIJGqY/gVowjyFGZs+RXFl/q/Vrgu+lvvxmryd +yEdeGdsBvQ9M0KKr98w1RiJnDUkSqI711xwlVk14Uu6Xke0oB3bbpe4UxD52avAC +yEzYY7vbpe6XS2+dOcZxWE3eur6SfsucAkj4Ib72mchhiEkEGBECAAkFAkSOfzMC +GwwACgkQoL/5PaoAd7BQAwCeJFb9yZvOWfdf73A7t2MvPXn1y6kAnRquMmA5eVdh +HbAUXWyYuT2OHOSD +=F2q3 +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/DE8884A0 2007-04-27 Xavier Hanin +sig 3 DE8884A0 2007-04-27 Xavier Hanin +sig 5F298824 2007-05-06 Simon Pepping +sig A99F75DD 2007-05-03 Rodent of Unusual Size +sig E222DE4F 2007-05-02 Mathias Herberts +sig 911203E4 2007-05-02 [User id not found] +sig 302DA568 2007-05-03 Rodent of Unusual Size (DSA) +sig 2C312D2F 2007-05-03 Rodent of Unusual Size +sig F12F6072 2007-05-05 Fred Vos +sig 3 311A3DE5 2007-05-05 Ruediger Pluem +sig 3 88817402 2007-05-06 Thomas Vandahl +sig 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) +sig 5F6B8B72 2007-05-12 Stefan Bodewig +sig 9C85222B 2007-05-14 Henning Schmiedehausen +sig 4358C584 2007-05-06 Vincent Hennebert +sig 0B7E6CFA 2007-05-06 Sami Siren +sig 4CEED75F 2007-05-07 Nick Burch +sig 40581837 2007-05-08 Nick Kew +sig 6BD872A0 2007-05-17 Michael Busch (Lucene Committer) +sig 6210BFC0 2007-05-17 Jean-Frederic Clere +sig 3 990ED4AA 2007-05-06 Knut Anders Hatlen +sig 0F143BC1 2007-05-22 Matt Hogstrom +sig A46C4CA1 2007-05-22 Matt Hogstrom +sig 152924AF 2007-05-23 Sander Temme +sub 1024g/A5EB8D3D 2007-04-27 +sig DE8884A0 2007-04-27 Xavier Hanin + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.3 (MingW32) + +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 +0P7XxTpZ4EKSvOkQ6IhGBBARAgAGBQJGTEaDAAoJEB8hI8Nr2HKgtRoAnReqmHxs +MbATTtCEF+WbTqREe1+JAJ9pM5VmM/Apfh1hPM8i55Q96BP1h4hGBBARAgAGBQJG +TIFwAAoJEA9FCiZiEL/A4j0AnAsAjAu6nDTd73TM3S80JtbuatX8AJ0WBRJk5ZZI +TmnMyz2yp6k57tyeRohGBBMRAgAGBQJGPbLbAAoJEOHh8rCZDtSqCOQAn0SVan9j +r55MJrDGk8D3M5pQvTd8AJ9uU45i0OQUP+zY5LSacNtOzSy6MIhGBBARAgAGBQJG +Una1AAoJEDLB1u8PFDvBK+EAoMjrujpsE1XQs3YxDwz5HHSWv9E7AKCJLU0W2MbF +OIgs9Smxz2LbuYH7lIhGBBARAgAGBQJGUnbGAAoJEMuuvjmkbEyh9uMAoJ2fBgZo +2kl+jOzhQnXHHDHzyLyAAKCR8Z6tloKXkhPRIV/N/OjwIW0i54ipBBARAgBpBQJG +U8qkIBxTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+IhxTYW5kZXIgVGVt +bWUgPHNjdGVtbWVAYXBhY2hlLm9yZz4eHFNhbmRlciBUZW1tZSA8c2FuZGVyQG1h +Yy5jb20+AAoJELK+vEAVKSSveJAAniq8wB4b/DdGTK9Ygmu5Y76tqsw/AJsHGkn3 +5JyiHbXCvVujWmPtY1/OZbkBDQRGMZ4PEAQA+T0YRtd2aeXU+AOJnrhChy0dptVt +CE6PW9LrwZGqeV4THNWhdYuWRWlyzgU4HSfuk1Svu3WKMbnwp+Fv8fU6MmidOvEJ +p9IV1l4DidIXyhAacwpCN11hXvj5cHdF4KhJr/NG9oedin6nQoQFRQ7EfkUjAXOf +MCZnSps9XBJdy3cAAwUEAIGrITayVmWfUgjPvQg8L+4R2i31XQ70HIELQtYDs0Ln +iWrwZuO+aLI6Jw1RbZii6DM2QsVdZj+v36S2KJTvXeJVyb51d0uXYFxre1uCZrb2 +I1Lle8v3GVQvlrTpmZIPhOTotskKFWUCh2jqgLaEvJPpRWgIRXPF4g12nBXcLLXE +iEkEGBECAAkFAkYxng8CGwwACgkQA/aMvd6IhKDVtQCeKdUGQS0lD0nAJsGiSbKg +gLwEM0sAn0dUIIsbxE0fTHQVIQK4bII82UhZ +=jwNf +-----END PGP PUBLIC KEY BLOCK----- +pub 1024D/B80602AE 2008-10-22 +uid Maarten Coene (CODE SIGNING KEY) +sig 3 B80602AE 2008-10-22 Maarten Coene (CODE SIGNING KEY) +sig 5F6B8B72 2009-02-02 Stefan Bodewig +sub 2048g/9C7184FE 2008-10-22 +sig B80602AE 2008-10-22 Maarten Coene (CODE SIGNING KEY) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.9 (Cygwin) + +mQGiBEj/pNYRBADN+YqWzDBLrOgiUCul5TWVLgUReY2VMaWh3Z732AMPJb1dlbtW +B8sRqyvtQxKIPIItl6oaom5yzuqc8leXQCJBVRnnBkv8cMomhOD/AuzaA82egttI +C+CHt/akaUPhgrzhry7TZ7lVtJZ04FJ9WaE+LKAZcnlhCWOSF330pRB8bwCg8E5k +4TF9z2cmwfRmMwJxruRpN1cEAJ0yo22TkjSksXFmQf0eKVEPaHmrsEjNzIECcz8m +JrggYDfXIgC2s758D7uhUTlJM7u1L2KTZmiZgiFp6WOw6DnPlBf4PRD03038fAQn +rGtfC/B7DcgMLS4tCPlGEyeh9H8RphaVSXVCN5IgRV4x0vIhyx7kVz1ZWbAlLEQx +KHp8BAC3/K9yVkRDa6m+HAZvRP60zxWAwIdiX1R/9CCRtI4uSaLz1Iiw0jni1YkE +tFe+z5PNa89Dy1bgFWJKxtG1jQVfHIt6nEz2C4z3Xk02+PxmJH/Dj84EOiLfxzvp +Hm2hA57GrNjJuvG7C7GVFy+bQh8DCkzJfGAaplSgzqyVmP/l5bQ2TWFhcnRlbiBD +b2VuZSAoQ09ERSBTSUdOSU5HIEtFWSkgPG1hYXJ0ZW5jQGFwYWNoZS5vcmc+iGAE +ExECACAFAkj/pNYCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBb4LqMuAYC +rpMmAKCNSdXDiaOex6L8UmKiGbkEah3llgCgotsI/YjRzQNSvmGfqrgkch6f0tqI +RgQQEQIABgUCSYbTIwAKCRCiEVrhX2uLckjKAJ9f0JEsAJIJDn80SMIHaEXhJj9N +tgCeL29JGbUoYjTq8LpoMrl3ZhDaqEy5Ag0ESP+k1hAIALRxgmE+fbedOgRhLl4w +pZyt3A/EXiZBY/9UDRAWpviCp4S3cQ5cjhv3glj8IAHw2ntuEJ2ksjG5r/swQ38z +quTdDY4YT/Qd5NDlSX+KOGL69mda6kFFiNeJerDcM0FPjiV3MWcNp4IwJTs45EX2 +ep17a0oUG2AhDjL8c/32elHzXtkzoMPQzBWqHdTO4gkp/2iLw/bTpfEJLtWKsWJS +lgnLobisAnWjFBo/NgtjxaxGjwIjTn4OZNQaBi3P46PP9FEj4Hp791i1YvkBYrIg +BaQY96Fexd/7FKyvBefUmlxZPyY7I/OI11KWifJoSj1qPxZb+90UQN2r9zySDdpQ +h0MAAwYH/jkSE2KTx5R/vU+bnz11Kx3NRq6kxCQBGUclPGgUxk7iSWfHggQ/0U3m +1TI8GL687dwb8AO+f2b4nov4g4umdoddu9gPlHvpBcQ1BGx8JqcWJJ+F7lWUeVw+ +bqp5Qcttm9ldw1HEbUF0l81VFpLNDV6p5z3zrXGE84fk2BEMzD23IhMwNnWDsDVu +2S46h6BuK8sdTzgP5GTXw/7c7xG2zgfMHVUBWtuz5P6D8vl9gHu6unuLIcKspOgI +Vl2ygZ2VsxGUscyR9soLrem7hZaaQJfJqH757X3K8SuGZY36mH69Ziwzs1gQlof6 +bgumh74P8Xu+StvFwdZn1+aFsqcoDwuISQQYEQIACQUCSP+k1gIbDAAKCRBb4LqM +uAYCrpuxAJ9NYy3kPGHYAZuFSeygBt3aV1acGACeP9bIj81YOQn45Dvgmb7zqYBU +g7o= +=jpcP +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/3B7C75B1 2007-05-29 +uid Gilles Scokart (at apache) +sig 3 3B7C75B1 2007-05-29 Gilles Scokart (at apache) +sig 51047D66 2009-03-25 Tony Stevenson +sig 01530235 2009-03-26 Luc Maisonobe (general purpose) +sig 6A017B17 2009-03-29 H.-Dirk Schmitt +sig 5F6B8B72 2009-03-30 Stefan Bodewig +sig B1313DE2 2009-03-30 Robert Burrell Donkin (CODE SIGNING KEY) +sig 40581837 2009-03-31 Nick Kew +sub 2048g/82AE20EE 2007-05-29 +sig 3B7C75B1 2007-05-29 Gilles Scokart (at apache) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.9 (Cygwin) + +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 +PEZ4/iF5mYiEb2kEZmS6aRhVxuA= +=w8bP +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/7BF8BE8E 2008-06-18 +uid Nicolas Lalevée +sig 3 7BF8BE8E 2010-01-21 Nicolas Lalevée +sig 3 7BF8BE8E 2008-06-18 Nicolas Lalevée +sub 2048g/64443553 2008-06-18 +sig 7BF8BE8E 2008-06-18 Nicolas Lalevée + +pub 4096R/971731FB 2010-01-29 +uid Nicolas Lalevée +sig 3 971731FB 2010-01-29 Nicolas Lalevée +sig 7BF8BE8E 2010-01-29 Nicolas Lalevée +sig 0642FA40 2010-01-31 Lionel Porcheron +sub 4096R/9A54153C 2010-01-29 +sig 971731FB 2010-01-29 Nicolas Lalevée + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.10 (Darwin) + +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 +wepeqtU= +=gSlB +-----END PGP PUBLIC KEY BLOCK----- + +pub 4096R/9711DBFC 2010-03-11 +uid Jon Schneider +sig 3 9711DBFC 2010-03-11 Jon Schneider +sub 4096R/3DAD980A 2010-03-11 +sig 9711DBFC 2010-03-11 Jon Schneider + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.10 (MingW32) + +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 +udvp +=oSat +-----END PGP PUBLIC KEY BLOCK----- +pub 1024D/265B4C63 2003-08-18 +uid Antoine Levy-Lambert (Apache Ant Committer) +sig 3 265B4C63 2003-12-06 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 5F6B8B72 2003-12-12 Stefan Bodewig +uid Antoine Levy-Lambert (Apache Ant Committer) +sig 3 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 5F6B8B72 2003-12-12 Stefan Bodewig +sub 1024g/A3060393 2003-08-18 +sig 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) + +pub 4096R/710038F5 2010-11-02 +uid Antoine Levy-Lambert (CODE SIGNING KEY) +sig 3 710038F5 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) +sub 4096R/84F32FDC 2010-11-02 +sig 710038F5 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) + +pub 4096R/82A7FBCD 2010-11-02 +uid Antoine Levy-Lambert (CODE SIGNING KEY) +sig 3 82A7FBCD 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) +sig 62B2963F 2010-11-04 Dan Poirier +sig 7C408737 2010-11-04 Joseph Edward Bergmark (CODE SIGNING KEY) +sig 02E9F65B 2010-11-04 Luc Maisonobe +sig EFB55DF1 2010-11-05 Luciano Resende (Code Signing Key) +sub 4096R/70EC4C9A 2010-11-02 +sig 82A7FBCD 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG/MacGPG2 v2.0.16 (Darwin) + +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 +3PimOFurhebU3wOU0wEkNb/3IYLk+MFQOA== +=1STU +-----END PGP PUBLIC KEY BLOCK----- + +pub 2048R/AAE4CBCD 2014-01-27 +uid Charles Duffy +sig 3 AAE4CBCD 2014-01-27 Charles Duffy +uid Charles Duffy +sig 3 AAE4CBCD 2014-01-27 Charles Duffy +sub 2048R/886E0B44 2014-01-27 +sig AAE4CBCD 2014-01-27 Charles Duffy + +pub 4096R/87C39319 2014-01-27 [expires: 2024-01-25] +uid Charles Duffy (CODE SIGNING KEY) +sig 3 87C39319 2014-01-27 Charles Duffy (CODE SIGNING KEY) +sub 4096R/CEE42EB1 2014-01-27 [expires: 2024-01-25] +sig 87C39319 2014-01-27 Charles Duffy (CODE SIGNING KEY) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.14 (GNU/Linux) + +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 +RHkiOuu1l6jXCeh/J1R6YidjsDjKWlRkHifMmw== +=j+uw +-----END PGP PUBLIC KEY BLOCK----- diff --git a/framework/src/ant/apache-ant-1.9.6/LICENSE b/framework/src/ant/apache-ant-1.9.6/LICENSE new file mode 100644 index 00000000..cdf6ff8b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/LICENSE @@ -0,0 +1,272 @@ +/* + * 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. + */ + +W3C® SOFTWARE NOTICE AND LICENSE +http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + +This work (and included software, documentation such as READMEs, or other +related items) is being provided by the copyright holders under the following +license. By obtaining, using and/or copying this work, you (the licensee) agree +that you have read, understood, and will comply with the following terms and +conditions. + +Permission to copy, modify, and distribute this software and its documentation, +with or without modification, for any purpose and without fee or royalty is +hereby granted, provided that you include the following on ALL copies of the +software and documentation or portions thereof, including modifications: + + 1. The full text of this NOTICE in a location viewable to users of the + redistributed or derivative work. + 2. Any pre-existing intellectual property disclaimers, notices, or terms + and conditions. If none exist, the W3C Software Short Notice should be + included (hypertext is preferred, text is permitted) within the body + of any redistributed or derivative code. + 3. Notice of any changes or modifications to the files, including the date + changes were made. (We recommend you provide URIs to the location from + which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE +NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT +THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY +PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in advertising or +publicity pertaining to the software without specific, written prior permission. +Title to copyright in this software and any associated documentation will at +all times remain with copyright holders. + +____________________________________ + +This formulation of W3C's notice and license became active on December 31 2002. +This version removes the copyright ownership notice such that this license can +be used with materials other than those owned by the W3C, reflects that ERCIM +is now a host of the W3C, includes references to this specific dated version of +the license, and removes the ambiguous grant of "use". Otherwise, this version +is the same as the previous version and is written so as to preserve the Free +Software Foundation's assessment of GPL compatibility and OSI's certification +under the Open Source Definition. Please see our Copyright FAQ for common +questions about using materials from our site, including specific terms and +conditions for packages like libwww, Amaya, and Jigsaw. Other questions about +this notice can be directed to site-policy@w3.org. + +Joseph Reagle + +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 diff --git a/framework/src/ant/apache-ant-1.9.6/NOTICE b/framework/src/ant/apache-ant-1.9.6/NOTICE new file mode 100644 index 00000000..a9957fc0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/NOTICE @@ -0,0 +1,9 @@ +Apache Ant +Copyright 1999-2015 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +The task is based on code Copyright (c) 2002, Landmark +Graphics Corp that has been kindly donated to the Apache Software +Foundation. diff --git a/framework/src/ant/apache-ant-1.9.6/README b/framework/src/ant/apache-ant-1.9.6/README new file mode 100644 index 00000000..95109410 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/README @@ -0,0 +1,97 @@ + + A N T + + + What is it? + ----------- + + Ant is a Java based build tool. In theory it is kind of like "make" + without makes wrinkles and with the full portability of pure java code. + + + Why? + ---- + + Why another build tool when there is already make, gnumake, nmake, jam, + and others? Because all of those tools have limitations that its original + author couldn't live with when developing software across multiple platforms. + + Make-like tools are inherently shell based. They evaluate a set of + dependencies and then execute commands not unlike what you would issue on a + shell. This means that you can easily extend these tools by using or writing + any program for the OS that you are working on. However, this also means that + you limit yourself to the OS, or at least the OS type such as Unix, that you + are working on. + + Makefiles are inherently evil as well. Anybody who has worked on them for any + time has run into the dreaded tab problem. "Is my command not executing + because I have a space in front of my tab!!!" said the original author of Ant + way too many times. Tools like Jam took care of this to a great degree, but + still use yet another format to use and remember. + + Ant is different. Instead a model where it is extended with shell based + commands, it is extended using Java classes. Instead of writing shell + commands, the configuration files are XML based calling out a target tree + where various tasks get executed. Each task is run by an object which + implements a particular Task interface. + + Granted, this removes some of the expressive power that is inherent by being + able to construct a shell command such as `find . -name foo -exec rm {}` but + it gives you the ability to be cross platform. To work anywhere and + everywhere. And hey, if you really need to execute a shell command, Ant has + an exec rule that allows different commands to be executed based on the OS + that it is executing on. + + The Latest Version + ------------------ + + Details of the latest version can be found on the Apache Ant + Project web site . + + + Documentation + ------------- + + Documentation is available in HTML format, in the docs/ directory. + For information about building and installing Ant, see + docs/manual/index.html + + + Licensing + --------- + + This software is licensed under the terms you may find in the file + named "LICENSE" in this directory. + + This distribution includes cryptographic software. The country in + which you currently reside may have restrictions on the import, + possession, use, and/or re-export to another country, of + encryption software. BEFORE using any encryption software, please + check your country's laws, regulations and policies concerning the + import, possession, or use, and re-export of encryption software, to + see if this is permitted. See for more + information. + + The U.S. Government Department of Commerce, Bureau of Industry and + Security (BIS), has classified this software as Export Commodity + Control Number (ECCN) 5D002.C.1, which includes information security + software using or performing cryptographic functions with asymmetric + algorithms. The form and manner of this Apache Software Foundation + distribution makes it eligible for export under the License Exception + ENC Technology Software Unrestricted (TSU) exception (see the BIS + Export Administration Regulations, Section 740.13) for both object + code and source code. + + The following provides more details on the included cryptographic + software: + + For the SSH family of tasks ( and ) Ant requires the + JSch library as well as the + Java Cryptography extensions + . Ant does not + include these libraries itself, but is designed to use them. + + Thanks for using Ant. + + The Apache Ant Project + diff --git a/framework/src/ant/apache-ant-1.9.6/WHATSNEW b/framework/src/ant/apache-ant-1.9.6/WHATSNEW new file mode 100644 index 00000000..9a6d4782 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/WHATSNEW @@ -0,0 +1,6263 @@ +Changes from Ant 1.9.5 TO Ant 1.9.6 +=================================== + +Changes that could break older environments: +------------------------------------------- + +Fixed bugs: +----------- + + * ArrayIndexOutOfBoundsException when ZIP extra fields are read and + the entry contains an UnparseableExtraField. + https://issues.apache.org/jira/browse/COMPRESS-317 + +Other changes: +-------------- + * Hidden resource is published now. It reads the + value of a specified java constant. + + +Changes from Ant 1.9.4 TO Ant 1.9.5 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * The ReplaceTokens filter can now use token-separators longer than + one character. This means it can be used to replace mustache-style + {{patterns}} and similar templates. This is going to break code + that invokes the setters on ReplaceTokens via the Java API as their + parameters have been changed from char to String. It may also + break build files that specified multi character tokens and relied + on Ant silently ignoring all but the first character. + Bugzilla Report 56584 + + * The changes that added 's support for gzip encoding + automatically uncompressed content that would not have been touched + before - like when downloading .tar.gz files. A new flag has been + added to control the behavior and its default will make work + as it did in 1.9.3. I.e. if you want it to work like 1.9.4 + you have to explicitly set tryGzipEncoding to true. + Bugzilla Report 57048 + +Fixed bugs: +----------- + + * TarArchiveInputStream failed to read archives with empty gid/uid + fields. + Bugzilla Report 56641 + + * TarArchiveInputStream could throw IOException when reading PAX + headers from a "slow" InputStream. + + * XMLJunitResultFormatter could throw NullPointerException if Java + cannot determine the local hostname. + Bugzilla Report 56593 + + * URLResource#getLastModified tried to access the connection to the + URL without making sure it was established, potentially leading to + a NullPointerException when using FTP. + Bugzilla Report 56873 + + * Long-Name and -link or PAX-header entries in TAR archives + always had the current time as last modfication time, creating + archives that are different at the byte level each time an + archive was built. + + * runant.py should now work as well when the path of the Java executable + contains spaces. + github pull request #1 + + * now supports nested and elements. + Bugzilla Report 47002 + + * complete-ant-cmd.pl now also knows about the -file option. + Bugzilla Report 57371 + + * the br-replace template inside the XSLT stylesheets used by + could cause stack overflows or out-of-memory errors + when applied to big outputs. + Bugzilla Report 57341 + + * removed spurious warning about unclosed ZipFiles when reading the + archive failed. + Port of https://issues.apache.org/jira/browse/COMPRESS-297 + + * FileUtils.rename which is used by several tasks can throw a + NullPointerException if the "normal" renameTo operation fails and + an exception occurs while rename falls back to copying and deleting + the file. + Bugzilla Report 57533 + + * complete-ant-cmd.pl would incorrectly suggest words from the build + file description. + Bugzilla Report 51931 + + * complete-ant-cmd.pl now also completes tasks without a description. + Bugzilla Report 57542 + + * LocalPropertyStack could run into ConcurrentModificationException + when tasks spawned new child threads that accessed the properties. + Bugzilla Report 55074 + + * TarEntry's constructor with a File and a String arg didn't + normalize the name. + + * Between 1.8.4 and 1.9.0 TarInputStream started to parse file + names using the platform's default encoding rather than as ASCII. + This has been a breaking change that has never been marked as such + (in fact it went unnoticed). In order to allow and + to work on platforms who's encoding doesn't match the + encoding of file names inside the archive, both now support + encoding attributes. + The attribute has also been added to for symmetry. + Bugzilla Report 57822 + +Other changes: +-------------- + + * it is now possible to provide proxy configuration to signjar + when using the timestamped authority. + Bugzilla Report 56678 + + * complete-ant-cmd.pl now also analyzes the ANT_ARGS environment + variable. + Bugzilla Report 57371 + + * ported some of the write-optimization of Commons Compress 1.10 to + the ZIP package + + * adapted unit tests to Java9 and added "javac1.9" as valid option + for javac's compiler attribute. + + * performance improvements for + Bugzilla Report 57588 + + * MailLogger can now add CC and BCC addresses. + Bugzilla Report 57789. + + * 's buffer size has been increased from 1k to 100k to match + and . + github pull requests #8 and #9 + + * The tar package can now deal with group and user ids bigger than + 0x80000000. + https://issues.apache.org/jira/browse/COMPRESS-314 + https://issues.apache.org/jira/browse/COMPRESS-315 + + * has new attributes fileMode and dirMode that control the + permissions on the remote side when sending data via SSH. + Bugzilla Report 43271. + + * New and resource collections can be used + to select all but a given subset of a resource collection. + Bugzilla Report 57834. + +Changes from Ant 1.9.3 TO Ant 1.9.4 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * the prefixValues attribute of didn't work as expected + when set to false (the default). + It is quite likely existing build files relied on the wrong + behavior and expect Ant to resolve the value side against the + properties defined in the property file itself - these build files + must now explicitly set the prefixValues attribute to true. + Bugzilla Report 54769 + + * when matching an entry of a zip/tarfileset against a pattern a + leading slash will be stripped from the entry name. Most archives + don't contain paths with leading slashes anyway. + This may cause include/exclude patterns that start with a / to stop + matching anything. Such patterns only used to work by accident and + only on platforms with multiple file system roots. + Bugzilla Report 53949 + + * DirectoryScanner and thus fileset/dirset will now silently drop all + filesystem objects that are neither files nor directories according + to java.io.File. This prevents Ant from reading named pipes which + might lead to blocking or other undefined behavior. + Bugzilla Report 56149 + + * BuildFileTest and BaseSelectorTest have both been deprecated in + favour of BuildFileRule and BaseSelectorRule respectively, and the + tests that previously extended these base tests have been converted to + JUnit 4 tests using the new "rule"s. Any external test that sub-classed + a test in the Ant workspace, rather than BuildFileTest, will need + changed to either use JUnit4's annotations, or be modified to + extend BuildFileTest directly. This will not affect any tests that are + being executed by Ant's junit or batchtest tasks that are not specifically + testing Ant's code. + +Fixed bugs: +----------- + + * / failed when the importing file was loaded from an + URI or a jar and it imported a file from the local file system via + an absolute path. + Bugzilla Report 50953 + + * could import the same resource twice when imported via + different resource types. + Bugzilla Report 55097 + + * several calls to File#mkdirs could fall victim to a race condition + where another thread already created the same directory. + Bugzilla Report 55290 + + * created '/' rather than './' for the parent + directory of the given jarfile. + Bugzilla Report 55049 + + * 's fixlastline="true" didn't work when using certain filter + readers. + Bugzilla Report 54672 + + * several places where resources are read from jars will now + explicitly disable caching to avoid problems with reloading jars. + Bugzilla Report 54473 + + * AntClassloader will now ignore files that are part of the classpath + but not zip files when scanning for resources. It used to throw an + exception. + Bugzilla Report 53964 + + * caused a NullPointerException when no destdir was set. + Bugzilla Report 55949 + + * would still include the + Main section of the fileset manifests if there was no nested + manifest or manifest attribute. + Bugzilla Report 54171 + + * reading of compiler args has become more defensive + Bugzilla Report 53754 + + * without force="true" would not only fail to overwrite a + read-only file as expected but also remove the existing file. + Bugzilla Report 53095 + + * would remove symbolic + links to not-included files. It will still delete symlinks to + directories that would have been followed even if they are not + explicitly included. exclude-Patterns can still be used to + preserve symbolic links. + Bugzilla Report 53959 + + * Sometimes copy-operations using NIO FileChannels fail. Ant will + now try to use a Stream based copy operation as fallback when the + Channel based copy fails. + Bugzilla Reports 53102 and 54397 + + * Javadoc.postProcessGeneratedJavadocs() fails for Classes that + extend Javadoc + Bugzilla Report 56047 + + * TarInputStream will now read archives created by tar + implementations that encode big numbers by not adding a trailing + NUL. + + * the isExists() method of URLResource returned false positives for + HTTP and FTP URLs. + +Other changes: +-------------- + + * initial support for Java 1.9 + + * can optionally pass System.in to the remote process + Bugzilla Report 55393 + + * now supports capturing error output of the executed + process and setting a property from the return code. + Bugzilla Report 48478 + + * now has an option to fail if javadoc issues warnings. + Bugzilla Report 55015 + + * has a new outputencoding attribute. + Bugzilla Report 39541 + + * changes to JUnitTestRunner and PlainJUnitResultFormatter to make + OutOfMemoryErrors less likely. + Bugzilla Report 45536 + + * changes to DOMElementWriter to make OutOfMemoryErrors less likely. + Bugzilla Report 54147 + + * has a new attribute binaryOutput that prevents Ant + from splitting the output into lines. This prevents binary output + from being corrupted but may lead to error and normal output being + mixed up. + Bugzilla Report 55667 + Bugzilla Report 56156 + + * the nested elements of now have an optional + inputEncoding attribute that can be used to specify the encoding of + files read that don't use the platform's default encoding. + Bugzilla Report 56258 + + * The task now explicitly accepts and supports the gzip content encoding. + Bugzilla Report 49453 + + * A new resourcecollection type acts like a union + of s and s that share the same configuration but + have different base directories. + Bugzilla Report 48621 + + * has a quiet attribute that makes the task log errors only + when enabled. + GitHub Pull Request #1 + +* has now a threads attribute allowing to run the tests in several threads. + Bugzilla Report 55925 + +* addition of a new ProcessUtil class providing the process id of the current process + +* changes to allow to run the JUnit testcases of Ant in parallel, + by making them use unique temporary directories + +Changes from Ant 1.9.2 TO Ant 1.9.3 +=================================== + +Fixed bugs: +----------- + + * swallowed the status code of nested tasks. + Bugzilla Report 55539. + + * a race condition could make tasks of parallel builds to + interfere with each other. + Bugzilla Report 54393. + + * 's mailport still didn't work properly when using smtps. + Bugzilla Report 49267. + + * using attributes belonging to the if and unless namespaces + made macrodef fail. + Bugzilla Report 55885. + + * Ant 1.8 exec task changes have slowed exec to a crawl + Bugzilla Report 54128. + + * Apt is not available under JDK 1.8 + Bugzilla Report 55922. + + +Other changes: +-------------- + + * Documentation fix for if/unless attributes. PR 55359. + + * tar entries with long link names are now handled the same way as + entries with long names. + + * Addition of 'skipNonTests' attribute to and + tasks to allow the tasks to skip classes that don't contain tests. + + * now supports a nested to specify filters. + Bugzilla Report 55794. + + * 's params can now be typed. + Bugzilla Report 21525. + + * build of Mac OS X pkg installer + Bugzilla Report 55899. + +Changes from Ant 1.9.1 TO Ant 1.9.2 +=================================== + +Fixed bugs: +----------- + + * Parsing of zip64 extra fields has become more lenient in order to + be able to read archives created by DotNetZip and maybe other + archivers as well. + + * TarInputStream should now properly read GNU longlink entries' names. + Bugzilla Report 55040. + + * and used to be too restrictive when evaluating + whether a given set of options is compatible with spawning the new + process. + Bugzilla Report 55112. + +Other changes: +-------------- + + * will now post-process the generated in order to mitigate + the frame injection attack possible in javadocs generated by Oracle + JDKs prior to Java7 Update 25. The vulnerability is known as + CVE-2013-1571. + There is an option to turn off the post-processing but it is only + recommended you do so if all your builds use a JDK that's not + vulnerable. + Bugzilla Report 55132. + +Changes from Ant 1.9.0 TO Ant 1.9.1 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * Users who have their own ProjectHelper implementation will need to change it because the import and include tasks + will now default the targetPrefix to ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX. + Users using the default ProjectHelper2 with ant need not worry about this change done to fix Bugzilla Report 54940. + + +Fixed bugs: +----------- + + * Corrected XSLTC error in . + Bugzilla Report 54641. + + * Provide more control over Zip64 extensions created by and + related tasks. In particular no Zip64 extensions will be used at + all by the task family by default - this is required for jars + to be readably by Java5. + Bugzilla Report 54762. + + * Fixed loading of external dependencies in JUnit task. + Bugzilla Report 54835. + + * Target rewriting for nested "include" only works when "as" is specified. + See also "Changes that could break older environments" + Bugzilla Report 54940. + + +Other changes: +-------------- + + * strict attribute added to . + Bugzilla Report 54889. + + * simplifying Execute.getEnvironmentVariables since we are only running on Java 1.5 or higher now + + * Added conditional attributes. + Bugzilla Report 43362 + + * Recommending to upgrade jsch to 0.1.50, particularly if you are using Java 1.7. + jsch is the library behind the sshexec and scp Ant tasks. + Versions of jsch older than 0.1.50 fail randomly under Java 1.7 with an error message "verify: false" + +Changes from Ant 1.8.4 TO Ant 1.9.0 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * Ant now requires at least Java 1.5 to compile and to run + + * FixCRLF used to treat the EOL value ASIS to convert to the system property + line.separator. Specified was that ASIS would leave the EOL characters alone, + the task now really leaves the EOL characters alone. This also implies that + EOL ASIS will not insert a newline even if fixlast is set to true. + Bugzilla report 53036 + + * The CommandLauncher hierarchy that used to be a set of inner + classes of Execute has been extracted to the + org.apache.tools.ant.taskdefs.launcher package. + + * Any FileResource whose represented File has a parent also has a basedir. + + * Removing the Perforce Ant tasks replaced by tasks supplied by Perforce Inc. + + * Setting the default encoding of StringResource to UTF-8 instead of null + + * Upgrade JUnit 4 to JUnit 4.11 + +Fixed bugs: +----------- + + * Made VectorSet faster. + Bugzilla Report 53622. + + * Incorrect URLs in Ant child POMs. + Bugzilla Report 53617. + + * Subclasses of JUnitTask did not correctly find junit.jar. + Bugzilla Report 53571. + + * External XML catalog resolver failed to use project basedir when given an + unmentioned relative path like the internal resolver does. + Bugzilla Report 52754. + + * Fixed some potential stream leaks. + Bugzilla Reports 52738, 52740, 52742, 52743. + + * Updated documentation to fix spelling errors / broken links. + Bugzilla Reports 53215, 53291, 53202 + + * Unable to override system properties. It was not possible not to override + system properties from the command line (or from a property file). + Bugzilla Report 51792 + + * by default fails when run on JDK 8. + Bugzilla Report 53347. + + * ExtensionPoint doesn't work with nested import/include + Bugzilla Report 53405. + + * failed to strip the non-matched parts with + handledirsep="true". + Bugzilla Report 53399. + + * filter caused a NullPointerException when input + was empty. + Bugzilla Report 53626. + + * now supports HTTP redirects using status code 307. + Bugzilla Report 54374. + + * ssh tasks prompt for kerberos username/password under Java 7 + Bugzilla Report 53437. + + * Zip task on that excludes certain files by way of the mapper resulted in a NullPointerException + Bugzilla Report 54026 + + * The ant launcher script should properly detect JAVA_HOME on + MacOS X 10.7 + Bugzilla Report 52632 + + * Depend task does not handle invokeDynamic constant pool entries - java.lang.ClassFormatError: Invalid Constant Pool entry Type 18 + Bugzilla Report 54090 + + * Base64Converter not properly handling bytes with MSB set (not masking byte to int conversion) + Bugzilla Report 54460 + + * The size resource comparator would return wrong results if file + sizes differed by more than 2 GB. + Bugzilla Report 54623 + + * Unable to encode properly into UTF-8 when the system property file.encoding is + set to ANSI_X3.4-1968. + Bugzilla Report 54606 + + * JUnit4 tests marked @Ignore do not appear in XML output + Bugzilla Report 43969 + +Other changes: +-------------- + + * merged the ZIP package from Commons Compress, it can now read + archives using Zip64 extensions (files and archives bigger that 4GB + and with more that 64k entries). + + * a new task can be used to configure the + CommandLauncher used by Ant when forking external programs or new + Java VMs. + Bugzilla Report 52706. + + * merged the TAR package from Commons Compress, it can now read + archives using POSIX extension headers and STAR extensions. + + * merged the BZIP2 package from Commons Compress, it can now + optionally read files that contain multiple streams properly. + + * will now properly expand files created by pbzip2 and + similar tools that create files with multiple bzip2 streams. + + * now supports a new "posix" option for longfile-mode which + will make it create PAX extension headers for long file names. PAX + extension headers are supported by all modern implementations of + tar including GNU tar. + This option should now be used in preference to "warn" or "gnu" as + it is more portable. For backwards compatibility reasons "warn" + will still create "gnu" extensions rather than "posix" extensions. + + * The ProjectHelper class now exposes a method to be used by third party + implementations to properly resolve the binding between target extensions + and extension points. + Bugzilla Report 53549. + + * Make extension point bindable to imported prefixed targets + Bugzilla Report 53550. + + * Add the possibility to register a custom command line argument processor. + See org.apache.tools.ant.ArgumentProcessor and manual/argumentprocessor.html + + * add the possibility to suppress stdout in the sshexec task. + Bugzilla Report 50270. + + * add an encoding attribute to the contains selector. + This will be useful to use the contains selector if the encoding of the VM is different from the encoding + of the files being selected. + + * support for GNU Classpath. + Bugzilla report 54760. + +Changes from Ant 1.8.3 TO Ant 1.8.4 +=================================== + +Fixed bugs: +----------- + + * Ported libbzip2's fallback sort algorithm to CBZip2OutputStream to + speed up compression in certain edge cases. Merge from Commons + Compress. + + Using specially crafted inputs this can be used as a denial of + service attack. + See http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2098 + +Changes from Ant 1.8.2 TO Ant 1.8.3 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * The Enumeration returned by AntClassLoader#getResources used to + return null in nextElement after hasNextElement would return false. + It has been changed to throw a NoSuchElementException instead so + that it now adheres to the contract of java.util.Enumeration. + Bugzilla Report 51579. + +Fixed bugs: +----------- + + * Removed buggy duplicate JAR list in RPM mode. + Bugzilla Report 52556. + + * Launcher fixed to pass the right class loader parent. + Bugzilla Report 48633. + + * mishandled ${line.separator}. + Bugzilla Report 51049. + + * did not work in embedded environments on JDK 7. + Nor did when using Xalan redirects. + Bugzilla Report 51668, 52382. + + * Encoding of unicode escape sequences by the property file task + Bugzilla Report 50515. + + * The code that implicitly sets the -source switch if only -target + has been specified in was broken for Java 5 and 6. + Bugzilla Report 50578. + + * MailLogger ignore the Maillogger.starttls.enable property. + Bugzilla Report 50668. + + * Delete task example does not work + Bugzilla Report 50816. + + * 's proxy handling has been delegated to + internally so the two tasks are consistent. 's way of not + setting a proxy caused problems with other Java libraries. + Bugzilla Report 50888. + + * Include task breaks dependencies or extension-points for multiple + files. + Bugzilla Report 50866. + + * Read on System.in hangs for forked java task. + Bugzilla Report 50960. + + * FileResource specified using basedir/name attributes was non-functional. + + * Resource collection implementation of mapped PropertySet returned + unusable resources. + + * The hasmethod condition failed with a NullPointerException when + ignoresystemclasses is true and Ant tried to load a "restricted + class" - i.e. a class that the Java VM will only accept when loaded + via the bootclassloader (a java.* class). + It will now fail with a more useful error message. + Bugzilla Report 51035. + + * Exec task may mix the stderr and stdout output while logging it + Bugzilla Report 50507. + + * Missing space between "finished" and timestamp in task/target + finish message from ProfileLogger. + Bugzilla Report 51109. + + * Redirecting the output of a java, exec or apply task could print in the + error output stream some "Pipe broken" errors. + Bugzilla Report 48789. + + * ZipFile failed to clean up some resources which could lead to + OutOfMemoryException while unzipping large archives. + A similar problem in ZipArchiveOutputStream has been fixed as well. + Bugzilla Report 42696. + + * quiet attribute added to the copy and move tasks, to be used together + with failonerror=false, so warnings won't get logged + Bugzilla Report 48789. + + * System.in was closed and not readable anymore by the DefaultInputHandler + when Ant is used via its Java API. + Bugzilla Report 51161 + + * only supported a single non-fileset resource collection even + though the manual said it could be multiple. + + * didn't work properly when working on resource collections. + Bugzilla Report 51462. + + * cause a NullPointerException if it was used in a target + that was invoked by multiple targets from the command line. + Bugzilla Report 50894. + + * The ZipFile class could read past the start of the file if the + given file is not a ZIP archive and it is smaller than the size of + a ZIP "end of central directory record". + + * would create the empty package-info.class file in the wrong + directory if no destdir was specified. Note it may still pick the + wrong directory if you specify more than one source directory but + no destDir. It is highly recommended that you always explicitly + specify the destDir attribute. + Bugzilla Report 51947. + + * packagemapper now honors the handleDirSep attribute. + Bugzilla Report 51086. + + * the attributes of macrodef tasks had their values run through + property expansion twice. Still true by default, but can be disabled. + Bugzilla Report 42046. + + * jvc doesn't like it if source file names in argument files are + quoted. + Bugzilla Report 31667. + + * ZipFile didn't work properly for archives using unicode extra + fields rather than UTF-8 filenames and the EFS-Flag. + + * Access to DirectoryScanner's default excludes wasn't synchronized. + Bugzilla Report 52188. + + * When a Project instance was created by a custom tasks its + createTask method didn't work. + Bugzilla Report 50788. + +Other changes: +-------------- + + * -f/-file/-buildfile accepts a directory containing build.xml. + + * The , and now support a new maxmemory + attribute. + Bugzilla Report 50513. + + * the documented inputstring attribute of sshexec has been + implemented and the actually existing attribute inputproperty + documented. + Bugzilla Report 50576. + + * The concat task now permits the name of its exposed resource + by means of its 'resourcename' attribute. + + * The expandproperties filter now accepts a nested propertyset + which, if specified, provides the properties for expansion. + Bugzilla Report 51044. + + * will no longer filter out the very + first line of the stacktrace containing the original exception + message even if it matches one of the filter expressions. + + * Upgraded to Apache AntUnit 1.2 + + * Provide read access to Mkdir.dir. Bugzilla Report 51684. + + * and have a new attribute performGCOnFailedDelete + that may - when set to true - help resolve some problems with + deleting empty directories on NFS shares. + Bugzilla Report 45786. + + * and used to log at level INFO to signal a + property hasn't been set when the resource was empty even if the + quiet attribute was set to true. They will now use VERBOSE + instead. + Bugzilla Report 52107. + + * has a new attribute createMissingPackageInfoClass that can + be set to false to prevent Ant from creating empty dummy classes + used for up-to-date-ness checks. + Bugzilla Report 52096. + + * URLResources#isExists has become less noisy. + Bugzilla Report 51829. + + * The task has a new optional attribute retryDelay that can + be used to make the task sleep between retry attempts. + Bugzilla Report 52076. + + * has new attributes that control the signature and digest + algorithms. + Bugzilla Report 52344. + + * Initial support for Java 8. + + * can optionally create a pseudo terminal (like ssh -t) + Bugzilla Report 52554. + +Changes from Ant 1.8.1 TO Ant 1.8.2 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * Prior to Ant 1.8.0 the task and several other tasks would + overwrite read-only destination files. Starting with 1.8.0 they + would only do so under special circumstances. Ant 1.8.2 now + consistently won't replace a read-only file by default. The same is + true for a number of other tasks. + The , and tasks now have a new force attribute + and has a new forceReadonly attribute that can be used to + make the task overwrite read-only destinations. + Bugzilla Report 49261. + + * Removed ant-nodeps.jar; it is now merged into ant.jar. + + * DOMElementWriter#encode used to employ special code before encoding + ampersands so that { remained { rather than being turned + into &#123;. This is no longer the case, ampersands will now + be encoded unconditionally. + Also DOMElementWriter#encodeData will treat CDATA sections containing a + literal "]]>" sequence different now - it will split the CDATA + section between the second "]" and ">" and create two sections. + This affects task as well as the XML logger or JUnit + formatter where ampersands will now always get encoded. + In addition DOMElementWriter will now replace the characters \t, \r + and \n in attribute values by entity references. + Bugzilla Report 49404. + + * The list elements returned by ProjectHelper#getExtensionStack are + now String arrays of length 3 rather than 2 in order to support the + onMissingExtensionPoint attribute. + Bugzilla Report 49473. + + * When using properties defined + inside the same file will only get used in expansions if the ${} + reference uses the same prefix. This is different from Ant 1.8.1 + but is the same behavior Ant 1.8.0 and earlier exhibited. + A new attribute prefixValues can be used to re-enable the behavior + of Ant 1.8.1. + Bugzilla Report 49373. + + * The files and directories used by Git, Mercurial and Bazaar to + store their information are now excluded by the defaultexcludes. + Bugzilla Report 49624. + + * The task no longer generates TestListener events - which + have been introduced in ant 1.7.0 - by default. The task has a new + attribute enableTestListenerEvents and a new "magic" property + ant.junit.enabletestlistenerevents has been added that can be used + to reinstate the old behavior. + +Fixed bugs: +----------- + + * hostinfo now prefers addresses with a hostname over addresses without + a hostname, provided the addresses have the same scope. + For local lookup, no IP address will be put in NAME / DOMAIN anymore. + For remote lookup, if a host name was provided and only an IP address is + found, the IP address will no longer overwrite the host name provided to the + task. + Bugzilla Report 49513 + + * mmap-based file copy problems under JDK 1.4 on Linux. + Bugzilla Report 49430. + + * The Sun JVM tries to mmap the entire file during a copy. + For large files this is not feasible. + We now explicitly request to copy at most 16 MiB per request. + Bugzilla Report 49326. + + * DemuxInputStream.read() should return unsigned values + Bugzilla Report 49279. + + * The MIME mailer ignored the port parameter when using SSL. + Bugzilla Report 49267. + + * ignored the classpath when using the default TraX processor. + Bugzilla Report 49271. + + * 's totalproperty only worked reliably if the same file + name didn't occur inside more than one directory. + Bugzilla Report 36748. + + * could fail to download files from remote subdirectories under + certain circumstances. + Bugzilla Report 49296. + + * will now produce better diagnostics when it fails to delete + a temporary file. + Bugzilla Report 49419. + + * Ant would often scan directories even though there were known to + only hold excluded files when evaluating filesets. This never + resulted in wrong results but degraded performance of the scan + itself. + Bugzilla Report 49420. + + * failed for long command lines on OS/2. + Bugzilla Report 49425. + + * did not handle encodings well for stdout/stderr. + Bugzilla Report 49418. + + * could issue a warning about multiple versions of Ant on the + CLASSPATH if two CLASSPATH entries differed in case on a + case-insensitive file system. + Bugzilla Report 49041. + + * The resource collection was checking every resource even if + we actually just want the first one, like in the example of use of + resourcelist in the documentation (getting the first available resource + from a mirror list). + + * A race condition could lead to build failures if multiple + tasks were trying to create the same directory. + Bugzilla Report 49572. + + * the toString() method of the Resources class - and thus any + ${toString:} expansion of a reference to a element - + didn't iterate over its nested elements if it hadn't done so prior + to the toString invocation already. + Bugzilla Report 49588. + + * in parallel mode didn't work together with a nested + if maxparallel was <= 0 (the default) or no source + files matched. + Bugzilla Report 49594. + + * didn't work for manifests added via + s that used the prefix or fullpath attributes. + Bugzilla Report 49605. + + * would cause an error unless the prefix + attribute has been specified. + Bugzilla Report 49755. + + * If forked, after finished was still reading the input stream + for a bunch of characters, then stealing them from a following . + Bugzilla Report 49119. + + * Ant could be leaking threads for each forked process (started by + , , or similar tasks) that didn't receive input + from a resource or string explicitly. + Bugzilla Report 49587. + + * Project#setDefault threw an exception when null was passed in as + argument, even though the Javadoc says null is a valid value. + Bugzilla Report 49803. + + * runant.py would swallow the first argument if CLASSPATH wasn't set. + Bugzilla Report 49963. + + * failed to load resources from jar files contained in a + directory that has a "!" in its name. + Bugzilla Report 50007. + + * ant.bat exit strategy improvements and issues + make the exit codes work in environments where 4NT or MKS are installed + Bugzilla Report 41039. + + * would fail if used via its Java API and the File passed + into the setJar method was not "normalized" (i.e. contained ".." + segments). + Bugzilla Report 50081. + + * ignored 's errorOnMissingDir attribute + Bugzilla Report 50124. + + * failed to close files when reading a list of symbolic + links from a properties file. + Bugzilla Report 50136. + + * could allow tasks to start executing even if a task + scheduled to run before them timed out. + Bugzilla Report 49527. + + * If a batch with multiple tests times out Ant logs a message + about a test named Batch-With-Multiple-Tests since 1.8.0 but the + logic that determined the Java package of this pseudo-test has been + wrong. + Bugzilla Report 45227. + + * didn't preserve the original linefeed style when + updating a file. + Bugzilla Report 50049. + + * 's whenEmpty behavior never consulted the non-fileset + resources so the task could fail even though resources have been + provided using non-fileset resource collections. + Bugzilla Issue 50115. + +* ftp chmod could throw a NPE. + Bugzilla report 50217. + +* The project help (-p option in the command line) will now print + the dependencies of the targets in debug mode (-d on the command + line) + +Other changes: +-------------- + + * 's force attribute has been deprecated in favor of a new + overwrite attribute that is consistent with 's attribute + names. + + * You can now specify a list of methods to run in a JUnit test case. + Bugzilla Report 34748. + + * properties in files read because of the -propertyfile command line + option will now get resolved against other properties that are + defined before the project starts executing (those from the same or + earlier -propertfiles or defined via the -D option). + Bugzilla Report 18732. + + * s can now contain wildcards in order to use wildcard + CLASSPATH entries introduced with Java6. + The wildcards are not expanded or even evaluated by Ant and will be + used literally. The resulting path may be unusable as a CLASSPATH + for Java versions prior to Java6 and likely doesn't mean anything + when used in any other way than a CLASSPATH for a forked Java VM. + Bugzilla Report 46842. + + * A new attribute allows targets to deal with nonexistent extension + points, i.e. they can extend an extension-point if it has been + defined or silently work as plain targets if it hasn't. This is + useful for targets that get included/imported in different + scenarios where a given extension-point may or may not exist. + Bugzilla Report 49473. + + * Ant now logs a warning message if it fails to change the file + modification time in for example when using or preserving + timestamps in various tasks. + Bugzilla Report 49485. + + * ProjectHelpers can now be installed dynamically via the + Ant task. + + * is now able to switch to the proper ProjectHelper to parse + the imported resource. This means that several kinds of different build + files can import each other. + + * now also works for non-filesystem resources. + Bugzilla Report 49756. + + * The filter now supports a casesensitive + attribute. + + * The selector now supports casesensitive, multiline + and singleline attributes. + Bugzilla Report 49764. + + * A new can be used like wget's --cut-dirs option to + strip leading directories from file names. + + * now supports the GNU project's gcjh compiler. + Bugzilla Report 50149. + + * supports additional views of a file's path as elements + for a custom pattern. + Bugzilla Report 50114. + + * JUnit XMLResultAggregator logs the stack trace of caught IO exceptions + in verbose runs. + Bugzilla Report 48836. + + * StringUtils.parseHumanSizes() should turn parse failures into + BuildExceptions. + Bugzilla Report 48835. + + * New task to make a list of targets bound to some + specified extension point. + + * Initial support for OpenJDK7 has been added. + + * Ant now uses java.net.CookieStore rather than + java.util.ServiceLocator to detect whether the environment is a + Java 1.6 system. This means releases of gcj/gij at the time of + this release of Ant are detected as Java 1.5 and not 1.6. + Bugzilla Report 50256. + + * It is now possible to write a compiler adapter for that + compiles sources with extensions other than .java (but that still + compile to .class files). + Bugzilla Report 48829. + + * The performance of VectorSet#add(Object) has been improved which + should also benefit any operation that scans directories in Ant. + Bugzilla Report 50200. + +Changes from Ant 1.8.0 TO Ant 1.8.1 +=================================== + +Changes that could break older environments: +------------------------------------------- + + * ant-trax.jar is no longer produced since TrAX is included in JDK 1.4+. + + * Ant no longer ships with Apache Xerces-J or the XML APIs but relies + on the Java runtime to provide a parser and matching API versions. + + * The stylebook ant task and the ant-stylebook.jar are removed. + +Fixed bugs: +----------- + + * Tasks that iterate over task or type definitions, references or + targets now iterate over copies instead of the live maps to avoid + ConcurrentModificationExceptions if another thread changes the + maps. + Bugzilla Report 48310. + + * The filesmatch condition threw a NullPointerException when + comparing text files and the second file contained fewer lines than + the first one. + Bugzilla Report 48715. + + * Regression: The task would allow multiple + META-INF/application.xml files to be added. + Bugzilla Report 6836. + + * VectorSet#remove(Object) would fail if the size of the vector + equaled its capacity. + + * Regression : ant -diagnostics was returning with exit code 1 + Bugzilla Report 48782 + + * Fix for exec task sometimes inserts extraneous newlines + Bugzilla Report 48746 + + * SymlinkTest#testSymbolicLinkUtilsMethods failing on MacOS + Bugzilla Report 48785. + + * If 's first resourcecollection child is a , + any subsequently added child resourcecollection joins the first. + Bugzilla Report 48816. + + * with an invalid URL could trigger an NPE in some JVMs. + Bugzilla Report 48833 + + * Broken Pipe issue under Ubuntu Linux + Bugzilla Report 48789 + + * Properties wrongly read from file or not update during read + Bugzilla Report 48768 + + * AntClassLoader in Ant 1.8.0 has been considerably slower than in + 1.7.1 + Bugzilla Report 48853 + + * ANT_CMD_LINE_ARGS are rippling through lower level Ant usage + Bugzilla Report 48876 + + * email : IO error sending mail with plain mimetype + Bugzilla Report 48932 + + * the complete-ant-cmd.pl script failed to create a proper cache of + target if "ant -p" failed. + Bugzilla Report 48980 + + * 's sourcebase attribute was broken. + Bugzilla Report 48970 + + * 's failonerror didn't work as expected when copying a single + element resource collection to a file. + Bugzilla Report 49070 + + * no longer followed redirects if the redirect URL was relative + and not an absolute URL. + Bugzilla Report 48972 + + * fixed a performance degradation in the code that expands property + references. + Bugzilla Reports 48961 and 49079 + + * was broken on Windows. + Bugzilla Report 49090 + + * delete failed if the link attribute was a relative path + to a link inside the current directory without a leading ".". + Bugzilla Report 49137 + + * and failed to find the expected strings when + waiting for responses and thus always failed. + Bugzilla Report 49173 + +Other changes: +-------------- + + * Project provides new get methods that return copies instead of the + live maps of task and type definitions, references and targets. + + * Ant is now more lenient with ZIP extra fields and will be able to + read archives that it failed to read in earlier versions. + Bugzilla Report 48781. + + * The family of tasks has been sped up for bigger archives. + Bugzilla Report 48755. + + * Add removeKeepExtension option to NetRexxC task. + Bugzilla Report 48788. + + * Add prefix attribute to loadproperties task. + + * Add resource attribute to length task. + + * PropertyResource will effectively proxy another Resource if ${name} + evaluates to a Resource object. + + * Added forcestring attribute to equals condition to force evaluation + of Object args as strings; previously only API-level usage of the + equals condition allowed Object args, but Ant 1.8.x+ property + evaluation may yield values of any type. + + * BuildFileTest.assertPropertyUnset() fails with a slightly more + meaningful error message + Bugzilla Report 48834 + + * will now throw an exception if a test name is empty. This + used to manifest itself in unrelated errors like + Bugzilla Report 43586. + + * A change that made more reliable on Windows (Bugzilla Report + 5003) strongly impacts the performance for commands that execute + quickly, like attrib. Basically no single execution of a command + could take less than a second on Windows. + A few timeouts have been tweaked to allow these commands to finish + more quickly but still they will take longer than they did with Ant + 1.7.1. + Bugzilla Report 48734. + + * Added SimpleBigProjectLogger, intermediate between NoBannerLogger and + BigProjectLogger. + + * supports new attributes enablemultiplemappings + and cache. + + * Added the augment task to manipulate existing references via Ant's basic + introspection mechanisms. + +Changes from Ant 1.8.0RC1 TO Ant 1.8.0 +====================================== + +Changes that could break older environments: +------------------------------------------- + + * the appendtolines filter has been renamed to suffixlines. + +Fixed bugs: +----------- + + * stack traces were not reported at all by + when filtertrace="on", which is the default. + + * ant.bat can now also process the -noclasspath switch when it is + the first switch on a command line. + Bugzilla Report 48186. + + * now tries to delete the created temporary files earlier. + Bugzilla Report 48506. + + * the implementation of had been changed in a way that broke + the jarjar links task and protentially other third-party subclasses + as well. + Bugzilla Report 48541. + + * task didn't report build file location when a remote operation failed + Bugzilla Report 48578. + + * would add the same comment and a date line each time + it updated an existing property file. + Bugzilla Report 48558. + + * didn't work properly in recent Java VMs. + Bugzilla Report 48637. + +Other changes: +-------------- + +Changes from Ant 1.7.1 TO Ant 1.8.0RC1 +====================================== + +Changes that could break older environments: +------------------------------------------- + + * if and unless attributes (on as well as various tasks and other + elements) have long permitted ${property} interpolation. Now, if the result + evaluates to "true" or "false" (or "yes", "no", "on", "off"), that boolean + value will be used; otherwise the traditional behavior of treating the value + as a property name (defined ~ true, undefined ~ false) is used. Existing + scripts could be broken if they perversely defined a property named "false" + and expected if="false" to be true, or used if="true" expecting this to be + triggered only if a property named "true" were defined. + + * Ant now requires Java 1.4 or later. + + * Improved handling of InterruptException (lets suppose someone/thing + is trying to kill the thread when we receive an + InterruptException), when an InterruptException is received, we do + not wait anymore in a while loop till the end time has been + reached. + Bugzilla Report 42924. + + * Refactor PropertyHelper and introspection APIs to make extension + more granular and support setting task/type attribute values to + objects decoded by custom PropertyEvaluator delegates. Also add + task for registering delegates and/or replacing + the registered PropertyHelper instance. + Bugzilla Report 42736. + + * Added a restricted form of typedef called . This + allows definition of elements that can only be within tasks or + types. This method is now used to define conditions, selectors, + comparators and filterreaders. This means that tasks may now have + nested conditions just by implementing the Condition interface, + rather than extending ConditionBase. It also means that the use of + namespaces for some of the selectors introduced in Ant 1.7.0 is no + longer necessary. Implementing this means that the DynamicElement + work-around introduced in Ant 1.7.0 has been removed. + Bugzilla Report 40511. + + * In the task when a is used, the millis and + datetime attributes now override the time of the source resource if + provisioned. + Bugzilla Report 43235. + + * Remove fall-back mechanism for references that are not resolved + during normal runtime execution. + + * FileUtils.createTempFile now actually creates the file. + The TempFile task still does not create the file by default, can be + instructed to do so however using a new parameter. + Bugzilla Report 33969. + + * A lock in Project ensured that a BuildListener's messageLogged + method was only ever executed by a single thread at a time, while + all other methods could be invoked by multiple threads + simultaniously (while within , for example). This lock + is no longer in place, messageLogged should be made thread-safe + now. + + * 's onError="stop" no longer fails the build if an error + occurs, this is the main difference between stop and error and + matches what the documentation implied. + Bugzilla Report 24668. + + * Ant's configuration introspection mechanisms have been modified to prefer + Resource and FileProvider attributes to plain java.io.File attributes; + however the configuration-from-String behavior remains equivalent, rendering + a FileResource. + + * CBZip2InputStream will now throw an IOException if + passed in a null or empty InputStream to read from. + Bugzilla Reports 32200. + + * will now fail when trying to extract certain broken + archives that would have been silently ignored in earlier version. + Bugzilla Report 35000. + + * Ant's family of tasks tries to preserve the existing Unix + permissions when updating archives or copying entries from one + archive to another. + Since not all archiving tools support storing Unix permissions in + the same way that is used by Ant, sometimes the permissions read by + Ant seem to be 0, which means nobody is allowed to do anything to + the file or directory. + If Ant now encounters a permission set of 0 it will assume that + this is not the intended value and instead apply its own default + values. Ant used to create entries with 0 permissions itself. + The family of tasks has a new attribute preserve0permissions + that can be set to restore the old behavior. + Bugzilla Report 42122. + + * If a batch containing multiple JUnit tests running inside a forked + Java VM caused the VM to crash (or caused a timeout), the + formatters would receive an error message for the last test in the + batch. + Ant will now pass in a test with the name "Batch-With-Multiple-Tests" + instead - this is supposed to show more clearly that the last test + may not have started at all. + Bugzilla Report 45227. + + * If the number of minutes a build takes is bigger then 1000 Ant will + no longer print a thousands separator in the "elapsed time" + message. It used to be the thousands separator of the current + locale. + Bugzilla Report 44659. + + * used to fail if the link was broken (i.e. + pointing to a file or directory that no longer existed). It will now + silently try to remove the link. + Bugzilla Report 41285. + + * used to log a warning and not delete broken + symbolic links. didn't even log a warning. + The task will now try to delete them in both cases. + Bugzilla Report 41285. + + * if the dir attribute of a points to a symbolic link and + followsymlinks is set to false, the fileset will no longer be + scanned and always seem empty. + Bugzilla Report 45741. + + * the .NET tasks that have been deprecated since Ant 1.7.0 have been + removed, please use the stand-alone Antlib you can find at + http://ant.apache.org/antlibs/dotnet/index.html + instead. + + * the logic of closing streams connected to forked processes (read + the input and output of and friends) has been changed to + deal with cases where child processes of the forked processes live + longer than their parents and keep Ant from exiting. + It is unlikely but possible that the changed logic breaks stream + handling on certain Java VMs. + Bugzilla issue 5003. + + * 's totalproperty was platform dependent because it relied + on java.io.File#compareTo. It has now been made platform + independent, which means that totalPropery values obtained on + Windows (and other systems where the sort order of File is not case + sensitive) can be different from the values obtained with earlier + versions of Ant. + Bugzilla Report 36748. + + * globmapper didn't work properly if the "to" or "from" patterns + didn't contain a "*". In particular it implicitly added a * to the + end of the pattern(s). This is no longer the case. If you relied + on this behavior you will now need to explicitly specify the + trailing "*". + Bugzilla Report 46506. + + * silently ignored missing resources even with + failOnError="true". If your build tries to copy non-existent + resources and you relied on this behavior you must now explicitly + set failOnError to false. + Bugzilla Report 47362. + + * Ant now prefers the java.runtime.version system property over + java.vm.version for the Created-By Manifest attribute. + Bugzilla Report 47632. + + * The task now supports a nested mapper. In order to + implement this, the Java API of the task had to change so any + custom subclass overriding the processFile method will need to + adapt (by overriding the new two-arg processFile method). + Bugzilla Report 23243. + + * A new property syntax can be used to set attributes from + references: ${ant.ref:some-reference} + + In most cases this will yield the exact same result as + ${toString:some-reference} - only when an attribute setter method + accepts an object type other than string and the project's + reference is an Object of matching type the new syntax will pass in + that object. + + If your build file already contains properties whose name starts + with "ant.ref:" there is a potential for collision. If your + property has been set, normal property expansion will take + precedence over the new syntax. If the property has not been set + and a reference with the postfix of your property name exists + (i.e. in a very unlikely event) then the new syntax would yield a + different result (an expanded property) than Ant 1.7.1 did. + + * A ProjectHelper implementation can now provide the default build file + name it is expecting, and can specify if they can support a specific build + file. So Ant is now capable of supporting several ProjectHelper + implementations, deciding on which to use depending of the input build file. + + * Mapper-aware selectors (depends, different, present) now accept typedef'd + FileNameMappers. + +Fixed bugs: +----------- + + * The default logger was failing to print complete stack traces for + exceptions other than BuildException when inside or + , thus omitting often important diagnostic + information. + Bugzilla 43398 (continued). + + * Better handling of package-info.class. + Bugzilla Report 43114. + + * RPM task needed an inserted space between the define and the value. + Bugzilla Report 46659. + + * Got rid of deadlock between in, out and err in the Redirector. + Bugzilla Report 44544. + + * Caused by AssertionError no longer filtered. + Bugzilla Report 45631. + + * would sometimes recreate JARs unnecessarily. + Bugzilla Report 45902. + + * task couldn't overwrite existing symlinks that pointed to + nonexistent files + Bugzilla Report 38199. + + * task couldn't overwrite files that were in the way of the symlink. + Bugzilla Report 43426. + + * task failonerror="false" does not stop build from failing + when 'ln' command returns non-zero. + Bugzilla Report 43624 + + * task couldn't differentiate between "no resources + specified" and "no resources matched." + Bugzilla Report 43799. + + * ManifestClassPath failed when a relative path would traverse the + file system root. + Bugzilla Report 44499. + + * had an indexoutofbounds when the prefix and postfix + overlapped. + Bugzilla Report 44731. + + * and failed to accept file names with # + characters in them. + Bugzilla Report 45190 + + * A deadlock could occur if a BuildListener tried to access an Ant property + within messageLogged while a different thread also accessed one. + Bugzilla Report 45194 + + * Handle null result of system getProperty() in CommandlineJava. + Similar to Bugzilla Report 42334. + + * Length task did not process nonexistent Resources even though these might + conceivably still carry file length information. + Bugzilla Report 45271. + + * 's includeJavaRuntime="false" should work for gcj now. Note + that you may need to set includeAntRuntime to false in order to + have full control. + Bugzilla Report 34638. + + * would fail if the executed statement didn't return a result + set with some JDBC driver that dissalow Statement.getResultSet to + be called in such a situation. + Bugzilla Report 36265 + + * if the executed statement in returned a result set and an + update count, the count would be lost. + + * if an executed statement in mixes update count and result set + parts, some result sets wouldn't get printed. + Bugzilla Report 32168. + + * XmlLogger could lose messages if is used. + Bugzilla Report 25734. + + * creates remoteToDir if it doesn't exist. + Bugzilla Report 42781 + + * CBZip2OutputStream threw an exception if it was closed prior to + writing anything. + Bugzilla Reports 32200, 45836 + + * The IPlanetDeploymentTool didn't use the configured DTD locations. + Bugzilla Report 31876. + + * The ant shell script printed a warning under Cygwin if JAVA_HOME + was not set. + Bugzilla Report 45245. + + * sometimes incorrectly flagged infinite recursions of + filter tokens + Bugzilla Report 44226. + + * failures were treated as errors in forked JUnit tests when JUnit 4 + was used. + Bugzilla Report 43892. + + * and disallowed manifest attributes whose name + contained the character '8'. + Bugzilla Report 45675. + + * BigProjectLogger would set the project's basedir to the current + working directory. + Bugzilla Report 45607. + + * only s that logged to a file were notified if forked VM + crashed or a timeout occurred in . + Bugzilla Report 37312. + + * ant -v -version would print the version information twice. + Bugzilla Report 45695. + + * when nested into builds that have been invoked by tasks + might set the wrong basedir on the called projects. + Bugzilla Report 30569. + + * If the message of the failed assertion of a forked JUnit test + contained line feeds some excess output ended up in Ant's log. + Bugzilla Report 45411. + + * failed to delete a link that pointed to + a parent directory. + Bugzilla Report 45743. + + * failed if ant lacked permission to rename + the link's target. + Bugzilla Report 41525. + + * when checking whether a jar is signed, ignored the + sigfile attribute. + Bugzilla Report 44805. + + * When using JavaMail all tasks used the same mail host + regardless of their configuration. + Bugzilla Report 37970. + + * and didn't handle aliases with characters other + than numbers, letters, hyphen or underscore properly. + Bugzilla Report 45820. + + * could miss multi-character begin tokens in some cases. + Bugzilla Report 45094. + + * didn't close JARs that were part of the classpath. + Bugzilla Report 45955. + + * in some cases would delete class files even if it didn't + find the corresponding source files. + Bugzilla Report 45916. + + * failed if the nested or contained line + breaks. + Bugzilla Report 43342. + + * encoding="auto" has been broken in since Ant 1.7.0 and only + worked if JavaMail was available. + Bugzilla Report 42389. + + * MailLogger could cause a NullPointerException. + Bugzilla Report 44009. + + * didn't recognize failed assertions as failures if they + caused subclasses of AssertionError to be thrown (like + org.junit.ComparisonFailure that is thrown when assertEquals + fails). + Bugzilla Report 45028. + + * the Unix "ant" wrapper script failed to protect wildcards in + command line arguments in some cases. + Bugzilla Report 31601. + + * crippled file names and could miss some entries if + multiple modules have been specified. + Bugzilla Report 35301. + + * Tasks with a "public void add(SomeType)" method failed to work as + TaskContainers at the same time. + Bugzilla Report 41647. + + * Tasks that implementes DynamicElemen or DynamicElementNS failed to + work as TaskContainers at the same time. + Bugzilla Report 41647. + + * combining SSL and authentication in and MailLogger failed in + some setups. + Bugzilla Report 46063. + + * if an error occurs while logging the buildFinished event, the + original error is now logged to System.err. + Bugzilla Report 25086. + + * failed with a NullPointerException when copying a resource + without a name. It will now fail with a meaningful error message. + Bugzilla Report 39960. + + * now uses the configured classpath to load the factory (when + using TraX) before falling back to Ant's own classpath. + Bugzilla Report 46172. + + * complained about files being modified in the future if + they had been just very recently (within Ant's assumed granularity + of the file system). + Bugzilla Report 43665. + + * didn't store the output in outputproperty if the remote + command failed. + Bugzilla Report 46340. + + * DirectoryScanner's slow-scanning algorithm that is used when you + ask for excluded or not-included files and/or directories could + miss some files and directories in the presence of recursive + exclude patterns. + + * resource collection kept only one of entries deemed equal by + the chosen Comparator. + Bugzilla Report 46527. + + * the ZipFile class used by and others could leave the + archive open (making it undeletable on Windows as long as the java + VM was running) for files with an unexpected internal structure. + Bugzilla Report 46559. + + * The zip package now supports the extra fields invented by InfoZIP + in order to store Unicode file names and comments. + + * The zip package detects the encoding bit set by more modern + archivers when they write UTF-8 filenames and optionally sets it + when writing zips or jars. + Bugzilla Report 45548 + + * could run into a NullPointerException when faced with broken + symbolic links. + Bugzilla Report 46747. + + * The ant shell script should now support MSYS/MinGW as well. + Bugzilla Report 46936. + + * has a new force attribute that allows re-signing of jars + that are already signed. + Bugzilla Report 46891. + + * now again honors failonerror in the face of connection + errors. + Bugzilla Report 46829. + + * The filter threw an exception if the stream to + filter ended with a begin token. + Bugzilla Report 47306. + + * , and didn't support + the setbeans attribute. + Bugzilla Report 47336. + + * ' encoding attribute didn't work. + Bugzilla Report 47382. + + * Ant created tar archives could contain random bytes at the end + which confused some untar implementations. + Bugzilla Report 47421. + + * various places where unchecked PrintWriters could hide exceptions + have been revisited to now check the error status or not use a + PrintWriter at all. + Bugzilla Report 43537. + + * filesetmanifest="mergewithoutmain" in didn't treat inline + manifests as expected. + Bugzilla Report 29731. + + * didn't work properly with nested builds. + Bugzilla Report 41368. + + * with filesetmanifest different from skip didn't work if the + update attribute has been set to true. + Bugzilla Report 30751. + + * The default stylesheets for failed to properly escape + XML content in exception stack traces. + Bugzilla Report 39492. + + * AntClassLoader didn't set the proper CodeSource for loaded classes. + Bugzilla Report 20174. + + * AntClassLoader.getResourceAsStream would return streams to + resources it didn't return with getResource and to classes it + failed to load. + Bugzilla Report 44103. + + * Logging exceptions without a message would cause a + NullPointerException. + Bugzilla Report 47623. + + * WeblogicDeploymentTool could fail on platforms with a file + separator other than "/". + Bugzilla Report 35649. + + * The update attribute of the modified selector was ignored. + Bugzilla Report 32597. + + * and can now merge Class-Path attributes from + multiple sources and optionally flatten them into a single + attribute. + The default behaviour still is to keep multiple Class-Path + attributes if they have been specified and to only include the + attributes of the last merged manifest. + Bugzilla Report 39655. + + * didn't work correctly with a selector because + it was scanning the same filesets more than once. + Bugzilla Report 43574. + + * when using custom filterreaders with the + syntax Ant could leak memory. + The problem didn't occur when using or to + define the filterreader which is the recommended approach. + Bugzilla Report 45439. + + * Ant didn't set the proper "magic" value for tar entries containing + long file names in GNU longfile mode. + Bugzilla Report 47653. + + * The tar task failed to recognize that the archive had to be + (re-)created in some cases where the sources are filesystem based + resources but not filesets. + Bugzilla Report 48035. + + * 's outputproperty was prefixed by the executed command + when the command attribute has been used, breaking backwards + compatibility to Ant 1.7.0. + Bugzilla Report 48040. + + * different task instances of the same ed tasks could + overwrite each others attributes/nested elements. + Bugzilla Report 41602. + + * The Hashvalue algortihm implementation of the modified task could + fail to read the file(s) completely. + Bugzilla Report 48313. + +Other changes: +-------------- + + * The get task now also follows redirects from http to https + Bugzilla Report 47433 + + * A HostInfo task was added performing information on hosts, including info on + the host ant is running on. + Bugzilla Reports 45861 and 31164. + + * There is now a FileProvider interface for resources that act as a source + of filenames. This should be used by tasks that require resources + to provide filenames, rather than require that all resources + are instances or subclasses of FileResource. + Bugzilla Report 43348 + + * There is now a URLProvider interface for resources that act as a + source of URLs. This should be used by tasks that require resources + to provide URLs, rather than require that all resources are + instances or subclasses of URLResource. + + * Fixcrlf now gives better error messages on bad directory attributes. + Bugzilla Report 43936 + + * a new property ant.project.default-target holds the value of the + current 's default attribute. + + * a new property ant.project.invoked-targets holds a comma separated + list of the targets that have been specified on the command line + (the IDE, an task ...) when invoking the current project. + + * The resource selector has had an "any" type added for better + configurability. + + * Ant should detect the OS as both a Mac and a Unix system when + running on OpenJDK. + Bugzilla Report 44889. + + * new protected getConnection and getStatement methods allow + subclasses of SQLExec more control - or access to the cached + instances when overriding other methods like runStatements. + Bugzilla Report 27178. + + * has a new failOnConnectionError attribute that can be used to + keep a build going even if the task failed to connect to the + database. + Bugzilla Report 36712. + + * A new attribute strictDelimiterMatching can be used to ignore case + or whitespace differences when searches for delimiters. + This is useful if you execute a SQL script that has contains "GO" + and "go" as delimiters. + Bugzilla Report 26459. + + * A new showWarnings attribute of allows warnings to be logged. + Bugzilla Report 41836. + + * A new treatWarningsAsErrors attribute of can be used to fail + a build if a warning occurs. + Bugzilla Report 41836. + + * Ant now supports scoped properties (see Local task). + Bugzilla Report 23942. + + * 's CSV output can be controlled via the new attributes + csvColumnSeparator and csvQuoteCharacter. + Bugzilla Report 35627. + + * 's logging has been improved. + Bugzilla Reports 30932, 31743. + + * It is now possible to disable 's remote verification. + Bugzilla Report 35471. + + * now supports input in a way similar to + Bugzilla Report 39197. + + * can now preserve the file modification time when downloading + files. + Bugzilla Report 33939. + + * the new task sshsession can run multiple tasks in the presence of + an SSH session providing (local and remote) tunnels. + Bugzilla Report 43083. + + * ZipOutputStream has been sped up for certain usage scenarios that + are not used by Ant's family of zip tasks. + Bugzilla Report 45396. + + * supports an "output" Resource attribute as an alternative to "file". + + * "output" attribute now supports any Resource in addition to a file. + + * no longer requires a passphrase when using key based + authentication. + Bugzilla Report 33718. + + * a new failOnEmptyArchive attribute on and can now + make the task fail the build if it tries to extract an empty + archive. + + * and have a new attribute stripAbsolutePathSpec. + When set to true, Ant will remove any leading path separator from + the archived entry's name before extracting it (making the name a + relative file name). + Bugzilla Report 28911. + + * will now detect that it was asked to extract a file that is + not an archive earlier if the file is big. + Bugzilla Report 45463. + + * New file and resource selectors and have + been added that select file which the current process can read or + write. + Bugzilla Report 45081. + + * The filename file selector has a new attribute regex that allows + files to be selected by matching their names against a regular + expression. + Bugzilla Report 45284 + + * The name resource selector has a new attribute regex that allows + resources to be selected by matching their names against a regular + expression. + Bugzilla Report 45284 + + * Enhanced performance of Project.fireMessageLoggedEvent and DirectoryScanner + Bugzilla Reports 45651 and 45665 + + * The package list location for offline links can now be specified as + an URL. + Bugzilla Report 28881 + + * now supports XML namespaces. + Bugzilla Report 36804. + + * A new listener for has been added that tries to invoke the + tearDown method of a TestCase if that TestCase was run in a forked + VM and the VM crashed or a timeout occurred. See the task's + manual page for details. + Bugzilla Report 37241. + + * The Jar task now supports the addition of a jar index file in update mode. + Previously the absence of the index was not enough to trigger the rebuild; + some other update was necessary. + Bugzilla report 45098. + + * has a new attribute "useNativeBasedir" that makes the child + build use the same basedir it would have used if invoked from the + command line. No matter what other attributes/properties have been + set. + Bugzilla Report 45711. + + * has a new optional failOnError attribute. + Bugzilla Report 44772. + + * Antlib descriptors will now be parsed by the configured + ProjectHelper if the implementation overrides the new + canParseAntlibDescriptor and parseAntlibDescriptor methods. If the + configured helper doesn't override the methods, a new instance of + ProjectHelper2 will be used just like in Ant 1.7.1. + Bugzilla Report 42208. + + * It is now possible to explicitly set the executable used by + . + Bugzilla Report 39189. + + * 's order of results is now predictable. + Bugzilla Report 44873 + + * a new has been added, which works similar to + but only returns the results of the first nested + mapper that matches. + Bugzilla Report 44873 + + * has a new maxtime attribute that terminates downloads that + are taking too long. + Bugzilla Report 45181. + + * now supports selectors for remote directories as well. + Bugzilla Report 44726. + + * In some cases Ant fails to rename files if the source or target + file has just recently been closed on Windows. It will now try to + delete the offending file once again after giving the Java VM time + to really close the file. + Bugzilla Report 45960. + + * two new properties can be used to set the MIME-Type and charset + used by MailLogger. + Bugzilla Report 27211. + + * a new attribute of allows the task to succeed if it can + reach at least one given recipient. + Bugzilla Report 36446. + + * two new properties allow MailLogger to send a fixed text instead of + the log file. + Bugzilla Report 38029. + + * is supposed to support CVSNT now. + Bugzilla Report 31409. + + * ' port attribute should now work for all clients that use the + environment variable CVS_PSERVER_PORT instead of the "official" + CVS_CLIENT_PORT. + Bugzilla Report 30124. + + * now works for local repositories as well. + + * has an option to ignore removed files now. + Bugzilla Report 26257. + + * and friends now support modules with spaces in their names + via nested elements. + + * A new attribute "ignoreEmpty" controls how deals when + there are no resources to concatenate. If it is set to false, the + destination file will be created regardless, which reinstates the + behavior of Ant 1.7.0. + Bugzilla Report 46010. + + * If the new remote attribute is set to true, can now + work against a remote repository without any working copy. + Bugzilla Report 27419. + + * start and end tags can now be used instead of dates in + . + Bugzilla Report 27419. + + * MailLogger and can now optionally enable support for + STARTTLS. + Bugzilla Report 46063. + + * has new attributes "as" and "prefixSeparator" that can be + used to control the prefix prepended to the imported targets' + names. + + * a new task provides an alternative to that + should be preferred when you don't want to override any targets. + + * delete has a new attribute removeNotFollowedSymlink. If set to + true, symbolic links not followed (because followSymlinks was false + or the number of symlinks was too big) will be removed. + Bugzilla Report 36658. + + * the os and osfamily attributes of , , and + can now be used to run the commands on operating systems + other than their "native" environment, i.e. non-Unix or non-Windows + operating systems respectively. + Bugzilla Report 7624. + + * a new resource collection generalizes the prefix + and fullpath attributes of to arbitrary mappers that + can be applied to arbitrary resource collections. + Bugzilla Report 4240. + + * and have a new attribute + errorOnMissingArchive that allows "optional" filesets that don't + break the build if the archive doesn't exist. + Bugzilla Report 46091. + + * has new attributes that correspond to the + -docfilessubdirs and -excludedocfilessubdir command line arguments. + Bugzilla Report 34455. + + * now fails early if a specified stylesheet doesn't exist. + Bugzilla Report 34525. + + * now has an option to suppress transformer warnings. This + option only has an effect for processors that support this feature; + the "trax" processor included with Ant does support it. + Bugzilla Report 18897. + + * has two new attributes failOnError and + failOnTransformationError that can be used to not make the build + process proceed if an error occurs. + Bugzilla Report 36260. + + * has a new attribute failOnNoResources that can be used to + make the build fail/continue if the collection of resources to + transform is empty. + Bugzilla Report 46274. + + * It is now possible to define system properties that should be set + during xslt's transformation. This can be used to enable XInclude + processing in Xerces, for example. + Bugzilla Report 36653. + + * a new resource collection can be used to specify + collections of ZIP and TAR archives as sources. It extracts them on + the fly. This is a generalization of the found + as nested element of and friends. + Bugzilla Report 46257. + + * has a new verbose attribute that makes the task list + all deleted targets and give a hint as to why it deleted them. + Bugzilla Report 13681. + + * now supports arbitrary filesystem based resource + collections. + Bugzilla Report 46341. + + * now supports arbitrary filesystem based resource + collections. + Bugzilla Report 24062. + + * token and value of 's nested can now also + be specified as nested elements to allow multiline content more + easily. + Bugzilla Report 39568. + + * and can now optionally preserve the file + timestamp even if the file is modified. + Bugzilla Report 39002. + + * The child-elements and have + a new attribute that controls whether properties in nested text get + expanded. + Bugzilla Report 11585. + + * has a new attribute failOnNoReplacements that makes the + build fail if the task didn't do anything. + Bugzilla Report 21064. + + * 's has a new attribute that controls + whether empty directories should be kept. + Bugzilla Report 43159. + + * ant -diagnostics now checks that it can read as much from the + temporary directory as it has written. This may help detecting a + full filesystem. + Bugzilla Report 32676. + + * has a new preserveduplicates attribute--historically + these were eliminated in the interest of behaving in the manner + of a "path." + + * 's source and target attributes are no longer ignored when + using gcj. + Bugzilla Issue 46617. + + * ant -diagnostics now outputs information about the default XSLT + processor. + Bugzilla Issue 46612. + + * the ZIP library will now ignore ZIP extra fields that don't specify + a size. + Bugzilla Report 42940. + + * CBZip2OutputStream now has a finish method separate from close. + Bugzilla Report 42713. + + * the and family of tasks has new options to deal with + file name and comment encoding. Please see the zip tasks' + documentation for details. + + * now uses previously + undocumented SecureInputHandler shipped with Ant 1.7.1. + + * Command line arguments for and similar tasks can now have + optional prefix and suffix attributes. + Bugzilla Report 47365 + + * 's srcfile and targetfile child elements can now have + optional prefix and suffix attributes. + Bugzilla Report 45625 + + * has a new attribute to enable indexing of META-INF + directories which is disabled for backwards compatibility reasons. + Bugzilla Report 47457 + + * 's executable attribute can be used to specify a different + executable. + Bugzilla Report 46230. + + * 's new executable attribute can be used to specify a + different executable. + Bugzilla Report 42132. + + * , , and now provide a nested + element to specify a classpath that will be used when loading the + task's (compiler) adapter class. + Bugzilla Report 11143. + + * , , and now provide a nested + element to specify the task's (compiler) adapter as an instance of + a class that has been defined via typedef/componentdef. This + allows more control over the classpath and allows adapters to be + defined in Antlibs easily. + + * A new subclass org.apache.tools.ant.loader.AntClassLoader5 of + AntClassLoader has been added which overrides getResources + which became non-final in ClassLoader with Java5+ so + this method now behaves as expected. + The new subclass will be used by Ant internally if it is available + and Ant is running on Java5 or more recent. + Bugzilla Report 46752. + + * a new attributes can chose a different request method than GET for + the http condition. + Bugzilla Report 30244 + + * now supports a configurable display text and a regular + expression based way to determine progress based on logged messages. + Bugzilla Report 39957. + + * the number of retries on error in is now configurable. + can be told to not download files that already exist locally. + Bugzilla Report 40058. + + * Ant now builds against commons-net 2.0 as well. + Bugzilla Report 47669. + + * A new nested element connectionProperty of allows setting of + arbitrary JDBC connection properties. + Bugzilla Report 33452. + + * A new islastmodified condition can check the last modified date of + resources. + + * has a new destDir attribute that allows generated files to + be written to a different location than the original classes. + Bugzilla Report 20699. + + * has a new listfiles attribute similar to the existing one of + . + Bugzilla Report 24359. + + * It is now possible to suppress the "FAILED" lines sent to Ant's + logging system via 's new logFailedTests attribute. + Bugzilla Report 35073. + + * now can delete entries. + + * The resource collection can now optionally cache its + contents. + + * A new condition can check whether resources exists. + + * has two new attributes errorproperty and warningproperty that + can be set if an error/warning occurs. + Bugzilla Report 38807. + + * has a new attribute rowcountproperty that can be used to set + a property to the number of rows affected by a task execution. + Bugzilla Report 40923. + + * when Ant copies files without filtering, it will now use NIO + channels. + Bugzilla Report 30094. + + * has a new attribute that can be used to disable caching on + HTTP connections at the HttpUrlConnection level. + Bugzilla Report 41891. + + * and (and tasks derived from ) will now create the + parent directory of the destination archive if it doesn't exist. + Bugzilla Report 45377. + + * A new filterreader that sorts input lines has been + added. + Bugzilla Report 40504. + + * A new token filter that suppresses tokens that match + their ancestor token has been added. + + * s nested into s can now use a dir + attribute different from the . + Bugzilla Report 37763. + + * can now optionally cache its contents. + + * can now specify values as nested text. + Bugzilla Report 32917. + + * a new parentFirst attribute on allows resources to + be loaded from the specified classpath rather than the system + classloader. + Bugzilla Report 41369. + + * can now + calculate relative paths. + + * The selector supports a new handleDirSep attribute that + makes it ignore differences between / and \ separators. + Bugzilla Report 47858. + + * now supports resource collections (as long as the resources + contained provide URLs) and can get multiple resources in a single + task. + + * can now import non-File resources if they provide an URL + - as the and resources do. + Bugzilla Report 29251 + + * can now import multiple resources specified as resource + collections. + Bugzilla Report 22269. + + * a new type is similar to but can read the + list of resources from non-file resources and may return resources + that are not files. + + * a new filterreader appendtolines complements prefixlines. + + * a new top level element extension-point allows build files to be + extended with custom targets more easily. + +Changes from Ant 1.7.0 TO Ant 1.7.1 +============================================= + +Changes that could break older environments: +------------------------------------------- + +* String resources only have properties single expanded. If you relied on + resources being expanded more than once, it no longer happens. + Bugzilla report 42277. + +* A String resource's encoding attribute was only taken into account when + set from the resource's OutputStream; the InputStream provided the String's + binary content according to the platform's default encoding. Behavior has + been modified to encode outgoing (InputStream) content as well as encoding + incoming (OutputStream) content. + +* with fork now returns gives -1 instead of 0 as result when failonerror + is false and some exception (including timeout) occurs. Br 42377. + +* ant-type attribute has been marked as deprecated and a warning has been + issued if it is encountered in the build file. + +Fixed bugs: +----------- + +* The default logger was failing to print complete stack traces for exceptions + other than BuildException, thus omitting often important diagnostic + information. Bugzilla 43398. + +* Error in FTP task + Bugzilla report 41724 + +* Regression: Locator fails with URI encoding problem when spaces in path + Bugzilla report 42222 + +* Regression in Locator: running Ant off a network share does not work: + message "URI has authority component" appears + Bugzilla report 42275 + +* Improvements in AntClassLoader Speed. + Bugzilla report 42259 + +* Error in handling of some permissions, most notably the AllPermission on + jdk 1.5 + Bugzilla report 41776 + +* Replace task summary output incorrect. + Bugzilla report 41544 + +* Dependset crashes ant when timestamp on files change during Dependset + execution. + Bugzilla report 41284 + +* Bug in org.apache.tools.ant.types.resources.comparators.Date + Bugzilla report 41411 + +* in Ant 1.7.0 could throw NPE if no was defined. + Bugzilla report 41422. + +* In Ant 1.7.0, in does not by default include only + **/*.java as the documentation claims and earlier revisions did. + Bugzilla report 41264. + +* SPI support in jar was broken. + Bugzilla report 41201. + +* jsch-0.1.30 causes SCP task to hang + Bugzilla report 41090. + +* Target from imported file listed twice in projecthelp. + Bugzilla report 41226. + +* task double-expands properties if expandproperties is true, + and expands properties if expandproperties is false. + Bugzilla report 41204. + +* Rolling back Bugzilla 32927 (set a default description for a javadoc tag + if not set) as it caused a BC problem. + Bugzilla report 41268. + +* forks properly and so memory settings are picked up. + Bug report 41280. + +* Regression: NPE was thrown when using against a + (third-party instantiated) fileset with null Project reference. + +* Strip out all -J arguments to non forking rmic adapters, specifically + the Sun and Weblogic compilers. + Bug report 41349 + +* Synchonization issues in PropertyHelper. Bugzilla 41353. + +* did not append. Bugzilla 41399. + +* -autoproxy turns Java1.5+ automatic proxy support on. Bugzilla 41904 + +* Handle null result of system getProperty(). Bugzilla 42334. + +* Regression: concat fixlastline="true" should not have applied to + nested text, but did in Ant 1.7.0. Bugzilla 42369. + +* Regression: ant.version was not passed down in , . + This worked in Ant 1.6.5, but not in 1.7.0. + ant.core.lib (added in 1.7.0) was also not being propagated. + Bugzilla bug 42263 + +* Regression: bzip2 task created corrupted output files for some inputs. + Bugzilla bug 41596. + +* Regression: with did not work. + Bugzilla 42735. + +* ant script, cd may output to stdout. + Bugzilla 42739. + +* Modified selector doesn't update the cache if only one file has changed. + Bugzilla 42802. + +* Regression: Path subclasses that overrode list() stopped working in + resourceCollection contexts in Ant 1.7.0. Bugzilla 42967. + +* supports loading from xml based property definition. + Bugzilla 42946 + +* supports collecting and rerunning failed test cases + (textXXX methods). Bugzilla 42984. + +* War task failed with "No WEB-INF/web.xml file was added" when called + a second time. Bugzilla 43121. + +* FilterMapper could throw an NPE. + Bugzilla 43292. + +* Regession nested macrodefs with elements could cause StackOverFlow. + Bugzilla 43324. + +* Some changes to broke third party tasks that extend it (like + Apache Cactus' Ant task). The changes have been modified so that + subclases should now work again - without any changes to the + subclass. + +Other changes: +-------------- + +* Various small optimizations speed up common tasks such as on large + filesets, reducing both I/O and CPU usage. + +* Profiling logger has been added with basic profiling capabilities. + +* + + + +

CheckStyle Audit

+

Designed for use with + CheckStyle and + Ant. +

+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +

+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
filelineseveritymessage
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + body { + font:normal 80% arial,helvetica,sanserif; + color: black; + background-color: white; + margin: 0; + padding: 1em; + min-width: 41em; + } + h1 { + font-weight:bold; + font-size:140%; + margin: 0 0 0.7em; + padding: 0.3em; + text-align: center; + background-color: #eee; + border: 2px ridge silver; + } + html>body h1 { + border-color: gray; + } + + ul#navigation { + font-size: 0.83em; + float: left; width: 18em; + margin: 0 0 1.2em; padding: 0; + border: 1px dashed silver; + } + ul#navigation li { + list-style: none; + margin: 0; padding: 0.2em; + } + ul#navigation a { + display: block; + padding: 0.2em; + font-weight: bold; + } + ul#navigation a:link { + color: black; background-color: #eee; + } + ul#navigation a:visited { + color: #666; background-color: #eee; + } + ul#navigation a:hover { + color: red; background-color: white; + } + ul#navigation a:active { + color: white; background-color: gray; + } + + div#content { + margin: 0 1em 1em 16em; + padding: 0 1em; + } + * html div#content { + height: 1em; /* Workaround 3-Pixel-Bug of Internet Explorers */ + } + div#content h2 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + div#content p { + font-size: 1em; + margin: 1em 0; + } + table { + width:100%; + border-collapse:collapse; + } + table td, table th { + border:1px solid #000; + padding:3px 7px 2px 7px; + } + table th { + font-weight:bold; + background: #ccc; + color: black; + } + table tr:nth-child(odd) td { + background: #efefef; + } + table tr:nth-child(even) td { + background: #fff; + } + + + + + + + /* + * Hides all "hideable" div-containers + */ + function hideAll() { + allElements = document.getElementsByTagName("div"); + for (i = 0; i < allElements.length; i++) { + if (allElements[i].className=="hideable") { + allElements[i].style.display="none"; + } + } + return; + } + + /* + * Shows one div-container and hides the other. + * @param id id of the element to show + */ + function change(id) { + hideAll(); + e = document.getElementById(id); + if (e.style.display=="none") { + e.style.display=""; + } + window.scrollTo(0, 0); + return; + } + + /* + * Shows only the first data row. + * Used in body:onload so the user could directly see some messages. + */ + function openFirst() { + hideAll(); + for (i = 0; i < allElements.length; i++) { + if (allElements[i].className=="hideable") { + allElements[i].style.display=""; + return; + } + } + return; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-frames.xsl new file mode 100644 index 00000000..c79c0b7b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-frames.xsl @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CheckStyle Audit + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + + + + + + +

CheckStyle Audit

Designed for use with + CheckStyle and + Ant.
+
+
+ + + + + + + + + + + + +
+ + + + + +
+ + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .oddrow td { + background: #efefef; + } + .evenrow td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + + + + + + + + + +

Files

+

+ + + + + +
+

+ + +
+ + +

Files

+ + + + + + + + +
NameErrors
+
+ + + + + + + + files/.html + + + + + + + + + + + + + + files/.html + + + + + + + + + + + + + + + + + ../ + + + + + + ../ + + + + + + + + + stylesheet.css + + + + +

File

+ + + + + + + + + + + + +
Error DescriptionLine:Column
:
+ + +
+
+ + +

Summary

+ + + + + + + + + + + + + + + +
Total FilesFiles With ErrorsErrors
+
+ + + + oddrow + evenrow + + +
\ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-text.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-text.xsl new file mode 100644 index 00000000..7359e416 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-text.xsl @@ -0,0 +1,34 @@ + + + + + + + + + + + : + + : + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-xdoc.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-xdoc.xsl new file mode 100644 index 00000000..5fc6eab3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/checkstyle/checkstyle-xdoc.xsl @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + Checkstyle Audit + + + + + + + + + + + + +
+ + + + + + + + +
NameErrors
+
+
+ + + + + + + + files.html + + + + + + + + + + + + + Checkstyle Audit + + + +
+ + + + + + + + + + + + +
Error DescriptionLine
+
+ +
+
+
+ + +
+ + + + + + + + + + + + + + + +
FilesFiles With ErrorsErrors
+
+
+ + + + oddrow + evenrow + + +
+ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/common2master.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/common2master.xsl new file mode 100644 index 00000000..da1527e9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/common2master.xsl @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + +]]> + + + + + <target name="" description=""> + <iterate target=""/> + </target> + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/coverage-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/coverage-frames.xsl new file mode 100644 index 00000000..9603597e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/coverage-frames.xsl @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Coverage Results. + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + + + + + + + + + +

Classes

+ + + + + + + / + .html + + + + + +
+ +
+ + +
+ + + + + + + + +

Home

+

Packages

+ + + + + + + +
+ + + +
+ + +
+ + + + + + + + + +

Summary

+ + + + + + + + + + + + + +
Reported ClassesMethods HitLines Hit
+ + + + +
+ To ensure accurate test runs on Java applications, developers need to know how much of + the code has been tested, and where to find any untested code. Coverage helps you + locate untested code, and measure precisely how much code has been exercised. + The result is a higher quality application in a shorter period of time. +

+

+ +

Packages

+ + + + + + + + + + + + +
+ + + +
+ + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+
+ +

Classes

+ + + + + + + +
+ +
+ + +
+ + + + + + + + + + + + +

Package

+ + + +
+ + +

Classes

+ + + + + +
+
+ + + +
+ + + + + + + + + + + + +

Class .

+ + + + + +
+ + +

Methods

+ + + + + +
+ + + + +
+ + + + + + + + + + + + +
+ + http://jakarta.apache.org + +

Source Code Coverage

Designed for use with Sitraka JProbe and Ant.
+
+
+ + + + + + + + + Name + Methods Hit + Lines Hit + + + + + + Name + Lines Hit + + + + + + + + + + + + + + + Name + Methods Hit + Lines Hit + + + + + + + + + + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + a + b + + + +
+ + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/jdepend-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/jdepend-frames.xsl new file mode 100644 index 00000000..80287345 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/jdepend-frames.xsl @@ -0,0 +1,485 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JDepend Analysis + + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + + + + + + + + + + +

Summary

+ + [summary] + [packages] + [cycles] + [explanations] +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageTotal ClassesAbstract ClassesConcrete ClassesAfferent CouplingsEfferent CouplingsAbstractnessInstabilityDistance
+ + overview-packages.html#PK + + + +
+ +
+ + +
+ + + + + + + + +

Packages

+ + [summary] + [packages] + [cycles] + [explanations] +
+ + + +

PK +

+ + + + + + + +
Afferent Couplings: Efferent Couplings: Abstractness: Instability: Distance:
+ + + + + + + + + + + + + + +
Abstract ClassesConcrete ClassesUsed by PackagesUses Packages
+ + None + + +
+
+
+ + None + + +
+
+
+ + None + + + + overview-packages.html#PK + +
+
+
+ + None + + + + overview-packages.html#PK + +
+
+
+
+
+ +
+ [summary] + [packages] + [cycles] + [explanations] +
+ + +
+ + + + + + + + +

Cycles

+ + [summary] + [packages] + [cycles] + [explanations] +
+ + + +

There are no cyclic dependancies.

+
+ +

#CY

+ +
+

+
+ +
+ [summary] + [packages] + [cycles] + [explanations] +
+ + +
+ + + + + + + + + +

Explanations

+ + [summary] + [packages] + [cycles] + [explanations] +
+ +

The following explanations are for quick reference and are lifted directly from the original JDepend documentation.

+ +

Number of Classes

+

The number of concrete and abstract classes (and interfaces) in the package is an indicator of the extensibility of the package.

+

Afferent Couplings

+

The number of other packages that depend upon classes within the package is an indicator of the package's responsibility.

+

Efferent Couplings

+

The number of other packages that the classes in the package depend upon is an indicator of the package's independence.

+

Abstractness

+

The ratio of the number of abstract classes (and interfaces) in the analyzed package to the total number of classes in the analyzed package.

+

The range for this metric is 0 to 1, with A=0 indicating a completely concrete package and A=1 indicating a completely abstract package.

+

Instability

+

The ratio of efferent coupling (Ce) to total coupling (Ce / (Ce + Ca)). This metric is an indicator of the package's resilience to change.

+

The range for this metric is 0 to 1, with I=0 indicating a completely stable package and I=1 indicating a completely instable package.

+

Distance

+

The perpendicular distance of a package from the idealized line A + I = 1. This metric is an indicator of the package's balance between abstractness and stability.

+

A package squarely on the main sequence is optimally balanced with respect to its abstractness and stability. Ideal packages are either completely abstract and stable (x=0, y=1) or completely concrete and instable (x=1, y=0).

+

The range for this metric is 0 to 1, with D=0 indicating a package that is coincident with the main sequence and D=1 indicating a package that is as far from the main sequence as possible.

+ + + +
+ + + + + + + + + +
+ [summary] + [packages] + [cycles] + [explanations] +
+

Packages

+ + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + Not Analyzed: + + + + + + + + + + + +
+ [summary] + [packages] + [cycles] + [explanations] +
+

Cycles

+ + + + +
+ + +
+ + + + + + + + + + + +

JDepend Analysis

+ + + + + +
Designed for use with JDepend and Ant.
+
+
+ +
diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/jdepend.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/jdepend.xsl new file mode 100644 index 00000000..f8132975 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/jdepend.xsl @@ -0,0 +1,276 @@ + + + + + + + + + + + JDepend Analysis + + + + + + + + +

JDepend Analysis

+

Designed for use with JDepend and Ant.

+
+ +
+

Summary

+
+ [summary] + [packages] + [cycles] + [explanations] +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageTotal ClassesAbstract ClassesConcrete ClassesAfferent CouplingsEfferent CouplingsAbstractnessInstabilityDistance
+ + #PK + + + +
+ +
+ +
+

Packages

+
+ [summary] + [packages] + [cycles] + [explanations] +
+ + + +

PK +

+ + + + + + + +
Afferent Couplings: Efferent Couplings: Abstractness: Instability: Distance:
+ + + + + + + + + + + + + + +
Abstract ClassesConcrete ClassesUsed by PackagesUses Packages
+ + None + + +
+
+
+ + None + + +
+
+
+ + None + + + + #PK + +
+
+
+ + None + + + + #PK + +
+
+
+
+
+ +
+

Cycles

+
+ [summary] + [packages] + [cycles] + [explanations] +
+ + +

There are no cyclic dependancies.

+
+ +

+ +
+

+
+ +
+

Explanations

+
+ [summary] + [packages] + [cycles] + [explanations] +
+ +

The following explanations are for quick reference and are lifted directly from the original JDepend documentation.

+ +

Number of Classes

+

The number of concrete and abstract classes (and interfaces) in the package is an indicator of the extensibility of the package.

+

Afferent Couplings

+

The number of other packages that depend upon classes within the package is an indicator of the package's responsibility.

+

Efferent Couplings

+

The number of other packages that the classes in the package depend upon is an indicator of the package's independence.

+

Abstractness

+

The ratio of the number of abstract classes (and interfaces) in the analyzed package to the total number of classes in the analyzed package.

+

The range for this metric is 0 to 1, with A=0 indicating a completely concrete package and A=1 indicating a completely abstract package.

+

Instability

+

The ratio of efferent coupling (Ce) to total coupling (Ce / (Ce + Ca)). This metric is an indicator of the package's resilience to change.

+

The range for this metric is 0 to 1, with I=0 indicating a completely stable package and I=1 indicating a completely instable package.

+

Distance

+

The perpendicular distance of a package from the idealized line A + I = 1. This metric is an indicator of the package's balance between abstractness and stability.

+

A package squarely on the main sequence is optimally balanced with respect to its abstractness and stability. Ideal packages are either completely abstract and stable (x=0, y=1) or completely concrete and instable (x=1, y=0).

+

The range for this metric is 0 to 1, with D=0 indicating a package that is coincident with the main sequence and D=1 indicating a package that is as far from the main sequence as possible.

+ + + +
+ +
diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames-xalan1.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames-xalan1.xsl new file mode 100644 index 00000000..fbc28e13 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames-xalan1.xsl @@ -0,0 +1,745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + Standard Output from <xsl:value-of select="@name"/> + + +
+ + +
+
+ + + + + Standard Error from <xsl:value-of select="@name"/> + + +
+ + +
+
+
+
+ + + + + Unit Test Results. + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} + + + + + + + . + + + Unit Test Results: <xsl:value-of select="$class.name"/> + + + + + + + + +

Class

+ + + + + +
+ +

Tests

+ + + + + + + + + +
+ + + + + + + + + +
+ + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
+

+ + <none> +

+
+ +

Classes

+ + + + + + + +
+ +
+ + +
+ + + + + + + All Unit Test Classes + + + + + +

Classes

+ + + + +
+ + +
+ + + + + + + + + / + .html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

Home

+

Packages

+ + + + +
+ + +
+ + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

Summary

+ + + + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + + +
TestsFailuresErrorsSkippedSuccess rateTime
+ + + + + + + +
+ + + + +
+ Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
+ +

Packages

+ + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + +
+ + <none> + + + + +
+ + +
+ + + + + + + + + + + + open('package-frame.html','classListFrame') + +

Package

+ + + + + +

Classes

+

+ + + + + +
+

+
+ + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

Unit Test Results

+ + + + + +
Designed for use with JUnit and Ant.
+
+
+ + + + + Name + Tests + Errors + Failures + Skipped + Time(s) + Time Stamp + Host + + + + + + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + Failure + + + + Error + + + + Skipped + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

+ + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + +
diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames.xsl new file mode 100644 index 00000000..afea6e01 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/junit-frames.xsl @@ -0,0 +1,972 @@ + + + + + + + + +Unit Test Results. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + Standard Output from <xsl:value-of select="@name"/> + + +
+ + +
+
+ + + + + Standard Error from <xsl:value-of select="@name"/> + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + <xsl:value-of select="$TITLE"/> + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} + + + + + + + + + + All Failures + + + All Errors + + + All Skipped + + + All Tests + + + + + Unit Test Results: <xsl:value-of select="$title"/> + + + + + + open('allclasses-frame.html','classListFrame') + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + + + + + + . + + + Unit Test Results: <xsl:value-of select="$class.name"/> + + + + + + + + +

Class

+ + + + + +
+ + + +

Failures

+
+ +

Errors

+
+ +

Skipped

+
+ +

Tests

+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
+

+ + <none> +

+
+ +

Classes

+ + + + + + + +
+ +
+ + +
+ + + + + + + All Unit Test Classes + + + + + +

Classes

+ + + + +
+ + +
+ + + + + + + + + / + _.html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

Home

+

Packages

+ + + + +
+ + +
+ + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

Summary

+ + + + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + + +
TestsFailuresErrorsSkippedSuccess rateTime
+ + + + + + + +
+ + + + +
+ Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
+ +

Packages

+ + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + +
+ + <none> + + + + +
+ + +
+ + + + + + + + + + + + open('package-frame.html','classListFrame') + +

Package

+ + + + + +

Classes

+

+ + + + + +
+

+
+ + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

+ + + + + +
Designed for use with JUnit and Ant.
+
+
+ + + + + Name + Tests + Errors + Failures + Skipped + Time(s) + Time Stamp + Host + + + + + + + + + Class + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + + + + + + + + + + + + + + + + + Failure + + + + Error + + + + Skipped + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

+ + + + + + + +
+ + + + + + + + + + + + + + + 32 + + + + + + + + + + + + +
+ + + +
+ + +
+ + + +
+ + + +
+
+ + + + + + + + + + +
diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/junit-noframes.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/junit-noframes.xsl new file mode 100644 index 00000000..bd7002a9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/junit-noframes.xsl @@ -0,0 +1,513 @@ + + + + + + +Unit Test Results. + + + + + + <xsl:value-of select="$TITLE"/> + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + + +
+ + + + + + + + +

Packages

+ Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers. + + + + + + + + + + + + + + + + + + Failure + Error + + + + + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + +

Package

+ + + + + + +
+ Back to top +

+

+ + + + + + + + +

TestCase

+ + + + + + + + + + +
+ +

+ + Back to top + + + + +

Summary

+ + + + + + + + + + + + + + + + + + + Failure + Error + + + + + + + + + + +
TestsFailuresErrorsSkippedSuccess rateTime
+ + + + + + + +
+ + + + +
+ Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
+
+ + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + +

+ + + + + +
Designed for use with JUnit and Ant.
+
+
+ + + + Name + Tests + Errors + Failures + Skipped + Time(s) + + + + + + + Name + Tests + Errors + Failures + Skipped + Time(s) + Time Stamp + Host + + + + + + + Name + Status + Type + Time(s) + + + + + + + + + + + Failure + Error + + + + + + + + + + + + + + + + + + + + + + + + Error + + + + + + Failure + + + + Error + + + + Skipped + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + + +

+ + + +
+ + +
+ + + + + + + + + + + + + + + 32 + + + + + + + + + + + + +
+ + + +
+ + +
+ + + +
+ + + +
+
+ + + + + + + + + + + +
diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/log.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/log.xsl new file mode 100644 index 00000000..5040993b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/log.xsl @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + +
+ + http://jakarta.apache.org + + + Apache Ant +
+ + + +

+ + + + + +
+ + + + + + failed + complete + + + + + + + + + + + + + +
Build FailedBuild CompleteTotal Time:
+ +
+ See the stacktrace. +
+
+ + + + + +
ant.file
ant.version
java.version
os.name
+ +

Build events

+ + + + + + + +
targettaskmessage
+

+ + + +

Error details

+ + +
+
+
+ +

+
+ + + + + + + a + b + + + [ ] + + + + + + +
diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/manifest b/framework/src/ant/apache-ant-1.9.6/src/etc/manifest new file mode 100644 index 00000000..758bc0f0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/manifest @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Main-Class: org.apache.tools.ant.Main + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/maudit-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/maudit-frames.xsl new file mode 100644 index 00000000..c81f8dc3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/maudit-frames.xsl @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audit Results. + + + + + + + + + <H2>Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </P> + + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + + + + + + + + + + + + + + +

Class .

+ + + + +
+ +

Violations

+ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + +
+

+
+ +

Classes

+ + + + +
+ + +
+ + + + + +
+ + + + + + + + + + + + + + +

Classes

+ + + + +
+ + +
+ + + + + + + + + + / + .html + + + + + + + + + + + + + + + + + +

Home

+

Packages

+ + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +

Summary

+ + + + + + + + + + + +
Audited classesReported classesViolations
+ + + + +
+ Note: Rules checked have originated from style guidelines suggested by the language designers, + experience from the Java development community and insite experience. Violations are generally + reported with a reference to the Java Language Specifications (JLS x.x.x) + and Metamata Audit rules (x.x). + Please consult these documents for additional information about violations. +

+ Rules checked also enforce adherence to Sun Java coding guidelines in use at Jakarta. +

+ One should note that these violations do not necessary underline errors but should be used + as an indication for possible errors. As always, use your best judgment and review + them carefully, it might save you hours of debugging. +

+ +

Packages

+ + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + open('package-frame.html','classListFrame') + +

Package

+ + + + +

Classes

+ + + + + +
+
+ + + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + + + + + + + + + +
+ + http://jakarta.apache.org + +

Source Code Audit

Designed for use with Webgain QA/Metamata Audit and Ant.
+
+
+ + + + + + + + + + Name + Violations + + + + + + + Line + Message + + + + + + + + + + + + + + + + + + + + + + + + + a + b + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/mmetrics-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/mmetrics-frames.xsl new file mode 100644 index 00000000..2b0f6b81 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/mmetrics-frames.xsl @@ -0,0 +1,1023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + Metrics Results. + + + + + + + + + <H2>Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </P> + + + + + + + + + + + +

Metrics Reference

+V(G) | +LOC | +DIT | +NOA | +NRM | +NLM | +WMC | +RFC | +DAC | +FANOUT | +CBO | +LCOM | +NOC + + +

Cyclomatic Complexity - V(G)

+This metric was introduced in the 1970s to measure the amount of control +flow complexity or branching complexity in a module such as a +subroutine. It gives the number of paths that may be taken through the +code, and was initially developed to give some measure of the cost of +producing a test case for the module by executing each path. +

+Methods with a high cyclomatic complexity tend to be more difficult to +understand and maintain. In general the more complex the methods of an +application, the more difficult it will be to test it, and this will adversely +affect its reliability. +

+V(G) is a measure of the control flow complexity of a method or +constructor. It counts the number of branches in the body of the method, +defined as: +

    +
  • while statements;
  • +
  • if statements;
  • +
  • for statements.
  • +
+ +The metric can also be configured to count each case of a switch +statement as well. + +
+

Lines of Code - LOC

+ +This is perhaps the simplest of all the metrics to define and compute. +Counting lines has a long history as a software metric dating from before +the rise of structured programming, and it is still in widespread use today. +The size of a method affects the ease with which it can be understood, its +reusability and its maintainability. There are a variety of ways that the size +can be calculated. These include counting all the lines of code, the number +of statements, the blank lines of code, the lines of commentary, and the +lines consisting only of syntax such as block delimiters. +

+This metric can also be used for sizing other constructs as well, for +example, the overall size of a Java class or package can be measured by +counting the number of source lines it consists of. +

+LOC can be used to determine the size of a compilation unit (source file), +class or interface, method, constructor, or field. It can be configured to +ignore: +

    +
  • blank lines;
  • +
  • lines consisting only of comments;
  • +
  • lines consisting only of opening and closing braces.
  • +
+ +
+

Depth of Inheritance Hierarchy - DIT

+ +This metric calculates how far down the inheritance hierarchy a class is +declared. In Java all classes have java.lang.Object as their ultimate +superclass, which is defined to have a depth of 1. So a class that +immediately extends java.lang.Object has a metric value of 2; any of its +subclasses will have a value of 3, and so on. +

+A class that is deep within the tree inherits more methods and state +variables, thereby increasing its complexity and making it difficult to +predict its behavior. It can be harder to understand a system with many +inheritance layers. +

+DIT is defined for classes and interfaces: +

    +
  • all interface types have a depth of 1;
  • +
  • the class java.lang.Object has a depth of 1;
  • +
  • all other classes have a depth of 1 + the depth of their super class.
  • +
+ +
+

Number of Attributes - NOA

+ +The number of distinct state variables in a class serves as one measure of +its complexity. The more state a class represents the more difficult it is to +maintain invariants for it. It also hinders comprehensibility and reuse. +

+In Java, state can be exposed to subclasses through protected fields, which +entails that the subclass also be aware of and maintain any invariants. This +interference with the class's data encapsulation can be a source of defects +and hidden dependencies between the state variables. +

+NOA is defined for classes and interfaces. It counts the number of fields +declared in the class or interface. + + +

Number of Remote Methods - NRM

+ +NRM is defined for classes. A remote method call is defined as an +invocation of a method that is not declared in any of: +
    +
  • the class itself;
  • +
  • a class or interface that the class extends or implements;
  • +
  • a class or method that extends the class.
  • +
+ +The value is the count of all the remote method calls in all of the methods +and constructors of the class. + +
+

Number of Local Methods - NLM

+ +NLM is defined for classes and interfaces. A local method is defined as a +method that is declared in the class or interface. NLM can be configured to +include the local methods of all of the class's superclasses. Methods with +public, protected, package and private visibility can be independently +counted by setting configuration parameters. + +
+

Weighted Methods per Class - WMC

+ +If the number of methods in a class can be determined during the design +and modeling phase of a project, it can be used as a predictor of how +much time and effort is needed to develop, debug and maintain it. This +metric can be further refined by incorporating a weighting for the +complexity of each method. The usual weighting is given by the cyclomatic +complexity of the method. +

+The subclasses of a class inherit all of its public and protected methods, +and possibly its package methods as well, so the number of methods a +class has directly impacts the complexity of its subclasses. Classes with +large numbers of methods are often specific to a particular application, +reducing the ability to reuse them. +

+The definition of WMC is based upon NLM, and it provides the same +configuration parameters for counting inherited methods and of varying +visibility. The main difference is that NLM always counts each method as 1, +whereas WMC will weight each method. There are two weighting schemes: +

    +
  • V(G) the cyclomatic complexity of the method is used as its weight. + Methods from class files are given a V(G) of 1.
  • +
  • the arity, or the number of parameters of the method are used to + determine the weight.
  • +
+ +
+

Response For Class - RFC

+ +The response set of a class is the set of all methods that can be invoked as +a result of a message sent to an object of the class. This includes methods +in the class's inheritance hierarchy and methods that can be invoked on +other objects. The Response For Class metric is defined to be size of the +response set for the class. A class which provides a larger response set is +considered to be more complex than one with a smaller response set. +

+One reason for this is that if a method call on a class can result in a large +number of different method calls on the target and other classes, then it +can be harder to test the behavior of the class and debug problems. It will +typically require a deeper understanding of the potential interactions that +objects of the class can have with the rest of the system. +

+RFC is defined as the sum of NLM and NRM for the class. The local methods +include all of the public, protected, package and private methods, but not +methods declared only in a superclass. + + +

Data Abstraction Coupling - DAC

+ +DAC is defined for classes and interfaces. It counts the number of reference +types that are used in the field declarations of the class or interface. The +component types of arrays are also counted. Any field with a type that is +either a supertype or a subtype of the class is not counted. + + +

Fan Out - FANOUT

+ +FANOUT is defined for classes and interfaces, constructors and methods. It +counts the number of reference types that are used in: +
    +
  • field declarations;
  • +
  • formal parameters and return types;
  • +
  • throws declarations;
  • +
  • local variables.
  • +
+ +The component types of arrays are also counted. Any type that is either a +supertype or a subtype of the class is not counted. + +
+

Coupling Between Objects - CBO

+ +When one object or class uses another object or class they are said to be +coupled. One major source of coupling is that between a superclass and a +subclass. A coupling is also introduced when a method or field in another +class is accessed, or when an object of another class is passed into or out +of a method invocation. Coupling Between Objects is a measure of the +non-inheritance coupling between two objects. +

+A high value of coupling reduces the modularity of the class and makes +reuse more difficult. The more independent a class is the more likely it is +that it will be possible to reuse it in another part of the system. When a +class is coupled to another class it becomes sensitive to changes in that +class, thereby making maintenance for difficult. In addition, a class that is +overly dependent on other classes can be difficult to understand and test in +isolation. +

+CBO is defined for classes and interfaces, constructors and methods. It +counts the number of reference types that are used in: +

    +
  • field declarations
  • +
  • formal parameters and return types
  • +
  • throws declarations
  • +
  • local variables
  • +
+ +It also counts: +
    +
  • types from which field and method selections are made
  • +
+ +The component types of arrays are also counted. Any type that is either a +supertype or a subtype of the class is not counted. + +
+

Lack of Cohesion Of Methods - LCOM

+ +The cohesion of a class is the degree to which its methods are related to +each other. It is determined by examining the pattern of state variable +accesses within the set of methods. If all the methods access the same state +variables then they have high cohesion; if they access disjoint sets of +variables then the cohesion is low. An extreme example of low cohesion +would be if none of the methods accessed any of the state variables. + +If a class exhibits low method cohesion it indicates that the design of the +class has probably been partitioned incorrectly, and could benefit by being +split into more classes with individually higher cohesion. On the other +hand, a high value of cohesion (a low lack of cohesion) implies that the +class is well designed. A cohesive class will tend to provide a high degree +of encapsulation, whereas a lack of cohesion decreases encapsulation and +increases complexity. +

+Another form of cohesion that is useful for Java programs is cohesion +between nested and enclosing classes. A nested class that has very low +cohesion with its enclosing class would probably better designed as a peer +class rather than a nested class. +

+LCOM is defined for classes. Operationally, LCOM takes each pair of +methods in the class and determines the set of fields they each access. If +they have disjoint sets of field accesses increase the count P by one. If they +share at least one field access then increase Q by one. After considering +each pair of methods, +LCOM = (P > Q) ? (P - Q) : 0 +

+Indirect access to fields via local methods can be considered by setting a +metric configuration parameter. + + +

Number Of Classes - NOC

+ +The overall size of the system can be estimated by calculating the number +of classes it contains. A large system with more classes is more complex +than a smaller one because the number of potential interactions between +objects is higher. This reduces the comprehensibility of the system which +in turn makes it harder to test, debug and maintain. +

+If the number of classes in the system can be projected during the initial +design phase of the project it can serve as a base for estimating the total +effort and cost of developing, debugging and maintaining the system. +

+The NOC metric can also usefully be applied at the package and class level +as well as the total system. +

+NOCL is defined for class and interfaces. It counts the number of classes or +interfaces that are declared. This is usually 1, but nested class declarations +will increase this number. + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + .Error { + font-weight:bold; color:red; + } + + + + + + + + + + + + + + + + +

Class .

+ + + +
+ +

Methods

+ + + +
+ + + + +
+ + + + + + + + + + + + + + + +
+

+
+ +

Classes

+ + + + + + + + +
+ +
+ + +
+ + + + + + + + + + + +

Classes

+ + + + + +
+ + +
+ + + + + + +
+ + + / + + .html + + + + + + + + + + + + + + + + +

Home

+

Packages

+ + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +

Summary

+ + + + + + + + + + + + + + + + + +
V(G)LOCDITNOANRMNLMWMCRFCDACFANOUTCBOLCOMNOCL
+ + + + +
+ Note: Metrics evaluate the quality of software by analyzing the program source and quantifying + various kind of complexity. Complexity is a common source of problems and defects in software. + High complexity makes it more difficult to develop, understand, maintain, extend, test and debug + a program. +

+ The primary use of metrics is to focus your attention on those parts of code that potentially are + complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial + actions. + For additional information about metrics and their meaning, please consult + Metamata Metrics manual. +

+ +

Packages

+ + + + + + +
+ + + + +
+ + + + + + + + + + + +

Package

+ + + + +
+ + + + + +
+ Note: Metrics evaluate the quality of software by analyzing the program source and quantifying + various kind of complexity. Complexity is a common source of problems and defects in software. + High complexity makes it more difficult to develop, understand, maintain, extend, test and debug + a program. +

+ The primary use of metrics is to focus your attention on those parts of code that potentially are + complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial + actions. + For additional information about metrics and their meaning, please consult + Metamata Metrics manual. +

+ + + +

Classes

+ + + + + + +
+
+ + + + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + + + + + + + + + + +
+ + http://jakarta.apache.org + +

Source Code Metrics

Designed for use with Webgain QA/Metamata Metrics and Ant.
+
+
+ + + + + + + + + Name + V(G) + LOC + DIT + NOA + NRM + NLM + WMC + RFC + DAC + FANOUT + CBO + LCOM + NOCL + + + + + + + Name + V(G) + LOC + FANOUT + CBO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + + + + +
+ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/performance/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/performance/build.xml new file mode 100644 index 00000000..c3e3ed9e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/performance/build.xml @@ -0,0 +1,124 @@ + + + + + This build file is designed to report the performance + of ant from various releases. + to use: + * install ant-contrib.jar to ($ANT_HOME|$HOME/.ant)/lib + * install beanshell jar and bsf jar + * use unix (with bash) or install cygwin + * set the env variables {whichever needs testing} + ANT_HOME + ANT_HOME_6_5 (the directory containing ant 1.6.5) + ANT_HOME_6_4 + ANT_HOME_5_4 + + * run ant + For example: + export ANT_HOME="c:/cygwin/home/me/svn/trunk/dist" + export ANT_HOME_5_4="l:/apps/apache-ant-1.5.4" + ant.bat + + TODO: more build files. + + + + + + + + + + + + + + + + + export ANT_HOME=${@{env-ant}} + echo $ANT_HOME + echo -n "-- props.xml --: " + $ANT_HOME/bin/ant -f build/gen/props.xml | grep time + echo -n "-- ant-call.xml --: " + $ANT_HOME/bin/ant -f build/gen/ant-call.xml | grep time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/performance/dirscanner.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/performance/dirscanner.xml new file mode 100644 index 00000000..5628a46c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/performance/dirscanner.xml @@ -0,0 +1,316 @@ + + + + + Contains tests that measure the relative performance of Ant's + directory scanner. This is mainly used to compare performance + changes between Ant releases. + + Before you run any tests, you need to set up the environment by + running the setup or big-setup target. Note that this will create + a directory tree holding 10000 (setup) or 100000 (big-setup) + directories and about 22000 (setup) or 222000 (big-setup) files. + + The setup/big-setup targets require Ant 1.7.0 or later. It may be + a good idea to use the -logfile option. + + Consider taking a nap if you run Ant 1.6.x or 1.7.0 against a + "big" setup. + + If Ant 1.6.x is detected or the property ant16 has been specified + on the command line then the tests will use the pathconvert task + instead of resourcecount. So if you want to compare Ant 1.6.x + with later versions of you must specify ant16 on the command line + during your 1.[78].x tests. + + The tests will use the default settings of followsymlinks="true" + and casesensitive="true" unless those values get overwritten by + the properties symlinks and/or casesensitive on the command line. + + + + + + + + + + + + This is ${ant.version} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/README.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/README.txt new file mode 100644 index 00000000..086d8fa8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/README.txt @@ -0,0 +1,53 @@ +Building Ant with Maven +----------------------- + +The Ant jars can be built using Maven and the POMS present in this directory. + +Libs not available in the maven repository + +groupId artifactId version comment +com.bea weblogic 8.1.3.0 download it +com.bea weblogicclasses 5.1 a newer version can do. +jai jai-core 1.1.2_01 fetch.xml +jai jai-codec 1.1.2.1 fetch.xml +com.ibm.netrexx netrexx 2.0.5 fetch.xml +com.starteam starteam-sdk 5.2 the original file is called starteam-sdk.jar +stylebook stylebook 1.0-b2 the original file is called stylebook-1.0-b2.jar + +to install a jar file into your local Maven cache, do this + +mvn install:install-file -DgroupId=foo.org -DartifactId=xx -Dversion=x.y -Dpackaging=jar -Dfile=/a/b/foo.jar + +HOW TO BUILD : + +from this directory, type + +mvn install (or mvn package) + +If you do not have all the dependencies, you can remove the modules that you will not be able to build +from the pom.xml in this directory. + +You also might want to disable the tests. + +mvn install -Dmaven.test.skip=true + + + +TODO : + + * see if the dependency to weblogicclasses.jar can be replaced by a dependency to some j2ee.jar from Sun, +as it supplies some javax.ejb classes which are required at compile time. + + +PROBLEMS : + + * the unit tests cannot run properly, the maven-surefire-plugin sets a system property basedir +which make a large part of our tests fail + + * JIRA issue http://jira.codehaus.org/browse/MSUREFIRE-177 asking the Maven colleagues to fix this. :-) + +REFERENCES : + +about skipping tests : +http://maven.apache.org/plugins/maven-surefire-plugin/examples/skipping-test.html + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-antlr/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-antlr/pom.xml new file mode 100644 index 00000000..f3aa7b33 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-antlr/pom.xml @@ -0,0 +1,75 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-antlr + 1.9.6 + Apache Ant + ANTLR + antlr specific task. + The implementation forks a java process, therefore the antlr jar file is only needed at runtime + + + org.apache.ant + ant + 1.9.6 + true + compile + + + + antlr + antlr + 2.7.2 + true + runtime + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/ANTLR* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bcel/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bcel/pom.xml new file mode 100644 index 00000000..44c6c890 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bcel/pom.xml @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-bcel + 1.9.6 + Apache Ant + BCEL + + + org.apache.ant + ant + 1.9.6 + compile + + + bcel + bcel + 5.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/util/depend/bcel/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bsf/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bsf/pom.xml new file mode 100644 index 00000000..d5180290 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-bsf/pom.xml @@ -0,0 +1,74 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-bsf + 1.9.6 + Apache Ant + BSF + + + org.apache.ant + ant + 1.9.6 + compile + + + bsf + bsf + 2.4.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/Script* + org/apache/tools/ant/taskdefs/optional/script/** + org/apache/tools/ant/types/optional/*Script* + org/apache/tools/ant/util/Script* + org/apache/tools/ant/util/optional/Script* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-log4j/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-log4j/pom.xml new file mode 100644 index 00000000..5caad403 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-log4j/pom.xml @@ -0,0 +1,69 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-log4j + 1.9.6 + Apache Ant + Log4J + + + org.apache.ant + ant + 1.9.6 + compile + + + log4j + log4j + 1.2.13 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/listener/Log4jListener* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-oro/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-oro/pom.xml new file mode 100644 index 00000000..b722bab3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-oro/pom.xml @@ -0,0 +1,74 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-oro + 1.9.6 + Apache Ant + Apache Oro + + + org.apache.ant + ant + 1.9.6 + compile + + + oro + oro + 2.0.8 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/util/regexp/JakartaOro* + + + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/util/regexp/Regexp* + + + + + ../../../../src/main + ../../../../src/tests/junit + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-regexp/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-regexp/pom.xml new file mode 100644 index 00000000..6c306210 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-regexp/pom.xml @@ -0,0 +1,70 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-regexp + 1.9.6 + Apache Ant + Apache Regexp + + + org.apache.ant + ant + 1.9.6 + compile + + + regexp + regexp + 1.3 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/util/regexp/JakartaRegexp* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-resolver/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-resolver/pom.xml new file mode 100644 index 00000000..bd3dfa35 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-resolver/pom.xml @@ -0,0 +1,69 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-resolver + 1.9.6 + Apache Ant + Apache Resolver + + + org.apache.ant + ant + 1.9.6 + compile + + + xml-resolver + xml-resolver + 1.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/types/resolver/** + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-xalan2/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-xalan2/pom.xml new file mode 100644 index 00000000..73f8442f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-apache-xalan2/pom.xml @@ -0,0 +1,94 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-apache-xalan2 + 1.9.6 + Apache Ant + Xalan 2 + contains Xalan2-specific features + + + org.apache.ant + ant + 1.9.6 + compile + + + xalan + xalan + 2.7.1 + compile + + + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-logging/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-logging/pom.xml new file mode 100644 index 00000000..2415823b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-logging/pom.xml @@ -0,0 +1,70 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-commons-logging + 1.9.6 + Apache Ant + Commons Logging + Ant Listener based on commons-logging + + + org.apache.ant + ant + 1.9.6 + compile + + + commons-logging + commons-logging-api + 1.0.4 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/listener/CommonsLoggingListener* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-net/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-net/pom.xml new file mode 100644 index 00000000..73144a65 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-commons-net/pom.xml @@ -0,0 +1,75 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-commons-net + 1.9.6 + Apache Ant + Commons Net + ftp, rexec and telnet tasks + + + org.apache.ant + ant + 1.9.6 + compile + + + commons-net + commons-net + 1.4.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/net/RExec* + org/apache/tools/ant/taskdefs/optional/net/TelnetTask* + + + org/apache/tools/ant/taskdefs/optional/net/FTP* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jai/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jai/pom.xml new file mode 100644 index 00000000..1ac8f4f1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jai/pom.xml @@ -0,0 +1,85 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-jai + 1.9.6 + Apache Ant + JAI + image task and corresponding types. + + + + org.apache.ant + ant + 1.9.6 + compile + + + javax.media + jai-core + 1.1.3 + + + com.sun.media + jai-codec + 1.1.3 + + + + + + jboss + JBoss + https://repository.jboss.org/nexus/content/groups/public/ + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/image/* + org/apache/tools/ant/types/optional/image/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-javamail/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-javamail/pom.xml new file mode 100644 index 00000000..543c4977 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-javamail/pom.xml @@ -0,0 +1,78 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-javamail + 1.9.6 + Apache Ant + JavaMail + implementation of the mail task based on javamail. + Required to send emails to SMTP servers using user/password combinations + or to send mail over SSL + + + org.apache.ant + ant + 1.9.6 + compile + + + javax.mail + mail + 1.4 + compile + + + javax.activation + activation + 1.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/email/MimeMailer* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jdepend/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jdepend/pom.xml new file mode 100644 index 00000000..ecbaaad6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jdepend/pom.xml @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-jdepend + 1.9.6 + Apache Ant + JDepend + task jdepend invoking the jdepend parser. There is also a version 2.9.1 of the + jdepend parser available on the maven repository + + + org.apache.ant + ant + 1.9.6 + compile + + + jdepend + jdepend + 2.7 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/jdepend/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jmf/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jmf/pom.xml new file mode 100644 index 00000000..278a01f2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jmf/pom.xml @@ -0,0 +1,65 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-jmf + 1.9.6 + Apache Ant + JMF + contains the sound task and a soundplayer listener + download the dependency from http://java.sun.com/products/java-media/jmf/ + + + org.apache.ant + ant + 1.9.6 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/sound/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jsch/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jsch/pom.xml new file mode 100644 index 00000000..39444a3f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-jsch/pom.xml @@ -0,0 +1,74 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-jsch + 1.9.6 + Apache Ant + JSch + contains the sshexec and scp tasks + + + + org.apache.ant + ant + 1.9.6 + compile + + + com.jcraft + jsch + 0.1.50 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/ssh/* + + + org/apache/tools/ant/taskdefs/optional/ssh/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit/pom.xml new file mode 100644 index 00000000..32926a43 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit/pom.xml @@ -0,0 +1,101 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-junit + 1.9.6 + Apache Ant + JUnit + contains the junit and junirreport tasks + + + org.apache.ant + ant + 1.9.6 + compile + + + junit + junit + 4.11 + compile + + + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/junit/* + + + org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter* + org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache* + + + org/apache/tools/ant/taskdefs/optional/junit/ + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit4/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit4/pom.xml new file mode 100644 index 00000000..e40d984f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-junit4/pom.xml @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-junit4 + 1.9.6 + Apache Ant + JUnit 4 + contains JUnit 4.x support + + + org.apache.ant + ant + 1.9.6 + compile + + + junit + junit + 4.11 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter* + org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-launcher/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-launcher/pom.xml new file mode 100644 index 00000000..02ecff8f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-launcher/pom.xml @@ -0,0 +1,57 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-launcher + 1.9.6 + Apache Ant Launcher + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/launch/*.java + + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/ant-launcher/classes + ../../../../target/ant-launcher/testcases + ../../../../target/ant-launcher + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-netrexx/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-netrexx/pom.xml new file mode 100644 index 00000000..505ad929 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-netrexx/pom.xml @@ -0,0 +1,98 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-netrexx + 1.9.6 + Apache Ant + NetRexx + NetRexxC task + dependency can be downloaded from http://www.ibm.com/software/awdtools/netrexx/download.html + + + org.apache.ant + ant + 1.9.6 + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/NetRexxC* + + + + ${basedir}/../../../../lib/optional + + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.4 + + + validate + + + + + + + + + run + + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-swing/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-swing/pom.xml new file mode 100644 index 00000000..1fd3e6a8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-swing/pom.xml @@ -0,0 +1,66 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-swing + 1.9.6 + Apache Ant + Swing + a listener and a splash task based on Swing + + + org.apache.ant + ant + 1.9.6 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/taskdefs/optional/splash/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-testutil/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-testutil/pom.xml new file mode 100644 index 00000000..0b8c2d56 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant-testutil/pom.xml @@ -0,0 +1,74 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant-testutil + 1.9.6 + Apache Ant Test Utilities + test utility classes + + + org.apache.ant + ant + 1.9.6 + compile + + + junit + junit + 4.11 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/BuildFileTest* + org/apache/tools/ant/util/regexp/RegexpMatcherTest* + org/apache/tools/ant/util/regexp/RegexpTest* + org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest* + org/apache/tools/ant/types/AbstractFileSetTest* + + + + + ../../../../src/tests/junit + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant/pom.xml new file mode 100644 index 00000000..087c369c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/ant/pom.xml @@ -0,0 +1,225 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.9.6 + + 4.0.0 + http://ant.apache.org/ + org.apache.ant + ant + 1.9.6 + Apache Ant Core + + + org.apache.ant + ant-launcher + 1.9.6 + compile + + + junit + junit + 4.11 + test + + + + + ../../../../target/ant/.build.timestamp.properties + + + + org.apache.maven.plugins + maven-jar-plugin + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + delete-timestamp-file + clean + + run + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/types/resolver/** + org/apache/tools/ant/listener/Log4jListener* + org/apache/tools/ant/listener/CommonsLoggingListener* + org/apache/tools/ant/util/regexp/JakartaRegexp* + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/taskdefs/email/MimeMailer* + org/apache/tools/ant/launch/** + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/net/RExec* + org/apache/tools/ant/taskdefs/optional/net/TelnetTask* + org/apache/tools/ant/taskdefs/optional/junit/* + org/apache/tools/ant/taskdefs/optional/ssh/* + org/apache/tools/ant/taskdefs/optional/image/* + org/apache/tools/ant/types/optional/image/* + org/apache/tools/ant/taskdefs/optional/Script* + org/apache/tools/ant/taskdefs/optional/script/** + org/apache/tools/ant/types/optional/*Script* + org/apache/tools/ant/util/ScriptRunner.java + org/apache/tools/ant/util/optional/ScriptRunner.java + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/util/depend/bcel/* + org/apache/tools/ant/taskdefs/optional/NetRexxC* + org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport* + org/apache/tools/ant/taskdefs/optional/jdepend/* + + + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/types/resolver/** + org/apache/tools/ant/util/Script* + org/apache/tools/ant/listener/Log4jListener* + org/apache/tools/ant/listener/CommonsLoggingListener* + org/apache/tools/ant/util/regexp/JakartaRegexp* + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/util/regexp/Jdk14Regexp* + org/apache/tools/ant/taskdefs/email/MimeMailer* + org/apache/tools/ant/launch/** + org/apache/tools/ant/taskdefs/StyleTest* + org/apache/tools/ant/taskdefs/optional/junit/ + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/ssh/* + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + ant.home + ${env.ANT_HOME} + + + build.tests + ../../../../target/ant/testcases + + + build.tests.value + ../../../../target/ant/testcases + + + offline + true + + + root + ../../../.. + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + + + ../../../../src/main + true + + org/apache/tools/ant/taskdefs/default.properties + org/apache/tools/ant/types/default.properties + org/apache/tools/ant/taskdefs/default.properties + org/apache/tools/ant/types/conditions/antlib.xml + org/apache/tools/ant/defaultManifest.mf + org/apache/tools/ant/version.txt + + + + ../../../../src/resources + true + + **/antlib.xml + + + + ../../../../docs + false + + images/ant_logo_large.gif + + + + + + ../../../../src/etc/testcases + true + + + ../../../../src/main + true + + **/*.java + + + + ../../../../src/main + ../../../../src/tests/junit + ../../../../target/ant/classes + ../../../../target/ant/testcases + ../../../../target/ant + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/poms/pom.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/pom.xml new file mode 100644 index 00000000..47a4e328 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/poms/pom.xml @@ -0,0 +1,151 @@ + + + + + 4.0.0 + org.apache.ant + ant-parent + 1.9.6 + pom + master POM + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + Apache Ant + http://ant.apache.org/ + 2000 + + The Apache Software Foundation + http://www.apache.org/ + + + + + dummy + Dummy to avoid accidental deploys + http://nowhere.net/ + + + + scm:git:https://git-wip-us.apache.org/repos/asf/ant.git + scm:git:https://git-wip-us.apache.org/repos/asf/ant.git + https://git-wip-us.apache.org/repos/asf/ant.git + + + hudson + https://builds.apache.org/job/Ant_BuildFromPOMs/ + + + + Ant Developers List + dev-subscribe@ant.apache.org + dev-unsubscribe@ant.apache.org + dev@ant.apache.org + http://mail-archives.apache.org/mod_mbox/ant-dev + + + Ant Users List + user-subscribe@ant.apache.org + user-unsubscribe@ant.apache.org + user@ant.apache.org + http://mail-archives.apache.org/mod_mbox/ant-user + + + + bugzilla + http://issues.apache.org/bugzilla/ + + + ant + ant-antlr + ant-apache-bcel + ant-apache-bsf + ant-apache-log4j + ant-apache-oro + ant-apache-regexp + ant-apache-resolver + ant-apache-xalan2 + ant-commons-logging + ant-commons-net + ant-jai + ant-javamail + ant-jdepend + ant-jmf + ant-jsch + ant-junit + ant-junit4 + ant-launcher + ant-netrexx + ant-swing + ant-testutil + + + + junit + junit + 3.8.2 + test + + + + ../../../src/main + ../../../src/testcases + ../../../target/classes + ../../../target/testcases + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.5 + 1.5 + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.12 + + + + + + UTF-8 + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/printFailingTests.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/printFailingTests.xsl new file mode 100644 index 00000000..7d323404 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/printFailingTests.xsl @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + +| .() : + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/tagdiff.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/tagdiff.xsl new file mode 100644 index 00000000..5d430a79 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/tagdiff.xsl @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + <xsl:value-of select="$title"/> + + + +

+ +

+ Tagdiff between and + +

Designed for use with Ant.

+
+ + + + + +
+ New Files | + Modified Files | + Removed Files +
+ + + New Files + New + + + + + Modified Files + Modified + + + + + + Removed Files + Removed + + +
+ + + +
+ + + + + + + + + + - entries + + (back to top) + + + + + + + +
    + +
+ + + + + + + + + + + + + + + + + + + + mailto: + + + + + + +
  • + + / + + + + + + + + /?rev=&content-type=text/x-cvsweb-markup + + + /?r1=&r2=&diff_format=h + + ( --> ) + + +
  • +
    + + + + + + +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/asf-logo.gif b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/asf-logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..22eb9d7358ef57c3488331845e680b72c9b7c8e2 GIT binary patch literal 7279 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 F{{tbU1q=WH literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/buildfiletest-base.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/buildfiletest-base.xml new file mode 100644 index 00000000..fc1e8b0b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/buildfiletest-base.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/antclassloader.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/antclassloader.xml new file mode 100644 index 00000000..cafc823b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/antclassloader.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/case.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/case.xml new file mode 100644 index 00000000..ea4ac1d1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/case.xml @@ -0,0 +1,37 @@ + + + + + + + +This build file is intended to be used for testing Ant + + + + + + + + + + + Should fail + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/containersrc/test/SpecialSeq.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/containersrc/test/SpecialSeq.java new file mode 100644 index 00000000..ae6a3dd9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/containersrc/test/SpecialSeq.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package test; + +import org.apache.tools.ant.Task; +import org.apache.tools.ant.TaskContainer; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.taskdefs.Echo; +import java.util.*; + +public class SpecialSeq extends Task implements TaskContainer { + /** Optional Vector holding the nested tasks */ + private Vector nestedTasks = new Vector(); + + private FileSet fileset; + + private Echo nestedEcho; + + /** + * Add a nested task. + *

    + * @param nestedTask Nested task to execute + *

    + */ + public void addTask(Task nestedTask) { + nestedTasks.addElement(nestedTask); + } + + /** + * Execute all nestedTasks. + */ + public void execute() throws BuildException { + if (fileset == null || fileset.getDir(getProject()) == null) { + throw new BuildException("Fileset was not configured"); + } + for (Enumeration e = nestedTasks.elements(); e.hasMoreElements();) { + Task nestedTask = (Task) e.nextElement(); + nestedTask.perform(); + } + nestedEcho.reconfigure(); + nestedEcho.perform(); + } + + public void addFileset(FileSet fileset) { + this.fileset = fileset; + } + + public void addNested(Echo nestedEcho) { + this.nestedEcho = nestedEcho; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/directoryscanner.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/directoryscanner.xml new file mode 100644 index 00000000..7e8683a4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/directoryscanner.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/dispatch/dispatch.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/dispatch/dispatch.xml new file mode 100644 index 00000000..d529644d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/dispatch/dispatch.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target-imported.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target-imported.xml new file mode 100644 index 00000000..fc945f71 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target-imported.xml @@ -0,0 +1,23 @@ + + + + + + once from imported + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target.xml new file mode 100644 index 00000000..0a295262 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target.xml @@ -0,0 +1,31 @@ + + + + + + once + + + + twice-a + + + + twice-b + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target2.xml new file mode 100644 index 00000000..6d96bca4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/duplicate-target2.xml @@ -0,0 +1,26 @@ + + + + + + + + + once from buildfile + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/executor.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/executor.xml new file mode 100644 index 00000000..080c8dc7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/executor.xml @@ -0,0 +1,29 @@ + + + + + foo + + + + a + + + b + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/extended-taskdef.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/extended-taskdef.xml new file mode 100644 index 00000000..58ca9798 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/extended-taskdef.xml @@ -0,0 +1,73 @@ + + + + + + Try and replicate a reported problem. + + + + + + + + import org.apache.tools.ant.BuildException; + + public class Foo extends org.apache.tools.ant.taskdefs.WaitFor { + + public void execute() { + throw new BuildException("executing the Foo task"); + } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/immutable.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/immutable.xml new file mode 100644 index 00000000..26fda087 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/immutable.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.inc b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.inc new file mode 100644 index 00000000..960792d4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.inc @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.xml new file mode 100644 index 00000000..2c131b1b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/include.xml @@ -0,0 +1,25 @@ + + + + +]> + + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/relative.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/relative.xml new file mode 100644 index 00000000..697c8417 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/basic/relative.xml @@ -0,0 +1,26 @@ + + + + + +]> + + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.inc b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.inc new file mode 100644 index 00000000..960792d4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.inc @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.xml new file mode 100644 index 00000000..400a15c0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/include.xml @@ -0,0 +1,26 @@ + + + + + +]> + + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/relative.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/relative.xml new file mode 100644 index 00000000..05bbc9e6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/relative.xml @@ -0,0 +1,26 @@ + + + + + +]> + + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/simple.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/simple.xml new file mode 100644 index 00000000..d337234f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/frag#ment/simple.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/build.xml new file mode 100644 index 00000000..d75747c0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/build.xml @@ -0,0 +1,33 @@ + + + +]> + + + + + + + &included_file; + + + test target ran. + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/included_file.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/included_file.xml new file mode 100644 index 00000000..5fbd3f56 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_parse_error/included_file.xml @@ -0,0 +1,21 @@ + + + + extraneous_text + included-target ran. + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/build.xml new file mode 100644 index 00000000..d75747c0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/build.xml @@ -0,0 +1,33 @@ + + + +]> + + + + + + + &included_file; + + + test target ran. + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/included_file.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/included_file.xml new file mode 100644 index 00000000..d40d3970 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/included_file_task_error/included_file.xml @@ -0,0 +1,21 @@ + + + + + included-target ran. + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/build.xml new file mode 100644 index 00000000..7de52648 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/build.xml @@ -0,0 +1,35 @@ + + + +]> + + + + + + + &included_file; + + extraneous_text + + + test target ran. + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/included_file.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/included_file.xml new file mode 100644 index 00000000..c607bbcc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_parse_error/included_file.xml @@ -0,0 +1,20 @@ + + + + included-target ran. + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/build.xml new file mode 100644 index 00000000..687b8cf3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/build.xml @@ -0,0 +1,34 @@ + + + +]> + + + + + + + &included_file; + + + + test target ran. + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/included_file.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/included_file.xml new file mode 100644 index 00000000..c607bbcc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/including_file_task_error/included_file.xml @@ -0,0 +1,20 @@ + + + + included-target ran. + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.inc b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.inc new file mode 100644 index 00000000..d8fd638b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.inc @@ -0,0 +1,19 @@ + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.xml new file mode 100644 index 00000000..4b693cdc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/include.xml @@ -0,0 +1,25 @@ + + + + +]> + + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/relative.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/relative.xml new file mode 100644 index 00000000..81f502a9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/relative.xml @@ -0,0 +1,25 @@ + + + + +]> + + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/simple.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/simple.xml new file mode 100644 index 00000000..4092ce75 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/include/with space/simple.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/loaderref.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/loaderref.xml new file mode 100644 index 00000000..83974979 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/loaderref.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + +This build file is intended to be used for testing Ant + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/src/Task1.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/src/Task1.java new file mode 100644 index 00000000..cb374bd2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/loaderref/src/Task1.java @@ -0,0 +1,21 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +*/ +import org.apache.tools.ant.Task; + +public class Task1 extends Task { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/location.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/location.xml new file mode 100644 index 00000000..7e8f6394 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/location.xml @@ -0,0 +1,74 @@ + + + + + Only use this build file from within tests + + + + Hello + + + + Hello + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello + + + + + + + + + + + Hello + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/taskcontainer.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/taskcontainer.xml new file mode 100644 index 00000000..4a213730 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/taskcontainer.xml @@ -0,0 +1,62 @@ + + + + + + + + This build file is supposed to be run by a Unit test + + + + + + + + As nested text: ${foo} + + + + + + + + + + + + + + As nested text: ${foo} + + + + + + + + + hello + + world + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/notarget.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/notarget.xml new file mode 100644 index 00000000..25437515 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/notarget.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/targetlevelant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/targetlevelant.xml new file mode 100644 index 00000000..9b1bb1df --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/targetlevelant.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/toplevelant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/toplevelant.xml new file mode 100644 index 00000000..968ad6c1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/topleveltasks/toplevelant.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/unknownelement.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/unknownelement.xml new file mode 100644 index 00000000..b6d89394 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/core/unknownelement.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/build.xml new file mode 100644 index 00000000..b70b7786 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/build.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This has no new lines + + + + + + + File was modified + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/concat.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/concat.xml new file mode 100644 index 00000000..262dd160 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/concat.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/dynamicfilter.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/dynamicfilter.xml new file mode 100644 index 00000000..cb52d215 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/dynamicfilter.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + hello world + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/escapeunicode.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/escapeunicode.test new file mode 100644 index 00000000..ffede99d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/escapeunicode.test @@ -0,0 +1,9 @@ +#hebrew shalom olam (hello world) +text.hebrew=\u05e9\u05dc\u05d5\u05dd \u05e2\u05d5\u05dc\u05dd +#goethe gingko biloba +text.german.1=Sp\u00fcrst du nicht an meinen Liedern, +text.german.2=Da\u00df ich eins und doppelt bin ? +# Francois Villon Ballade des Pendus +text.french=Fr\u00e8res humains qui apr\u00e8s nous vivez +# Usual IT example +text.basic.latin=Hello World diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.head.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.head.test new file mode 100644 index 00000000..43d44e57 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.head.test @@ -0,0 +1,10 @@ +Line 1 +Line 2 +Line 3 +Line 4 +Line 5 +Line 6 +Line 7 +Line 8 +Line 9 +Line 10 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headAllSkip.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headAllSkip.test new file mode 100644 index 00000000..eeffaa30 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headAllSkip.test @@ -0,0 +1,58 @@ +Line 3 +Line 4 +Line 5 +Line 6 +Line 7 +Line 8 +Line 9 +Line 10 +Line 11 +Line 12 +Line 13 +Line 14 +Line 15 +Line 16 +Line 17 +Line 18 +Line 19 +Line 20 +Line 21 +Line 22 +Line 23 +Line 24 +Line 25 +Line 26 +Line 27 +Line 28 +Line 29 +Line 30 +Line 31 +Line 32 +Line 33 +Line 34 +Line 35 +Line 36 +Line 37 +Line 38 +Line 39 +Line 40 +Line 41 +Line 42 +Line 43 +Line 44 +Line 45 +Line 46 +Line 47 +Line 48 +Line 49 +Line 50 +Line 51 +Line 52 +Line 53 +Line 54 +Line 55 +Line 56 +Line 57 +Line 58 +Line 59 +Line 60 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLines.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLines.test new file mode 100644 index 00000000..98fa9e8e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLines.test @@ -0,0 +1,2 @@ +Line 1 +Line 2 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLinesSkip.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLinesSkip.test new file mode 100644 index 00000000..13cb234b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headLinesSkip.test @@ -0,0 +1,2 @@ +Line 3 +Line 4 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headSkip.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headSkip.test new file mode 100644 index 00000000..57f17d53 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headSkip.test @@ -0,0 +1,10 @@ +Line 3 +Line 4 +Line 5 +Line 6 +Line 7 +Line 8 +Line 9 +Line 10 +Line 11 +Line 12 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headtail.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headtail.test new file mode 100644 index 00000000..13cb234b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.headtail.test @@ -0,0 +1,2 @@ +Line 3 +Line 4 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tail.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tail.test new file mode 100644 index 00000000..5793dc41 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tail.test @@ -0,0 +1,10 @@ +Line 51 +Line 52 +Line 53 +Line 54 +Line 55 +Line 56 +Line 57 +Line 58 +Line 59 +Line 60 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailAllSkip.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailAllSkip.test new file mode 100644 index 00000000..532cf014 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailAllSkip.test @@ -0,0 +1,58 @@ +Line 1 +Line 2 +Line 3 +Line 4 +Line 5 +Line 6 +Line 7 +Line 8 +Line 9 +Line 10 +Line 11 +Line 12 +Line 13 +Line 14 +Line 15 +Line 16 +Line 17 +Line 18 +Line 19 +Line 20 +Line 21 +Line 22 +Line 23 +Line 24 +Line 25 +Line 26 +Line 27 +Line 28 +Line 29 +Line 30 +Line 31 +Line 32 +Line 33 +Line 34 +Line 35 +Line 36 +Line 37 +Line 38 +Line 39 +Line 40 +Line 41 +Line 42 +Line 43 +Line 44 +Line 45 +Line 46 +Line 47 +Line 48 +Line 49 +Line 50 +Line 51 +Line 52 +Line 53 +Line 54 +Line 55 +Line 56 +Line 57 +Line 58 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLines.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLines.test new file mode 100644 index 00000000..66506738 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLines.test @@ -0,0 +1,2 @@ +Line 59 +Line 60 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLinesSkip.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLinesSkip.test new file mode 100644 index 00000000..42746d1e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailLinesSkip.test @@ -0,0 +1,2 @@ +Line 57 +Line 58 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailSkip.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailSkip.test new file mode 100644 index 00000000..070eeee0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/head-tail.tailSkip.test @@ -0,0 +1,10 @@ +Line 49 +Line 50 +Line 51 +Line 52 +Line 53 +Line 54 +Line 55 +Line 56 +Line 57 +Line 58 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/linecontains.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/linecontains.test new file mode 100644 index 00000000..aabaa03b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/linecontains.test @@ -0,0 +1,4 @@ +This is line 2 with beta. +This is line 3 with beta. +This is line 5 with beta. +This is line 7 with beta. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/negatelinecontains.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/negatelinecontains.test new file mode 100644 index 00000000..a1437e90 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/negatelinecontains.test @@ -0,0 +1,3 @@ +This is line 1 with alpha. +This is line 4 with gamma. +This is line 6 with delta. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.double.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.double.test new file mode 100644 index 00000000..72eaee7e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.double.test @@ -0,0 +1,2 @@ +1@@2 +3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.test new file mode 100644 index 00000000..e666476a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/replacetokens.test @@ -0,0 +1,2 @@ +12 +3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/stripjavacomments.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/stripjavacomments.test new file mode 100644 index 00000000..c8d0672a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/expected/stripjavacomments.test @@ -0,0 +1,19 @@ + + + +public class NormalLine { + + private String withComment; + + + public void doNothing() { + + int i; + + int j; + } + + private String url = "http://ant.apache.org/"; + private String url2 = "\"http://ant.apache.org/\""; + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/head-tail.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/head-tail.xml new file mode 100644 index 00000000..e0ffed74 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/head-tail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/escapeunicode.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/escapeunicode.test new file mode 100644 index 00000000..bf861503 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/escapeunicode.test @@ -0,0 +1,9 @@ +#hebrew shalom olam (hello world) +text.hebrew=שלום עולם +#goethe gingko biloba +text.german.1=Spürst du nicht an meinen Liedern, +text.german.2=Daß ich eins und doppelt bin ? +# Francois Villon Ballade des Pendus +text.french=Frères humains qui après nous vivez +# Usual IT example +text.basic.latin=Hello World diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.small.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.small.test new file mode 100644 index 00000000..c91f1d7f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.small.test @@ -0,0 +1,5 @@ +Line 1 +Line 2 +Line 3 +Line 4 +Line 5 \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.test new file mode 100644 index 00000000..8fac760c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/head-tail.test @@ -0,0 +1,60 @@ +Line 1 +Line 2 +Line 3 +Line 4 +Line 5 +Line 6 +Line 7 +Line 8 +Line 9 +Line 10 +Line 11 +Line 12 +Line 13 +Line 14 +Line 15 +Line 16 +Line 17 +Line 18 +Line 19 +Line 20 +Line 21 +Line 22 +Line 23 +Line 24 +Line 25 +Line 26 +Line 27 +Line 28 +Line 29 +Line 30 +Line 31 +Line 32 +Line 33 +Line 34 +Line 35 +Line 36 +Line 37 +Line 38 +Line 39 +Line 40 +Line 41 +Line 42 +Line 43 +Line 44 +Line 45 +Line 46 +Line 47 +Line 48 +Line 49 +Line 50 +Line 51 +Line 52 +Line 53 +Line 54 +Line 55 +Line 56 +Line 57 +Line 58 +Line 59 +Line 60 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/linecontains.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/linecontains.test new file mode 100644 index 00000000..c95b5539 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/linecontains.test @@ -0,0 +1,7 @@ +This is line 1 with alpha. +This is line 2 with beta. +This is line 3 with beta. +This is line 4 with gamma. +This is line 5 with beta. +This is line 6 with delta. +This is line 7 with beta. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.double.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.double.test new file mode 100644 index 00000000..163417d3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.double.test @@ -0,0 +1,2 @@ +1@@foo@@2 +3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.mustache.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.mustache.test new file mode 100644 index 00000000..62df4455 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.mustache.test @@ -0,0 +1,2 @@ +1{{foo}}2 +3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.test new file mode 100644 index 00000000..e9208871 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/replacetokens.test @@ -0,0 +1,2 @@ +1@foo@2 +3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/sample.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/sample.properties new file mode 100644 index 00000000..572e79d3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/sample.properties @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +foo= diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/stripjavacomments.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/stripjavacomments.test new file mode 100644 index 00000000..37535bcc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/input/stripjavacomments.test @@ -0,0 +1,30 @@ +/* + * Copyright text + * has to be removed + */ + +/** + * JavaDoc text about the class. + * has to be removed + */ +public class NormalLine { + + private String withComment; // this comment should be removed + + /* this comment + * should be + * removed + */ + public void doNothing() { + // this comment should be removed + int i; + /* this comment + should be removed + */ + int j; + } + + private String url = "http://ant.apache.org/"; // very difficult! + private String url2 = "\"http://ant.apache.org/\""; // even worse + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/tokenfilter.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/tokenfilter.xml new file mode 100644 index 00000000..b1b5aef4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/filters/tokenfilter.xml @@ -0,0 +1,357 @@ + + + + + + + + + + + + + + + + + + + + + Hello + + World + + + + + + + + + + + + + + + + + This is the contents of the trimmed file. + This is the second line. + + + + + + + + + This is the contents of the trimmed file. + This is the second line. + + + + + + + + + + This is foo bar + + + + + + + + + + foo foo foo + + + + + + + + + This is a number + of words + + + + + + + + + + + + + + + + This is a number + of words + + + + + + + + + + + This is a number + of words + + + + + + + + + + + This is a number + of words + + + + + + + + + + + + + + this is the sun + + + + + + + + + + + foo foo foo + + + + + + + + + + + this is a line contains foo + this line does not + + + + + + + + + + + + + + hello Hello HELLO hello + cat Cat cat + Sun Sun Sun + WhiteSpace tab + This is a line with digits - 1234 -- there + + + + + + + + + + + + + + + + + hello Hello HELLO hello + + + + + + + + + @hello@ + + + + + + + + + + hello world + this is the moon + World here + + + + + + + + + + + + + hello world + this is the moon + World here + + + + + + + + + + + + + SUITE(TestSuite, bits); + here + + + + + + + + + + + + + This is some ### s + some **** + + + + + + + + + + + + hello world + + + + + + self.setToken(self.getToken().toUpperCase()); + + + + + + + + + hello moon + + + + + self.setToken(self.getToken().toUpperCase()); + + + + + + + + + + + + + + + + + + hello world + + + + + + + + + + + + + + + + + + + hello world + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/abstractcvstask.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/abstractcvstask.xml new file mode 100644 index 00000000..5de8b5e7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/abstractcvstask.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.topleveltest.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.topleveltest.xml new file mode 100644 index 00000000..65bc7291 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.topleveltest.xml @@ -0,0 +1,20 @@ + + + + Hello world + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.xml new file mode 100644 index 00000000..33ef1dab --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test1 is ${test1} + test2 is ${test2} + test1.x is ${test1.x} + + + + + + + + + + + + + + + + + + prop is ${prop} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ta + tb + tc + + da + db + dc + + + ${ant.core.lib} + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/ant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/ant.xml new file mode 100644 index 00000000..52c9a70d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/ant.xml @@ -0,0 +1,33 @@ + + + + + + This build file should only be run from within the testcase + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/references.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/references.xml new file mode 100644 index 00000000..0f3a6930 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/ant/references.xml @@ -0,0 +1,33 @@ + + + + + + + + This build file should only be run from within the testcase + + + + + + + ${myprop} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.current-test.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.current-test.xml new file mode 100644 index 00000000..0ad44dbd --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.current-test.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + Echo2 inside a macro + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.xml new file mode 100644 index 00000000..d1c4061e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antlib.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -and-then- + + + + + + + + Hello from x:p + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antstructure.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antstructure.xml new file mode 100644 index 00000000..516a9735 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/antstructure.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/available.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/available.xml new file mode 100644 index 00000000..324c054d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/available.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + testing ${basedir}${file.separator}${ant.file} + + + + + + + + + + + + + + + + + testing greatgrandparent - should see + + + + + + + + + + + + testing grandparent - should see + + + + + + + + + + + testing parent - should see + + + + + + + + + + + testing dir - should see + + + + + + + + + + + + + + testing grandparent - should not see + + + + + + + + + testing parent - should not see + + + + + + + + + testing dir - should see + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bar.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bar.properties new file mode 100644 index 00000000..c64b91ea --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bar.properties @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +bar=Bar diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/basename.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/basename.xml new file mode 100644 index 00000000..c5fd2abc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/basename.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bunzip2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bunzip2.xml new file mode 100644 index 00000000..8ae17580 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bunzip2.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bzip2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bzip2.xml new file mode 100644 index 00000000..e133dae0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/bzip2.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/calltarget.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/calltarget.xml new file mode 100644 index 00000000..4c3af92e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/calltarget.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@foo@@ + + + + + + + + + + + + + + + + + + + multi is ${multi} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ta + + + + tb + + + + tc + + + + da + + + + db + + + + dc + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum.xml new file mode 100644 index 00000000..e82fb697 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/Bar b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/Bar new file mode 100644 index 00000000..c2bc8eef --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/Bar @@ -0,0 +1 @@ +Barbapapa \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/zap/Eenie b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/zap/Eenie new file mode 100644 index 00000000..d689175d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/checksum/foo/zap/Eenie @@ -0,0 +1 @@ +Meenie Minie Moe \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/classloader.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/classloader.xml new file mode 100644 index 00000000..02e47ab5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/classloader.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/A b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/A new file mode 100644 index 00000000..2e65efe2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/A @@ -0,0 +1 @@ +a \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/B b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/B new file mode 100644 index 00000000..63d8dbd4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat-input/B @@ -0,0 +1 @@ +b \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat.xml new file mode 100644 index 00000000..235b1528 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/concat.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, ${world}! + + + + Hello, ${world}! + + + + + + + + + + + Hello, ${world}! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @REPLACEME@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    + header +
    + +
    footer
    +
    +
    + + + +
    + + + + + + + + + + + + + + @REPLACEME@ + + + + + + + + + + Hello, World + + Bye, World + + + + + + + + + + + + + + + + + + + + + + This has no end of line + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/condition.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/condition.xml new file mode 100644 index 00000000..81660ae6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/condition.xml @@ -0,0 +1,521 @@ + + + + + + + + + + + ${basic} + + + + + + + + + + + ${condition-empty} + + + + + + + + ${shortcut} + + + + + + + ${dontset} + + + + + + + ${setvalue} + + + + + + + + + ${negation} + + + + + + + + + ${negationfalse} + + + + + + + ${negationincomplete} + + + + + + + + + + ${and} + + + + + + + + + + ${andfails} + + + + + + + + + ${andincomplete} + + + + + + + ${andempty} + + + + + + + + + + ${or} + + + + + + + + + ${orincomplete} + + + + + + + ${orempty} + + + + + + + + + + ${orfails} + + + + + + + + + + ${orboth} + + + + + + + ${filesmatch-identical} + + + + + + + ${filesmatch-incomplete} + + + + + + + ${filesmatch-oddsizes} + + + + + + + ${filesmatch-existence} + + + + + + + + + + + + + + + + + + + ${filesmatch-different} + + + + + + + + + ${filesmatch-match} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${filesmatch-different-sizes} + + + + + + + ${filesmatch-different-onemissing} + + + + + + + ${contains} + + + + + + + ${contains-doesnt} + + + + + + + ${contains-anycase} + + + + + + + ${contains-incomplete1} + + + + + + + ${contains-incomplete2} + + + + + + + + + + + + + + + + + ${istrue} + + + + + + + ${istrue-not} + + + + + + + + + + ${istrue-false} + + + + + + + ${istrue-incomplete} + + + + + + + + ${isfalse-true} + + + + + + + ${isfalse-not} + + + + + + + ${isfalse-false} + + + + + + + ${isfalse-incomplete} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/antversion.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/antversion.xml new file mode 100644 index 00000000..8a54cb01 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/antversion.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + Should be at least 1.7 + + + + + + + + + + + Should be exactly 1.9.6 + + + + + + + + + + + + + Should be at least 1.9.6 + + + + + + + + + + + + Should be exactly 1.9.6 + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/http.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/http.xml new file mode 100644 index 00000000..76e87cbe --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/http.xml @@ -0,0 +1,57 @@ + + + + + + This build file should be run by a testcase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfailure.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfailure.xml new file mode 100644 index 00000000..b5d1a6a4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfailure.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfileselected.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfileselected.xml new file mode 100644 index 00000000..0626eedb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isfileselected.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreachable.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreachable.xml new file mode 100644 index 00000000..3f74aef7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreachable.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Expected failure before here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreference.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreference.xml new file mode 100644 index 00000000..d1f86db9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/isreference.xml @@ -0,0 +1,60 @@ + + + + + + + + This build file should be run by a testcase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/issigned.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/issigned.xml new file mode 100644 index 00000000..7cbf328f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/issigned.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/apassword.jar b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/apassword.jar new file mode 100644 index 0000000000000000000000000000000000000000..6bd4af1f766edbddbdc2cec65b7290b3f3d8caf8 GIT binary patch literal 1708 zcmWIWW@Zs#-~hr4jb(-mNI(S0_H_+$)b;dp)Ax1s^K^3!4$<><^X>EJZZeQ@c;8&x zF8g}J!=`@~)%0-78bY+t(nnZolMYEQQ3-`izZ(I4))`2GXt+NRG{Mw$>*?%4}_spBJEIGQz==1dxYu>OaOmzLNVP7^uA~EE& zV35$|zZ^O>%x;gS6;@r;l3Q}**S9I$ifgkf3-#A;EByT|@Vwv3&#V431bDM^Y!sOK zWd_jQYk)X_IG;HNI0grY`v>U-yXE$s_B(7K;QD>yC;m9G(7v1{(~>$}<+;u-YCL8m zQkG}j+jfHQ#^gtzzKTRBZrp8k$#R!ebb7{z1M?5CznPn4B%HbFO9F?~K8xDsOf?G$ zvrEm%(szE_&0%WfT~qM;jgs$|D!rdv(Huw2k3D=?zTk1OQvdEo1&wRx*C_w|r?^c> zZP`q_ywuX22PEdFoBuZ#d425oAKup*+E=#ief_S~L|^#g&pme5nL$$AU31Tyi5Yc$ zS-v>p--pWGdJlH3I^MqS4KG*xj!#$R*WZ%=%MA*S2|HC%&jN$uKi=RF1PbiV9%6u!)^=H}*{$LwbomTQ-$rWwY@oY$h{wqTLU zf<+bz)6$X(V^kinPf263zE7@HUxbTbwC^7i!bEQpcWHA|wLVI$v}3O5D!c`G+ge3)NbusCPsgtQB_>n*GD z=h^&M+hKd+*Z^{Du&24cSlk_kQ}d|LyT5^%3p%_S=$XYS^EC|15uc|0&rtBVNHi zq1hQ<)_(bH_4df?sQ31ohTiA)zBpJh$8$f|$JE$`RN*;Myke|5O8{o&djxi@EDVpcxhWjo%8Kk>Qdp)V%LlR2buW(`eD7Y zEAZ&AGn4v%hq3s*h`CtvKk>@tpE;9vU4A6B$~iPxqIS*yx!jO@>|DH8V^jUk z)@yg?*kpf~+xS|Wx7xJMx6FLzlcG=Qi+Z1bWi{>p75`<5z4EZxKToRt`aE5>y~y&{o4;>9=LVN*vF1IMf2Z&0DRPF5hi#XS(m^TH?dp0~ zH|m`?rJuT7mwUQlSwDND<4ws4-@bl6_gJ(0+VeSFwa>D`;tRWO8r)V8p25SLvSB$- z#vy0VMH^fWojR~6eZgUsBq^x_k9H)aZ7-et`_9kGd+GHXX6Ypgacal!JmJ5f>Z@P9 z^#A99{8rbVXsd!UKRd?-w&%xoGcho*GeZgkE?_!mV7Q1@%yA;8engoOQHNR@f;1PU zCZ^=3>XlTKaGyM(6UMM;&80^|tvy#3g|tqpX12GJyk&hKQd;`2$*+4R^KxhVZQvy(yfdK#|>x~ou literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/nosign.jar b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/jars/nosign.jar new file mode 100644 index 0000000000000000000000000000000000000000..d1b7f8d242578b4e92fc5478e51bb8c64094b950 GIT binary patch literal 451 zcmWIWW@h1H0D+>WGD9!}N^k;cU)K;vT~9wZ{Q#&k4u(RYGBbJYphTc_E)a_#EAw^q z^K^3!4$<><`|Nw>w2!y0-bG$-U9EFx&TkGfxMKX^Y0(*Hp+X%GpK~6e3|)+>XN8No zjD#w8&gl*k_6`aznXBa(b><6CNw9F~WS(9TlP2%aA~nX7yFYbncY6mFcZ=G5p7hnE za%aU(285F$>dFjX*;iCZ0i7ZX#326^r6#82rs|bclyILsp%cciXw9WZLajYl7KOA< zs%c#kVlbH-XaXaX2s3Wq1C0R!0fx7ZAQ~wwVA`;U21qdoENN5+l5lNEVS})kg8`f4 d!P>zl>;jSquLO9rvVr87fp8;`{sZDL008WwX<^X>EJZZeQ@c;8&x zF8g}J!=`@~)%0-78bY+t(nnZolMYEQQ3-`izZ(I4))`2GXt+NRG{Mw$>*?%4}_spBJEIGQz==1dxYu>OaOmzLNVP7^uA~EE& zV35$|zZ^O>%x;gS6;@r;l3Q}**S9I$ifgkf3-#A;EByT|@Vwv3&#V431bDM^Y!sOK zWd_jQYk)War_ThCeHP#t9IO}YmfLsQ@34V@>-UMD_~XPv`*M~{OX_r$=Q_Kn@tBQB zS)Ork+X=oKlOKKhDiWc%aktea%Ux2@=@}mm%s;^XW^R&^aOS2j2^>=UENYuG)hr~; zE;T1h-}!AfhpCZwO~LOsO1@vJ^nP+ha~v^0_V8i(g2%;5{kt0#G_IXrqx|!q;x-|* zWi##aQcHIpkeHut{@+~W^|9lBcwcL1U)i?z^}A9Nec_8g_t;ry21#*u%{^}>X4Lg% z`QnIwA1Zh2J=nGCc>B6Hyj<}+K3$bxe@p%^Hz+73>{LlT3-suJyg?y|5fm=Lj>Z{D zX$g<7WPQ%~eeU#$b6Xa4zFh1md^uXp&CNNF+0QI2*Dg&>GmMQnuSLmi!6J(Vi!>Cb zB_tKbs34ByHLB{vMPU`&40BW zwkMwLB_!jeK5>`;~L6mFwQx|073>q5o$+Pu zm(NyjkGzh0Z?9?SeQxiIgB5c;rzBQ6IqY9y^nIr9 z+3j!lUfQlsK2z56e$AXsb>H<@hx^(euHBJ)bM_@><-@*7aAU*K;57k1 zTl?E)eE9Zxj+?FeG}|qLt6%Z0e0jBEL&e-V-=3u|75*%Cz4(8SiSMr;)+@ULkN!F{ zssDEvi{Fcwi#7ifuU!6_GkMqLM^dYtLxUx1*ZiOR{Yp|^PGUkQD* zPSf%njqGQuPQ~pA`{i)x=Sib)*R9s7y|5Rq`}yd_$K_ntoBq|G`I8zYTCl6aIlF4I z!?)0_=Ze$kFFRxG{lY(Dlk=glmv{JyU?J7J1mOl7Bb)y~iT-yUbHseFx% z2-#7w`jO3M{@=ag$J5T#ZngM-=GBLqcWmocmT71HyiiuYepBiBIp4j- ze%|N0w*SztGm|}47KG*P?oL}g>&*St58o6jewVEc{>@v=v#G)Jf`e4{riNvfQ?77& zE3VCKGzD}C#o z)(N#AW(1}Cm$_SccQP?BurNc404`t(XJFWjR=9DZqaWU;zNq&c%Q` + + + + + + + + Expected failure before here + + + + + + + Expected failure before here + + + + + + + + + + Expected namespace support + + + + + + + + + + + Expected DTD declaration property settable. + + + + + + + + + + + Expected no property + + + + + + + + + Expected unsupported property. + + + + + + + + + + + Expected XSD support on Xerces. + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/typefound.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/typefound.xml new file mode 100644 index 00000000..054ca673 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/typefound.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @{text} + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/xor.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/xor.xml new file mode 100644 index 00000000..895dccdb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/conditions/xor.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.filterset b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.filterset new file mode 100644 index 00000000..5563dd95 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.filterset @@ -0,0 +1 @@ +This is the @TITLE@. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.xml new file mode 100644 index 00000000..bf4441c1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + +PRODUCT_VERSION=6.2.1.4 +PRODUCT_BUILD=6.5 (BLD_65036) +PRODUCT_VERSION=6.2.1.4 +PRODUCT_BUILD=6.5 (BLD_65036) + + + + + + + + + + + +a=b= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This is file 1 + This is file 2 + This is file 3 + This is file @NR@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/expected/utf-8 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/expected/utf-8 new file mode 100644 index 00000000..c1949bc1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/expected/utf-8 @@ -0,0 +1 @@ +äöüÄÖÜß diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/input/iso8859-1 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/input/iso8859-1 new file mode 100644 index 00000000..09044014 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copy/input/iso8859-1 @@ -0,0 +1 @@ +äöüÄÖÜß diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copydir.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copydir.xml new file mode 100644 index 00000000..8a8abd36 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copydir.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copyfile.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copyfile.xml new file mode 100644 index 00000000..0f8c9ab0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/copyfile.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/cvspass.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/cvspass.xml new file mode 100644 index 00000000..bbca110f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/cvspass.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/defaultexcludes.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/defaultexcludes.xml new file mode 100644 index 00000000..46292501 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/defaultexcludes.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/delete.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/delete.xml new file mode 100644 index 00000000..d74c8bab --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/delete.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/deltree.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/deltree.xml new file mode 100644 index 00000000..c69d51f0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/deltree.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dirname.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dirname.xml new file mode 100644 index 00000000..1027db12 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dirname.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dynamictask.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dynamictask.xml new file mode 100644 index 00000000..307181f2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/dynamictask.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/echoxml.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/echoxml.xml new file mode 100644 index 00000000..ec53abbb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/echoxml.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/email/mail.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/email/mail.xml new file mode 100644 index 00000000..c56fd403 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/email/mail.xml @@ -0,0 +1,40 @@ + + + + + + + + + + Hi Laura, how are you doing ? + + + + + + + + Hi Laura, how are you doing ? + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.sh b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.sh new file mode 100644 index 00000000..c996d6af --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.sh @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +echo "some blablablablablablablablablablablabla error message" err>&2 +echo "some blablablablablablablablablablablabla info message" out +echo "some blablablablablablablablablablablabla error message" err>&2 +echo "some blablablablablablablablablablablabla info message" out +echo "some blablablablablablablablablablablabla error message" err>&2 +echo "some blablablablablablablablablablablabla info message" out +echo "some blablablablablablablablablablablabla error message" err>&2 +echo "some blablablablablablablablablablablabla info message" out +echo "some blablablablablablablablablablablabla error message" err>&2 +echo "some blablablablablablablablablablablabla info message" out diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.xml new file mode 100644 index 00000000..3b13195f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/blabla.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/exec.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/exec.xml new file mode 100644 index 00000000..20e56565 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/exec.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/parrot.sh b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/parrot.sh new file mode 100644 index 00000000..2467f23a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/parrot.sh @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +for arg in "$@" ; do + echo $arg out + sleep 1 + echo $arg err>&2 +done diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/spawn.sh b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/spawn.sh new file mode 100644 index 00000000..2cf0631d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/exec/spawn.sh @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +sleeptime=10 +logfile=spawn.log +if [ $# -ge 1 ]; then + sleeptime=$1 + echo $sleeptime +fi +if [ $# -ge 2 ]; then + logfile=$2 + echo $logfile +fi +echo hello +rm $logfile +sleep $sleeptime +echo bye bye > $logfile +echo bye bye diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo-huge.tar.bz2 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo-huge.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7c2d2154a82fcf2c4fd4bef32fe7fcf0051a66f7 GIT binary patch literal 58089 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 DND)?) literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.bz2 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0e73d25205baf0930da679a3a46cb65c49e36ff5 GIT binary patch literal 7435 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 JNG;%`GXO#8oOA#H literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.gz b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.gz new file mode 100644 index 0000000000000000000000000000000000000000..decc918777d61a13cabb2947da0b5231942650a1 GIT binary patch literal 6996 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 literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5 new file mode 100644 index 00000000..b56119be --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5 @@ -0,0 +1 @@ +0541d3df42520911f268abc730f3afe0 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5sum b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5sum new file mode 100644 index 00000000..56c49d33 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.md5sum @@ -0,0 +1 @@ +0541d3df42520911f268abc730f3afe0 *asf-logo.gif diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.pattern b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.pattern new file mode 100644 index 00000000..3a6eb82f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.pattern @@ -0,0 +1 @@ +foo0541d3df42520911f268abc730f3afe0bar diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.svf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.svf new file mode 100644 index 00000000..c7f8ec23 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.svf @@ -0,0 +1 @@ +MD5 (asf-logo.gif) = 0541d3df42520911f268abc730f3afe0 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar new file mode 100644 index 0000000000000000000000000000000000000000..fc0f7902539716584c9802f0a49d69bac74d54aa GIT binary patch literal 10240 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 literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.bz2 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..99a91fc46f00478c76d54fe4f75fa3ad18231214 GIT binary patch literal 7543 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 C?*%OY literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.zip b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/asf-logo.gif.zip new file mode 100644 index 0000000000000000000000000000000000000000..5f970d59d3ee4f08dad532f94273bdadb6303232 GIT binary patch literal 7121 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 H000001}^Nq literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/copy.filterset.filtered b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/copy.filterset.filtered new file mode 100644 index 00000000..ddbcf5d8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/expected/copy.filterset.filtered @@ -0,0 +1 @@ +This is the Apache Ant Project. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fail.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fail.xml new file mode 100644 index 00000000..0a6561e9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fail.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + testText + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +testNested6 +testNested6 +testNested6 + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter.xml new file mode 100644 index 00000000..303efa74 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter1.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter1.txt new file mode 100644 index 00000000..4e4f9763 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter1.txt @@ -0,0 +1 @@ +@year@ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter2.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter2.txt new file mode 100644 index 00000000..dccd06b8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter2.txt @@ -0,0 +1 @@ +<%@ include file="@ROOT@/some/include.jsp"%> diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter3.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter3.txt new file mode 100644 index 00000000..03d7d29e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filter3.txt @@ -0,0 +1 @@ +@property@ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filterdefs.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filterdefs.properties new file mode 100644 index 00000000..f099df3b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/filterdefs.properties @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +property=included diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/build.xml new file mode 100644 index 00000000..e2fecac3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/build.xml @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Q + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/expected.zip b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/expected.zip new file mode 100644 index 0000000000000000000000000000000000000000..3111502a734a02733efadda2d02900362634ddfe GIT binary patch literal 5642 zcmeI0do+}J7{_NYVqDHB6>VfFWs@<3afvM1+E7W&xD+)_gUK}GGK0#lMTMy&tC`BW zM7v72lWs1R>~wQWLTc5zBo*nRQrdNBe=m)B-$`%N>A&6HbAGRR&oQ6hgt3@>);bbxg*ryr-7;Z$%Z$?Hf*1`9R;5cBgBiYg z0fa92k{X7W^3YBDU40_~JWT*g2aZ_GU{YvYcFZt}7+g9Qs;26ihfQZSHhsaWHPw4H zFc5kqItX2tT4Mq|K}#Qw4r0e}7?J!S1}Bnbv4O!v+k#B7vbNEp+S=J8<4%9s`Q{-2 zAHhPg!~S%40XNjzVm%{@frj1SHJ6uYNyxc$+>V7c*14H++GCGt=+(oQ;z^Rj)6}LN z+W+mlvM5h;|JS=u#kTcu_xjJ6+okI;E~zSZo+MiJ!Zy2*W3(-*eKzNReNah0$(uYI z7a~#>n(S=IYIDX^oSGe+=T&ip*|2i%i>O`#{ebWDyb6tD1iib0=INY(ilGH2@%*1} z_#LaVj9v6h5=?AKCrnqes_#@6>NR{bE~D1fWvP&r|9jq+cL#;%B=eni?klx5i#rkc z$S(72Pk7&+(&FGspN+4489p2RUsJ52XyZ$^4pyoa9%OY|*9|3fuxg&{9vprjvR92N znblXx#*nPH#4rWQvXf(FnT$zM8$nd{LU~P5aXxle?;Y$#ySXmb^9*l2#OS zlr!(I$*1w`YufH#ILBB&QE0h!03j15<+o zqRaFKHyS>jm|(=q@!-rR9c>M&Epne!Tu7Xv{^qo1cJC9CnPJH_ZnME>6sEmGlKtNb z(|abp9m+DsSXpNKNy%tw&ODH1SAtDm807f=ke1M--_?*`NTC~Ky)~i_&K%CObN#OV z;!XA*<fVxsaXqlh@n!dEdRwcKEKJELbZ4yJnG=Te}t8GQyEi6)lYULtxEdYgcvHX{`* z*QsmUmE@fAet*?)4X^{WjNz5cXRKY#=C0u#^3gUVk&KLuz-5dd zu4I(MgE{r3wv<58{pQC)w=9HC+l$zPAAfga7U~}Tl1e* z`wB`fk2~?$dD#=MJmK?J4L0rZ1M|Vwvdz&gUUTo}hKt4rCiT8ZKK{4n%d;sr$qolF zar$wYaptUQ@9XtbVoqYO5c{cFt*tJDX5!z(4y(L_%2VeDMk}4txYB`}lkKNNY1;1X zDZceMWAnDfM%MM4we|N=i_@B)gi^QF&YFD8Y5(4iN|k({w>^D{HANBB!Y)yI!Ij$1 z+l)iIJC@<6-v0C5HNWly`GNHF;+e_oO;U=)AxEHfpk#OEEG;HP zW!D*A7(TfbJS!-lquPJE;bWByl}EDo!(mqsBpq}SFoQ18PuS>-8yS5+7<(a{>>VHn z-w_;0V$A9I`EZDI!@qiOfv(V)R)dLXR}JnTw19L2~ewhz*~!1p168BkuHVJCwImZ^huFmP}J q91NwP)Xyje{&;SefQfB1VhAj4`5y!0Ajbw~JY9@BD7YSN=;>dyCvV~a literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/input.zip b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/fixcrlf/input.zip new file mode 100644 index 0000000000000000000000000000000000000000..f65ba92dfabe67d8dc125bf2f032789701b175eb GIT binary patch literal 4815 zcmWIWW@h1H0D;H_J6*sGD8a@c!;qO*P+FoN8p6rI>}Ajtd{=d6aA^fM10%}|W(Ec@ z5dhRL0@T65P}KR%C5=5IUl7OxiSWVo`z9tEh2~{efX&fJ--*qf(6-?2Up2+$gfw4w`VxMSv!4U!12||m!hpdmVFQiTNd$t z;c@P@0ur}NZ>r?P9{=a2+*s0ZA#&|WgBs6w2h$brP7+XIGQRkPvrFQVH2ci6PLBRv zsY{nEZ27;uYxhBC+y41G%{A*c#yz)~z3X-1m+3pVr=JL~{2Y-OUK#b($ha(2Xh-Yc z6C4|sr#>+`|F7v$>ghMr{-TA~Rn&0`We*5i zS--us^zE#TFBES3D24DJo)paD`fu-+yNjMVF_rJJ-Xt%b9=+w z>wMU5n#|r5w#0PrhXWfp*>b?47(#A<=1;h2WnhxdGPak%JSRYl23N*v~}{>dc-osY3;lh0h+s!pP{{$Y7(8i#Q@&nuQBIm(X-S%)8NLMe`}_QZ?TV8X z`xU1ioX|MEk^7u6(?>L0a3^3>f)O$j6EH`?(^W5lF_MIlfGr7zSLg)${6hu;N7I!* zvRc`0oS?wE+IULq(zmA~N_QM#-}uTt@J+zNuJ`x2GeciJ)%kmGZ*}?I0PEWe3a1Fg zwSV~7vHmB|r(K;_46T+i)JxXSuGdLD6?E>RRK+I7ql(|n=G?pI_*Zl4;;B|KL23K@ zoa4%wHgg|+#Hu?tQqbsXcaYE2Yp-TjxA`iVT&(7koNu;$!p%3?W^HFR#Mjy`n(^oa z%hK>4ufH^(-d1F`;l-3mD~_Ihay@b7v`2wlGS_eXKNI?vXncwP0d(6 z_g2`V{Z82h1|9BqSOtvcKAGpgU7&34dAWUz#Fmlf1cPiOCb1*RTIVByN$ff!Be24P zRdzY~dFeTsd8x(V%#SbIzdh&(tm{}9Hte@v=;HXFuWCnbD9|`czyWhf+u4Pv(Tck$ zHzXLXBdjRLUC5dd462cn10c;kP;>2m(CdjH9texVb3j^VMNVRINm^n~ajITU8on%G zXk=_+%4KG5VF^mJ2!mCeug~EC8VbVlaDz({lj1Y;;&U=fQi~FEK+NR)+}zZ>5`0$Z z>nkX6Dsge4T2L3LQ^E!`9E5q`79_Z4m;DE46WB&DV* f@W28CWGbvm!DT8dsPYGvrveOlz_jnp3*rF)L@Sc! literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/foo.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/foo.properties new file mode 100644 index 00000000..e4a8152e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/foo.properties @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +foo=Foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/get.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/get.xml new file mode 100644 index 00000000..b74e92ab --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/get.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gunzip.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gunzip.xml new file mode 100644 index 00000000..ea75d54d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gunzip.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gzip.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gzip.xml new file mode 100644 index 00000000..f1c42623 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/gzip.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/a.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/a.xml new file mode 100644 index 00000000..cf4e7a5c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/a.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/b.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/b.xml new file mode 100644 index 00000000..f95cf010 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/b.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/bad.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/bad.xml new file mode 100644 index 00000000..a3a06479 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/bad.xml @@ -0,0 +1,20 @@ + + + +<<< + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/c.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/c.xml new file mode 100644 index 00000000..d92fbc7f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/c.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import.xml new file mode 100644 index 00000000..f84d8e33 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import.xml @@ -0,0 +1,34 @@ + + + + Before import + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_bad_import.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_bad_import.xml new file mode 100644 index 00000000..8ff53672 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_bad_import.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_same_target.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_same_target.xml new file mode 100644 index 00000000..f2b1933e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/import_same_target.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/imported.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/imported.xml new file mode 100644 index 00000000..19dfdb07 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/imported.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/importtargetfirst.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/importtargetfirst.xml new file mode 100644 index 00000000..835191ba --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/importtargetfirst.xml @@ -0,0 +1,22 @@ + + + + Importing targetfirst + + After importing + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/recursive-selfimport.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/recursive-selfimport.xml new file mode 100644 index 00000000..d5ae3b28 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/recursive-selfimport.xml @@ -0,0 +1,22 @@ + + + + Before import: ${foo} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/same_target.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/same_target.xml new file mode 100644 index 00000000..1a14fe59 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/same_target.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential-inner.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential-inner.xml new file mode 100644 index 00000000..cc2a6813 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential-inner.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential.xml new file mode 100644 index 00000000..fdd68b06 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importinsequential.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget-inner.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget-inner.xml new file mode 100644 index 00000000..cd5086ee --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget-inner.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget.xml new file mode 100644 index 00000000..2dfa370e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/importintarget.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/serial.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/serial.xml new file mode 100644 index 00000000..360f9d16 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/subdir/serial.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d1/p1.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d1/p1.xml new file mode 100644 index 00000000..d1b792cb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d1/p1.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d2/p2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d2/p2.xml new file mode 100644 index 00000000..51948c9d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d2/p2.xml @@ -0,0 +1,18 @@ + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d3a/p3.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d3a/p3.xml new file mode 100644 index 00000000..31858455 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/symlinks/d3a/p3.xml @@ -0,0 +1,18 @@ + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/targetfirst.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/targetfirst.xml new file mode 100644 index 00000000..06c1fbed --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/targetfirst.xml @@ -0,0 +1,21 @@ + + + + + After target first + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed1.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed1.xml new file mode 100644 index 00000000..6fc7fde5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed1.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed2.xml new file mode 100644 index 00000000..c0fd7c65 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamed2.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamedImport.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamedImport.xml new file mode 100644 index 00000000..13b3a85c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/import/unnamedImport.xml @@ -0,0 +1,25 @@ + + + + + + + + Tests import of unnamed projects + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/initializeclass.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/initializeclass.xml new file mode 100644 index 00000000..6e079919 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/initializeclass.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.properties new file mode 100644 index 00000000..c0025a3f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.properties @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +Press\ Return\ key\ to\ continue...=test +All\ data\ is\ going\ to\ be\ deleted\ from\ DB\ continue?=test +All\ data\ is\ going\ to\ be\ deleted\ from\ db\ continue\ (y/n)?=y +Please\ enter\ db-username\:=scott +# +# JDK 1.1 doesn't seem to handle blanks in the property key +# +Press_Return_key_to_continue...=test +All_data_is_going_to_be_deleted_from_DB_continue?=test +All_data_is_going_to_be_deleted_from_db_continue_(y/n)?=y +Please_enter_db_username=scott diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.stdin b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.stdin new file mode 100644 index 00000000..3bd1f0e2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.stdin @@ -0,0 +1,2 @@ +foo +bar diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.xml new file mode 100644 index 00000000..d204b79d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/input.xml @@ -0,0 +1,119 @@ + + + + + + + Press Return key to continue... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/jar.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/jar.xml new file mode 100644 index 00000000..78d1abc6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/jar.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/java.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/java.xml new file mode 100644 index 00000000..a0c0450b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/java.xml @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${outfile}: +"${redirect.out.contents}" expected "foo" + + + + + + +redirect.err="${redirect.err}" should be empty + + + + + + + + + + + + + + + + + + + + + + + + + + ${outfile}: +"${redirect.out.contents2}" expected "foobar" + + + + + + + +redirect.err="${redirect.err}" should be empty + + + + + + + + + + + + + + + + + + + + + + + + + + ${outfile}: +"${redirect.out.contents}" expected "foo" + + + + + + ${errfile} differs from ${outfile} + + + + + + + + + + + + + + + + + + + + + + + + ${outfile}: +"${redirector.out.contents}" expected "foo" + + + + + + + ${errfile} exists but should not + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${outfile}: +"${redirector.out.contents}" expected "foofoo" + + + + + + ${errfile}: +"${redirector.err.contents}" expected "bar" + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/java/ClassToJavadoc.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/java/ClassToJavadoc.java new file mode 100644 index 00000000..a41bdc15 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/java/ClassToJavadoc.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package etc.testcases.taskdefs.javadoc.java; + +/** + * This is a simple class to provide grist for the javadoc mill + * while testing it. + */ +public class ClassToJavadoc { + /** + * @param anArgument A String that is ignored + */ + public void methodToJavadoc(String anArgument) { } + + /** + * @see java.lang.Object#toString() + */ + public String toString() { return this.getClass().getName(); } + + /** + * @return An arbitrary string. + */ + public String anotherString() {return "An arbitrary string.";} +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/javadoc.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/javadoc.xml new file mode 100644 index 00000000..2a05ec0f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/javadoc/javadoc.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + public class stuff1 {} + public class stuff2 {} + x=4 + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/loadfile.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/loadfile.xml new file mode 100644 index 00000000..66c9ce4f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/loadfile.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${testLoadAFile} + + + + + + + + + + + + + + + ${testEvalProps} + + + + #Line 1 +REM Line 2 +--Line 3 +Line 4 +Hello World! + + + + + + + + + + + + + + + + + + + + +/* +Comment "1" +*/ +public class test1 { + //Some comment + int x = 1/2; + private static final String GREETING="*/Hello/*"; + private static final String GREETING1="/*Hello*/"; + + public static void main( String args[] ) { + } +} + + +public class test1 { + + int x = 1/2; + private static final String GREETING="*/Hello/*"; + private static final String GREETING1="/*Hello*/"; + + public static void main( String args[] ) { + } +} + + + + + + + + + + + + + + + + ${testOneLine} + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/macrodef.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/macrodef.xml new file mode 100644 index 00000000..f7a356fc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/macrodef.xml @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + @{text} + + + + + + + + + + + @{text} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A nested element + + + + + + + + + @@{prop} is '@{prop}', value of $${@{prop}} is '${@{prop}}' + + + + + + + + + + + @{myattribute} is @{MYATTRIBUTE} + + + + + + + + + + + + + + + + + nested element + + + + + + + + + @{text} + + + + Hello world + + + + + + + + [@{text}] + + + + Hello world + + + + + + + + + @{text} + + + + + + + + + + @{text} + + + + + + + + + + a@b or a@@b is @{a}@@@{b} + + + + + + + + + + + description is @{description} + + + + + + + + + + Before implicit + + After implicit + + + + + In implicit + + + + + + + + Before implicit + + After implicit + + + + + + + + + + + + Before implicit + + After implicit + + + + + + + + + + + + + + + + + + + + + + + value is @{attr} + + + + + + + + + + + + + + + + + This is a failure + + + + + + + + This is a failure + + + + + + + + + + + + + + + Hello World + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/makeurl.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/makeurl.xml new file mode 100644 index 00000000..dafd00a2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/makeurl.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifest.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifest.xml new file mode 100644 index 00000000..aecaf967 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifest.xml @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + +
    + + + + + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + +
    +
    +
    + + + + + +
    + + + + +
    + +
    +
    + + +
    +
    +
    + + + + + +
    + + + + + + + + + + + + + + +
    + +
    +
    + +
    + +
    +
    +
    + + + +
    + + + +
    +
    +
    + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath.xml new file mode 100644 index 00000000..f8a47951 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath.xml @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Alpha.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Alpha.java new file mode 100644 index 00000000..96124d54 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Alpha.java @@ -0,0 +1,21 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class Alpha { + public String toString() { + return "alpha"; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Beta.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Beta.java new file mode 100644 index 00000000..c1b446f1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifestclasspath/Beta.java @@ -0,0 +1,25 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class Beta extends Alpha { + public String toString() { + return "beta " + super.toString(); + } + public static void main(String [] args) { + Beta myBeta = new Beta(); + System.out.println(myBeta.toString()); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test1.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test1.mf new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test1.mf @@ -0,0 +1 @@ + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test2.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test2.mf new file mode 100644 index 00000000..b8a88bd3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test2.mf @@ -0,0 +1,2 @@ +Manifest-Version: 2.0 + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test3.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test3.mf new file mode 100644 index 00000000..6aa82cca --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test3.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Header-without-colon maybe mistyped + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test4.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test4.mf new file mode 100644 index 00000000..27afb189 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test4.mf @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 + + Can't start with a continuation line + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test5.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test5.mf new file mode 100644 index 00000000..0fb8deae --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test5.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Name: test5 + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test6.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test6.mf new file mode 100644 index 00000000..97988c69 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test6.mf @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 + +Test: test6 +Class-Path: fubar + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test7.mf b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test7.mf new file mode 100644 index 00000000..72aace0b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/manifests/test7.mf @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Class-Path: fubar +From: Jack + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/mkdir.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/mkdir.xml new file mode 100644 index 00000000..1ecc274d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/mkdir.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/move.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/move.xml new file mode 100644 index 00000000..8b4a6c8e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/move.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/multimap.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/multimap.xml new file mode 100644 index 00000000..ce4b1218 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/multimap.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + multicopy failed + + + + + + + + + + + + + + + + + + + + mulitmove failed + + + + + + + + + + + + + + + + + + + singlecopy failed + + + + + + + + + + + + + + + + + + + singlemove failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + copywithempty failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + movewithempty failed + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nice.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nice.xml new file mode 100644 index 00000000..e67ee19c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nice.xml @@ -0,0 +1,66 @@ + + + + + +Test nicing. To make the test more complex we may be running in a nice mode +to start with, and we want to restore that value at the end. So every test +that succeeds must restore the saved value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nopermissions.zip b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/nopermissions.zip new file mode 100644 index 0000000000000000000000000000000000000000..979ee68b14343e7f6782ba095158edf5577d8564 GIT binary patch literal 138 zcmWIWW@h1H0D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/extended.calc.g b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/extended.calc.g new file mode 100644 index 00000000..00c1993f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/extended.calc.g @@ -0,0 +1,23 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +// Not really a great extension, but it is only a test after all! + +class ExtendedCalcParser extends CalcParser; + +exprList + : LPAREN (expr)* RPAREN + ; diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.g b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.g new file mode 100644 index 00000000..e5857502 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.g @@ -0,0 +1,1162 @@ +/** Java 1.2 Recognizer + * + * Run 'java Main ' + * + * Contributing authors: + * John Mitchell johnm@non.net + * Terence Parr parrt@magelang.com + * John Lilley jlilley@empathy.com + * Scott Stanchfield thetick@magelang.com + * Markus Mohnen mohnen@informatik.rwth-aachen.de + * Peter Williams pwilliams@netdynamics.com + * + * Version 1.00 December 9, 1997 -- initial release + * Version 1.01 December 10, 1997 + * fixed bug in octal def (0..7 not 0..8) + * Version 1.10 August 1998 (parrt) + * added tree construction + * fixed definition of WS,comments for mac,pc,unix newlines + * added unary plus + * Version 1.11 (Nov 20, 1998) + * Added "shutup" option to turn off last ambig warning. + * Fixed inner class def to allow named class defs as statements + * synchronized requires compound not simple statement + * add [] after builtInType DOT class in primaryExpression + * "const" is reserved but not valid..removed from modifiers + * Version 1.12 (Feb 2, 1999) + * Changed LITERAL_xxx to xxx in tree grammar. + * Updated java.g to use tokens {...} now for 2.6.0 (new feature). + * + * Version 1.13 (Apr 23, 1999) + * Didn't have (stat)? for else clause in tree parser. + * Didn't gen ASTs for interface extends. Updated tree parser too. + * Updated to 2.6.0. + * Version 1.14 (Jun 20, 1999) + * Allowed final/abstract on local classes. + * Removed local interfaces from methods + * Put instanceof precedence where it belongs...in relationalExpr + * It also had expr not type as arg; fixed it. + * Missing ! on SEMI in classBlock + * fixed: (expr) + "string" was parsed incorrectly (+ as unary plus). + * fixed: didn't like Object[].class in parser or tree parser + * Version 1.15 (Jun 26, 1999) + * Screwed up rule with instanceof in it. :( Fixed. + * Tree parser didn't like (expr).something; fixed. + * Allowed multiple inheritance in tree grammar. oops. + * Version 1.16 (August 22, 1999) + * Extending an interface built a wacky tree: had extra EXTENDS. + * Tree grammar didn't allow multiple superinterfaces. + * Tree grammar didn't allow empty var initializer: {} + * Version 1.17 (October 12, 1999) + * ESC lexer rule allowed 399 max not 377 max. + * java.tree.g didn't handle the expression of synchronized + * statements. + * + * BUG: + * Doesn't like boolean.class! + * + * class Test { + * public static void main( String args[] ) { + * if (boolean.class.equals(boolean.class)) { + * System.out.println("works"); + * } + * } + * } + * + * This grammar is in the PUBLIC DOMAIN + */ +class JavaRecognizer extends Parser; +options { + k = 2; // two token lookahead + exportVocab=Java; // Call its vocabulary "Java" + codeGenMakeSwitchThreshold = 2; // Some optimizations + codeGenBitsetTestThreshold = 3; + defaultErrorHandler = false; // Don't generate parser error handlers + buildAST = true; +} + +tokens { + BLOCK; MODIFIERS; OBJBLOCK; SLIST; CTOR_DEF; METHOD_DEF; VARIABLE_DEF; + INSTANCE_INIT; STATIC_INIT; TYPE; CLASS_DEF; INTERFACE_DEF; + PACKAGE_DEF; ARRAY_DECLARATOR; EXTENDS_CLAUSE; IMPLEMENTS_CLAUSE; + PARAMETERS; PARAMETER_DEF; LABELED_STAT; TYPECAST; INDEX_OP; + POST_INC; POST_DEC; METHOD_CALL; EXPR; ARRAY_INIT; + IMPORT; UNARY_MINUS; UNARY_PLUS; CASE_GROUP; ELIST; FOR_INIT; FOR_CONDITION; + FOR_ITERATOR; EMPTY_STAT; FINAL="final"; ABSTRACT="abstract"; +} + +// Compilation Unit: In Java, this is a single file. This is the start +// rule for this parser +compilationUnit + : // A compilation unit starts with an optional package definition + ( packageDefinition + | /* nothing */ + ) + + // Next we have a series of zero or more import statements + ( importDefinition )* + + // Wrapping things up with any number of class or interface + // definitions + ( typeDefinition )* + + EOF! + ; + + +// Package statement: "package" followed by an identifier. +packageDefinition + options {defaultErrorHandler = true;} // let ANTLR handle errors + : p:"package"^ {#p.setType(PACKAGE_DEF);} identifier SEMI! + ; + + +// Import statement: import followed by a package or class name +importDefinition + options {defaultErrorHandler = true;} + : i:"import"^ {#i.setType(IMPORT);} identifierStar SEMI! + ; + +// A type definition in a file is either a class or interface definition. +typeDefinition + options {defaultErrorHandler = true;} + : m:modifiers! + ( classDefinition[#m] + | interfaceDefinition[#m] + ) + | SEMI! + ; + +/** A declaration is the creation of a reference or primitive-type variable + * Create a separate Type/Var tree for each var in the var list. + */ +declaration! + : m:modifiers t:typeSpec[false] v:variableDefinitions[#m,#t] + {#declaration = #v;} + ; + +// A list of zero or more modifiers. We could have used (modifier)* in +// place of a call to modifiers, but I thought it was a good idea to keep +// this rule separate so they can easily be collected in a Vector if +// someone so desires +modifiers + : ( modifier )* + {#modifiers = #([MODIFIERS, "MODIFIERS"], #modifiers);} + ; + + +// A type specification is a type name with possible brackets afterwards +// (which would make it an array type). +typeSpec[boolean addImagNode] + : classTypeSpec[addImagNode] + | builtInTypeSpec[addImagNode] + ; + +// A class type specification is a class type with possible brackets afterwards +// (which would make it an array type). +classTypeSpec[boolean addImagNode] + : identifier (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)* + { + if ( addImagNode ) { + #classTypeSpec = #(#[TYPE,"TYPE"], #classTypeSpec); + } + } + ; + +// A builtin type specification is a builtin type with possible brackets +// afterwards (which would make it an array type). +builtInTypeSpec[boolean addImagNode] + : builtInType (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)* + { + if ( addImagNode ) { + #builtInTypeSpec = #(#[TYPE,"TYPE"], #builtInTypeSpec); + } + } + ; + +// A type name. which is either a (possibly qualified) class name or +// a primitive (builtin) type +type + : identifier + | builtInType + ; + +// The primitive types. +builtInType + : "void" + | "boolean" + | "byte" + | "char" + | "short" + | "int" + | "float" + | "long" + | "double" + ; + +// A (possibly-qualified) java identifier. We start with the first IDENT +// and expand its name by adding dots and following IDENTS +identifier + : IDENT ( DOT^ IDENT )* + ; + +identifierStar + : IDENT + ( DOT^ IDENT )* + ( DOT^ STAR )? + ; + + +// modifiers for Java classes, interfaces, class/instance vars and methods +modifier + : "private" + | "public" + | "protected" + | "static" + | "transient" + | "final" + | "abstract" + | "native" + | "threadsafe" + | "synchronized" +// | "const" // reserved word; leave out + | "volatile" + ; + + +// Definition of a Java class +classDefinition![AST modifiers] + : "class" IDENT + // it _might_ have a superclass... + sc:superClassClause + // it might implement some interfaces... + ic:implementsClause + // now parse the body of the class + cb:classBlock + {#classDefinition = #(#[CLASS_DEF,"CLASS_DEF"], + modifiers,IDENT,sc,ic,cb);} + ; + +superClassClause! + : ( "extends" id:identifier )? + {#superClassClause = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"],id);} + ; + +// Definition of a Java Interface +interfaceDefinition![AST modifiers] + : "interface" IDENT + // it might extend some other interfaces + ie:interfaceExtends + // now parse the body of the interface (looks like a class...) + cb:classBlock + {#interfaceDefinition = #(#[INTERFACE_DEF,"INTERFACE_DEF"], + modifiers,IDENT,ie,cb);} + ; + + +// This is the body of a class. You can have fields and extra semicolons, +// That's about it (until you see what a field is...) +classBlock + : LCURLY! + ( field | SEMI! )* + RCURLY! + {#classBlock = #([OBJBLOCK, "OBJBLOCK"], #classBlock);} + ; + +// An interface can extend several other interfaces... +interfaceExtends + : ( + e:"extends"! + identifier ( COMMA! identifier )* + )? + {#interfaceExtends = #(#[EXTENDS_CLAUSE,"EXTENDS_CLAUSE"], + #interfaceExtends);} + ; + +// A class can implement several interfaces... +implementsClause + : ( + i:"implements"! identifier ( COMMA! identifier )* + )? + {#implementsClause = #(#[IMPLEMENTS_CLAUSE,"IMPLEMENTS_CLAUSE"], + #implementsClause);} + ; + +// Now the various things that can be defined inside a class or interface... +// Note that not all of these are really valid in an interface (constructors, +// for example), and if this grammar were used for a compiler there would +// need to be some semantic checks to make sure we're doing the right thing... +field! + : // method, constructor, or variable declaration + mods:modifiers + ( h:ctorHead s:compoundStatement // constructor + {#field = #(#[CTOR_DEF,"CTOR_DEF"], mods, h, s);} + + | cd:classDefinition[#mods] // inner class + {#field = #cd;} + + | id:interfaceDefinition[#mods] // inner interface + {#field = #id;} + + | t:typeSpec[false] // method or variable declaration(s) + ( IDENT // the name of the method + + // parse the formal parameter declarations. + LPAREN! param:parameterDeclarationList RPAREN! + + rt:returnTypeBrackersOnEndOfMethodHead[#t] + + // get the list of exceptions that this method is declared to throw + (tc:throwsClause)? + + ( s2:compoundStatement | SEMI ) + {#field = #(#[METHOD_DEF,"METHOD_DEF"], + mods, + #(#[TYPE,"TYPE"],rt), + IDENT, + param, + tc, + s2);} + | v:variableDefinitions[#mods,#t] SEMI +// {#field = #(#[VARIABLE_DEF,"VARIABLE_DEF"], v);} + {#field = #v;} + ) + ) + + // "static { ... }" class initializer + | "static" s3:compoundStatement + {#field = #(#[STATIC_INIT,"STATIC_INIT"], s3);} + + // "{ ... }" instance initializer + | s4:compoundStatement + {#field = #(#[INSTANCE_INIT,"INSTANCE_INIT"], s4);} + ; + +variableDefinitions[AST mods, AST t] + : variableDeclarator[getASTFactory().dupTree(mods), + getASTFactory().dupTree(t)] + ( COMMA! + variableDeclarator[getASTFactory().dupTree(mods), + getASTFactory().dupTree(t)] + )* + ; + +/** Declaration of a variable. This can be a class/instance variable, + * or a local variable in a method + * It can also include possible initialization. + */ +variableDeclarator![AST mods, AST t] + : id:IDENT d:declaratorBrackets[t] v:varInitializer + {#variableDeclarator = #(#[VARIABLE_DEF,"VARIABLE_DEF"], mods, #(#[TYPE,"TYPE"],d), id, v);} + ; + +declaratorBrackets[AST typ] + : {#declaratorBrackets=typ;} + (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)* + ; + +varInitializer + : ( ASSIGN^ initializer )? + ; + +// This is an initializer used to set up an array. +arrayInitializer + : lc:LCURLY^ {#lc.setType(ARRAY_INIT);} + ( initializer + ( + // CONFLICT: does a COMMA after an initializer start a new + // initializer or start the option ',' at end? + // ANTLR generates proper code by matching + // the comma as soon as possible. + options { + warnWhenFollowAmbig = false; + } + : + COMMA! initializer + )* + (COMMA!)? + )? + RCURLY! + ; + + +// The two "things" that can initialize an array element are an expression +// and another (nested) array initializer. +initializer + : expression + | arrayInitializer + ; + +// This is the header of a method. It includes the name and parameters +// for the method. +// This also watches for a list of exception classes in a "throws" clause. +ctorHead + : IDENT // the name of the method + + // parse the formal parameter declarations. + LPAREN! parameterDeclarationList RPAREN! + + // get the list of exceptions that this method is declared to throw + (throwsClause)? + ; + +// This is a list of exception classes that the method is declared to throw +throwsClause + : "throws"^ identifier ( COMMA! identifier )* + ; + + +returnTypeBrackersOnEndOfMethodHead[AST typ] + : {#returnTypeBrackersOnEndOfMethodHead = typ;} + (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)* + ; + +// A list of formal parameters +parameterDeclarationList + : ( parameterDeclaration ( COMMA! parameterDeclaration )* )? + {#parameterDeclarationList = #(#[PARAMETERS,"PARAMETERS"], + #parameterDeclarationList);} + ; + +// A formal parameter. +parameterDeclaration! + : pm:parameterModifier t:typeSpec[false] id:IDENT + pd:parameterDeclaratorBrackets[#t] + {#parameterDeclaration = #(#[PARAMETER_DEF,"PARAMETER_DEF"], + pm, #([TYPE,"TYPE"],pd), id);} + ; + +parameterDeclaratorBrackets[AST t] + : {#parameterDeclaratorBrackets = t;} + (lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!)* + ; + +parameterModifier + : (f:"final")? + {#parameterModifier = #(#[MODIFIERS,"MODIFIERS"], f);} + ; + +// Compound statement. This is used in many contexts: +// Inside a class definition prefixed with "static": +// it is a class initializer +// Inside a class definition without "static": +// it is an instance initializer +// As the body of a method +// As a completely indepdent braced block of code inside a method +// it starts a new scope for variable definitions + +compoundStatement + : lc:LCURLY^ {#lc.setType(SLIST);} + // include the (possibly-empty) list of statements + (statement)* + RCURLY! + ; + + +statement + // A list of statements in curly braces -- start a new scope! + : compoundStatement + + // class definition + | classDefinition[#[MODIFIERS, "MODIFIERS"]] + + // final class definition + | "final"! classDefinition[#(#[MODIFIERS, "MODIFIERS"],#[FINAL,"final"])] + + // abstract class definition + | "abstract"! classDefinition[#(#[MODIFIERS, "MODIFIERS"],#[ABSTRACT,"abstract"])] + + // declarations are ambiguous with "ID DOT" relative to expression + // statements. Must backtrack to be sure. Could use a semantic + // predicate to test symbol table to see what the type was coming + // up, but that's pretty hard without a symbol table ;) + | (declaration)=> declaration SEMI! + + // An expression statement. This could be a method call, + // assignment statement, or any other expression evaluated for + // side-effects. + | expression SEMI! + + // Attach a label to the front of a statement + | IDENT c:COLON^ {#c.setType(LABELED_STAT);} statement + + // If-else statement + | "if"^ LPAREN! expression RPAREN! statement + ( + // CONFLICT: the old "dangling-else" problem... + // ANTLR generates proper code matching + // as soon as possible. Hush warning. + options { + warnWhenFollowAmbig = false; + } + : + "else"! statement + )? + + // For statement + | "for"^ + LPAREN! + forInit SEMI! // initializer + forCond SEMI! // condition test + forIter // updater + RPAREN! + statement // statement to loop over + + // While statement + | "while"^ LPAREN! expression RPAREN! statement + + // do-while statement + | "do"^ statement "while"! LPAREN! expression RPAREN! SEMI! + + // get out of a loop (or switch) + | "break"^ (IDENT)? SEMI! + + // do next iteration of a loop + | "continue"^ (IDENT)? SEMI! + + // Return an expression + | "return"^ (expression)? SEMI! + + // switch/case statement + | "switch"^ LPAREN! expression RPAREN! LCURLY! + ( casesGroup )* + RCURLY! + + // exception try-catch block + | tryBlock + + // throw an exception + | "throw"^ expression SEMI! + + // synchronize a statement + | "synchronized"^ LPAREN! expression RPAREN! compoundStatement + + // empty statement + | s:SEMI {#s.setType(EMPTY_STAT);} + ; + + +casesGroup + : ( // CONFLICT: to which case group do the statements bind? + // ANTLR generates proper code: it groups the + // many "case"/"default" labels together then + // follows them with the statements + options { + warnWhenFollowAmbig = false; + } + : + aCase + )+ + caseSList + {#casesGroup = #([CASE_GROUP, "CASE_GROUP"], #casesGroup);} + ; + +aCase + : ("case"^ expression | "default") COLON! + ; + +caseSList + : (statement)* + {#caseSList = #(#[SLIST,"SLIST"],#caseSList);} + ; + +// The initializer for a for loop +forInit + // if it looks like a declaration, it is + : ( (declaration)=> declaration + // otherwise it could be an expression list... + | expressionList + )? + {#forInit = #(#[FOR_INIT,"FOR_INIT"],#forInit);} + ; + +forCond + : (expression)? + {#forCond = #(#[FOR_CONDITION,"FOR_CONDITION"],#forCond);} + ; + +forIter + : (expressionList)? + {#forIter = #(#[FOR_ITERATOR,"FOR_ITERATOR"],#forIter);} + ; + +// an exception handler try/catch block +tryBlock + : "try"^ compoundStatement + (handler)* + ( "finally"^ compoundStatement )? + ; + + +// an exception handler +handler + : "catch"^ LPAREN! parameterDeclaration RPAREN! compoundStatement + ; + + +// expressions +// Note that most of these expressions follow the pattern +// thisLevelExpression : +// nextHigherPrecedenceExpression +// (OPERATOR nextHigherPrecedenceExpression)* +// which is a standard recursive definition for a parsing an expression. +// The operators in java have the following precedences: +// lowest (13) = *= /= %= += -= <<= >>= >>>= &= ^= |= +// (12) ?: +// (11) || +// (10) && +// ( 9) | +// ( 8) ^ +// ( 7) & +// ( 6) == != +// ( 5) < <= > >= +// ( 4) << >> +// ( 3) +(binary) -(binary) +// ( 2) * / % +// ( 1) ++ -- +(unary) -(unary) ~ ! (type) +// [] () (method call) . (dot -- identifier qualification) +// new () (explicit parenthesis) +// +// the last two are not usually on a precedence chart; I put them in +// to point out that new has a higher precedence than '.', so you +// can validy use +// new Frame().show() +// +// Note that the above precedence levels map to the rules below... +// Once you have a precedence chart, writing the appropriate rules as below +// is usually very straightfoward + + + +// the mother of all expressions +expression + : assignmentExpression + {#expression = #(#[EXPR,"EXPR"],#expression);} + ; + + +// This is a list of expressions. +expressionList + : expression (COMMA! expression)* + {#expressionList = #(#[ELIST,"ELIST"], expressionList);} + ; + + +// assignment expression (level 13) +assignmentExpression + : conditionalExpression + ( ( ASSIGN^ + | PLUS_ASSIGN^ + | MINUS_ASSIGN^ + | STAR_ASSIGN^ + | DIV_ASSIGN^ + | MOD_ASSIGN^ + | SR_ASSIGN^ + | BSR_ASSIGN^ + | SL_ASSIGN^ + | BAND_ASSIGN^ + | BXOR_ASSIGN^ + | BOR_ASSIGN^ + ) + assignmentExpression + )? + ; + + +// conditional test (level 12) +conditionalExpression + : logicalOrExpression + ( QUESTION^ assignmentExpression COLON! conditionalExpression )? + ; + + +// logical or (||) (level 11) +logicalOrExpression + : logicalAndExpression (LOR^ logicalAndExpression)* + ; + + +// logical and (&&) (level 10) +logicalAndExpression + : inclusiveOrExpression (LAND^ inclusiveOrExpression)* + ; + + +// bitwise or non-short-circuiting or (|) (level 9) +inclusiveOrExpression + : exclusiveOrExpression (BOR^ exclusiveOrExpression)* + ; + + +// exclusive or (^) (level 8) +exclusiveOrExpression + : andExpression (BXOR^ andExpression)* + ; + + +// bitwise or non-short-circuiting and (&) (level 7) +andExpression + : equalityExpression (BAND^ equalityExpression)* + ; + + +// equality/inequality (==/!=) (level 6) +equalityExpression + : relationalExpression ((NOT_EQUAL^ | EQUAL^) relationalExpression)* + ; + + +// boolean relational expressions (level 5) +relationalExpression + : shiftExpression + ( ( ( LT^ + | GT^ + | LE^ + | GE^ + ) + shiftExpression + )* + | "instanceof"^ typeSpec[true] + ) + ; + + +// bit shift expressions (level 4) +shiftExpression + : additiveExpression ((SL^ | SR^ | BSR^) additiveExpression)* + ; + + +// binary addition/subtraction (level 3) +additiveExpression + : multiplicativeExpression ((PLUS^ | MINUS^) multiplicativeExpression)* + ; + + +// multiplication/division/modulo (level 2) +multiplicativeExpression + : unaryExpression ((STAR^ | DIV^ | MOD^ ) unaryExpression)* + ; + +unaryExpression + : INC^ unaryExpression + | DEC^ unaryExpression + | MINUS^ {#MINUS.setType(UNARY_MINUS);} unaryExpression + | PLUS^ {#PLUS.setType(UNARY_PLUS);} unaryExpression + | unaryExpressionNotPlusMinus + ; + +unaryExpressionNotPlusMinus + : BNOT^ unaryExpression + | LNOT^ unaryExpression + + | ( // subrule allows option to shut off warnings + options { + // "(int" ambig with postfixExpr due to lack of sequence + // info in linear approximate LL(k). It's ok. Shut up. + generateAmbigWarnings=false; + } + : // If typecast is built in type, must be numeric operand + // Also, no reason to backtrack if type keyword like int, float... + lpb:LPAREN^ {#lpb.setType(TYPECAST);} builtInTypeSpec[true] RPAREN! + unaryExpression + + // Have to backtrack to see if operator follows. If no operator + // follows, it's a typecast. No semantic checking needed to parse. + // if it _looks_ like a cast, it _is_ a cast; else it's a "(expr)" + | (LPAREN classTypeSpec[true] RPAREN unaryExpressionNotPlusMinus)=> + lp:LPAREN^ {#lp.setType(TYPECAST);} classTypeSpec[true] RPAREN! + unaryExpressionNotPlusMinus + + | postfixExpression + ) + ; + +// qualified names, array expressions, method invocation, post inc/dec +postfixExpression + : primaryExpression // start with a primary + + ( // qualified id (id.id.id.id...) -- build the name + DOT^ ( IDENT + | "this" + | "class" + | newExpression + | "super" LPAREN ( expressionList )? RPAREN + ) + // the above line needs a semantic check to make sure "class" + // is the _last_ qualifier. + + // allow ClassName[].class + | ( lbc:LBRACK^ {#lbc.setType(ARRAY_DECLARATOR);} RBRACK! )+ + DOT^ "class" + + // an array indexing operation + | lb:LBRACK^ {#lb.setType(INDEX_OP);} expression RBRACK! + + // method invocation + // The next line is not strictly proper; it allows x(3)(4) or + // x[2](4) which are not valid in Java. If this grammar were used + // to validate a Java program a semantic check would be needed, or + // this rule would get really ugly... + | lp:LPAREN^ {#lp.setType(METHOD_CALL);} + argList + RPAREN! + )* + + // possibly add on a post-increment or post-decrement. + // allows INC/DEC on too much, but semantics can check + ( in:INC^ {#in.setType(POST_INC);} + | de:DEC^ {#de.setType(POST_DEC);} + | // nothing + ) + + // look for int.class and int[].class + | builtInType + ( lbt:LBRACK^ {#lbt.setType(ARRAY_DECLARATOR);} RBRACK! )* + DOT^ "class" + ; + +// the basic element of an expression +primaryExpression + : IDENT + | newExpression + | constant + | "super" + | "true" + | "false" + | "this" + | "null" + | LPAREN! assignmentExpression RPAREN! + ; + +/** object instantiation. + * Trees are built as illustrated by the following input/tree pairs: + * + * new T() + * + * new + * | + * T -- ELIST + * | + * arg1 -- arg2 -- .. -- argn + * + * new int[] + * + * new + * | + * int -- ARRAY_DECLARATOR + * + * new int[] {1,2} + * + * new + * | + * int -- ARRAY_DECLARATOR -- ARRAY_INIT + * | + * EXPR -- EXPR + * | | + * 1 2 + * + * new int[3] + * new + * | + * int -- ARRAY_DECLARATOR + * | + * EXPR + * | + * 3 + * + * new int[1][2] + * + * new + * | + * int -- ARRAY_DECLARATOR + * | + * ARRAY_DECLARATOR -- EXPR + * | | + * EXPR 1 + * | + * 2 + * + */ +newExpression + : "new"^ type + ( LPAREN! argList RPAREN! (classBlock)? + + //java 1.1 + // Note: This will allow bad constructs like + // new int[4][][3] {exp,exp}. + // There needs to be a semantic check here... + // to make sure: + // a) [ expr ] and [ ] are not mixed + // b) [ expr ] and an init are not used together + + | newArrayDeclarator (arrayInitializer)? + ) + ; + +argList + : ( expressionList + | /*nothing*/ + {#argList = #[ELIST,"ELIST"];} + ) + ; + +newArrayDeclarator + : ( + // CONFLICT: + // newExpression is a primaryExpression which can be + // followed by an array index reference. This is ok, + // as the generated code will stay in this loop as + // long as it sees an LBRACK (proper behavior) + options { + warnWhenFollowAmbig = false; + } + : + lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} + (expression)? + RBRACK! + )+ + ; + +constant + : NUM_INT + | CHAR_LITERAL + | STRING_LITERAL + | NUM_FLOAT + ; + + +//---------------------------------------------------------------------------- +// The Java scanner +//---------------------------------------------------------------------------- +class JavaLexer extends Lexer; + +options { + exportVocab=Java; // call the vocabulary "Java" + testLiterals=false; // don't automatically test for literals + k=4; // four characters of lookahead +} + + + +// OPERATORS +QUESTION : '?' ; +LPAREN : '(' ; +RPAREN : ')' ; +LBRACK : '[' ; +RBRACK : ']' ; +LCURLY : '{' ; +RCURLY : '}' ; +COLON : ':' ; +COMMA : ',' ; +//DOT : '.' ; +ASSIGN : '=' ; +EQUAL : "==" ; +LNOT : '!' ; +BNOT : '~' ; +NOT_EQUAL : "!=" ; +DIV : '/' ; +DIV_ASSIGN : "/=" ; +PLUS : '+' ; +PLUS_ASSIGN : "+=" ; +INC : "++" ; +MINUS : '-' ; +MINUS_ASSIGN : "-=" ; +DEC : "--" ; +STAR : '*' ; +STAR_ASSIGN : "*=" ; +MOD : '%' ; +MOD_ASSIGN : "%=" ; +SR : ">>" ; +SR_ASSIGN : ">>=" ; +BSR : ">>>" ; +BSR_ASSIGN : ">>>=" ; +GE : ">=" ; +GT : ">" ; +SL : "<<" ; +SL_ASSIGN : "<<=" ; +LE : "<=" ; +LT : '<' ; +BXOR : '^' ; +BXOR_ASSIGN : "^=" ; +BOR : '|' ; +BOR_ASSIGN : "|=" ; +LOR : "||" ; +BAND : '&' ; +BAND_ASSIGN : "&=" ; +LAND : "&&" ; +SEMI : ';' ; + + +// Whitespace -- ignored +WS : ( ' ' + | '\t' + | '\f' + // handle newlines + | ( "\r\n" // Evil DOS + | '\r' // Macintosh + | '\n' // Unix (the right way) + ) + { newline(); } + ) + { _ttype = Token.SKIP; } + ; + +// Single-line comments +SL_COMMENT + : "//" + (~('\n'|'\r'))* ('\n'|'\r'('\n')?) + {$setType(Token.SKIP); newline();} + ; + +// multiple-line comments +ML_COMMENT + : "/*" + ( /* '\r' '\n' can be matched in one alternative or by matching + '\r' in one iteration and '\n' in another. I am trying to + handle any flavor of newline that comes in, but the language + that allows both "\r\n" and "\r" and "\n" to all be valid + newline is ambiguous. Consequently, the resulting grammar + must be ambiguous. I'm shutting this warning off. + */ + options { + generateAmbigWarnings=false; + } + : + { LA(2)!='/' }? '*' + | '\r' '\n' {newline();} + | '\r' {newline();} + | '\n' {newline();} + | ~('*'|'\n'|'\r') + )* + "*/" + {$setType(Token.SKIP);} + ; + + +// character literals +CHAR_LITERAL + : '\'' ( ESC | ~'\'' ) '\'' + ; + +// string literals +STRING_LITERAL + : '"' (ESC|~('"'|'\\'))* '"' + ; + + +// escape sequence -- note that this is protected; it can only be called +// from another lexer rule -- it will not ever directly return a token to +// the parser +// There are various ambiguities hushed in this rule. The optional +// '0'...'9' digit matches should be matched here rather than letting +// them go back to STRING_LITERAL to be matched. ANTLR does the +// right thing by matching immediately; hence, it's ok to shut off +// the FOLLOW ambig warnings. +protected +ESC + : '\\' + ( 'n' + | 'r' + | 't' + | 'b' + | 'f' + | '"' + | '\'' + | '\\' + | ('u')+ HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT + | ('0'..'3') + ( + options { + warnWhenFollowAmbig = false; + } + : ('0'..'7') + ( + options { + warnWhenFollowAmbig = false; + } + : '0'..'7' + )? + )? + | ('4'..'7') + ( + options { + warnWhenFollowAmbig = false; + } + : ('0'..'9') + )? + ) + ; + + +// hexadecimal digit (again, note it's protected!) +protected +HEX_DIGIT + : ('0'..'9'|'A'..'F'|'a'..'f') + ; + + +// a dummy rule to force vocabulary to be all characters (except special +// ones that ANTLR uses internally (0 to 2) +protected +VOCAB + : '\3'..'\377' + ; + + +// an identifier. Note that testLiterals is set to true! This means +// that after we match the rule, we look in the literals table to see +// if it's a literal or really an identifer +IDENT + options {testLiterals=true;} + : ('a'..'z'|'A'..'Z'|'_'|'$') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'$')* + ; + + +// a numeric literal +NUM_INT + {boolean isDecimal=false;} + : '.' {_ttype = DOT;} + (('0'..'9')+ (EXPONENT)? (FLOAT_SUFFIX)? { _ttype = NUM_FLOAT; })? + | ( '0' {isDecimal = true;} // special case for just '0' + ( ('x'|'X') + ( // hex + // the 'e'|'E' and float suffix stuff look + // like hex digits, hence the (...)+ doesn't + // know when to stop: ambig. ANTLR resolves + // it correctly by matching immediately. It + // is therefor ok to hush warning. + options { + warnWhenFollowAmbig=false; + } + : HEX_DIGIT + )+ + | ('0'..'7')+ // octal + )? + | ('1'..'9') ('0'..'9')* {isDecimal=true;} // non-zero decimal + ) + ( ('l'|'L') + + // only check to see if it's a float if looks like decimal so far + | {isDecimal}? + ( '.' ('0'..'9')* (EXPONENT)? (FLOAT_SUFFIX)? + | EXPONENT (FLOAT_SUFFIX)? + | FLOAT_SUFFIX + ) + { _ttype = NUM_FLOAT; } + )? + ; + + +// a couple protected methods to assist in matching floating point numbers +protected +EXPONENT + : ('e'|'E') ('+'|'-')? ('0'..'9')+ + ; + + +protected +FLOAT_SUFFIX + : 'f'|'F'|'d'|'D' + ; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.tree.g b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.tree.g new file mode 100644 index 00000000..f065c356 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/antlr/java.tree.g @@ -0,0 +1,312 @@ +/** Java 1.2 AST Recognizer Grammar + * + * Author: + * Terence Parr parrt@jguru.com + * + * Version tracking now done with following ID: + * + * This grammar is in the PUBLIC DOMAIN + * + * BUGS + */ +class JavaTreeParser extends TreeParser; + +options { + importVocab = Java; +} + +compilationUnit + : (packageDefinition)? + (importDefinition)* + (typeDefinition)* + ; + +packageDefinition + : #( PACKAGE_DEF identifier ) + ; + +importDefinition + : #( IMPORT identifierStar ) + ; + +typeDefinition + : #(CLASS_DEF modifiers IDENT extendsClause implementsClause objBlock ) + | #(INTERFACE_DEF modifiers IDENT extendsClause interfaceBlock ) + ; + +typeSpec + : #(TYPE typeSpecArray) + ; + +typeSpecArray + : #( ARRAY_DECLARATOR typeSpecArray ) + | type + ; + +type: identifier + | builtInType + ; + +builtInType + : "void" + | "boolean" + | "byte" + | "char" + | "short" + | "int" + | "float" + | "long" + | "double" + ; + +modifiers + : #( MODIFIERS (modifier)* ) + ; + +modifier + : "private" + | "public" + | "protected" + | "static" + | "transient" + | "final" + | "abstract" + | "native" + | "threadsafe" + | "synchronized" + | "const" + | "volatile" + ; + +extendsClause + : #(EXTENDS_CLAUSE (identifier)* ) + ; + +implementsClause + : #(IMPLEMENTS_CLAUSE (identifier)* ) + ; + + +interfaceBlock + : #( OBJBLOCK + ( methodDecl + | variableDef + )* + ) + ; + +objBlock + : #( OBJBLOCK + ( ctorDef + | methodDef + | variableDef + | typeDefinition + | #(STATIC_INIT slist) + | #(INSTANCE_INIT slist) + )* + ) + ; + +ctorDef + : #(CTOR_DEF modifiers methodHead slist) + ; + +methodDecl + : #(METHOD_DEF modifiers typeSpec methodHead) + ; + +methodDef + : #(METHOD_DEF modifiers typeSpec methodHead (slist)?) + ; + +variableDef + : #(VARIABLE_DEF modifiers typeSpec variableDeclarator varInitializer) + ; + +parameterDef + : #(PARAMETER_DEF modifiers typeSpec IDENT ) + ; + +objectinitializer + : #(INSTANCE_INIT slist) + ; + +variableDeclarator + : IDENT + | LBRACK variableDeclarator + ; + +varInitializer + : #(ASSIGN initializer) + | + ; + +initializer + : expression + | arrayInitializer + ; + +arrayInitializer + : #(ARRAY_INIT (initializer)*) + ; + +methodHead + : IDENT #( PARAMETERS (parameterDef)* ) (throwsClause)? + ; + +throwsClause + : #( "throws" (identifier)* ) + ; + +identifier + : IDENT + | #( DOT identifier IDENT ) + ; + +identifierStar + : IDENT + | #( DOT identifier (STAR|IDENT) ) + ; + +slist + : #( SLIST (stat)* ) + ; + +stat: typeDefinition + | variableDef + | expression + | #(LABELED_STAT IDENT stat) + | #("if" expression stat (stat)? ) + | #( "for" + #(FOR_INIT (variableDef | elist)?) + #(FOR_CONDITION (expression)?) + #(FOR_ITERATOR (elist)?) + stat + ) + | #("while" expression stat) + | #("do" stat expression) + | #("break" (IDENT)? ) + | #("continue" (IDENT)? ) + | #("return" (expression)? ) + | #("switch" expression (caseGroup)*) + | #("throw" expression) + | #("synchronized" expression stat) + | tryBlock + | slist // nested SLIST + | EMPTY_STAT + ; + +caseGroup + : #(CASE_GROUP (#("case" expression) | "default")+ slist) + ; + +tryBlock + : #( "try" slist (handler)* (#("finally" slist))? ) + ; + +handler + : #( "catch" parameterDef slist ) + ; + +elist + : #( ELIST (expression)* ) + ; + +expression + : #(EXPR expr) + ; + +expr: #(QUESTION expr expr expr) // trinary operator + | #(ASSIGN expr expr) // binary operators... + | #(PLUS_ASSIGN expr expr) + | #(MINUS_ASSIGN expr expr) + | #(STAR_ASSIGN expr expr) + | #(DIV_ASSIGN expr expr) + | #(MOD_ASSIGN expr expr) + | #(SR_ASSIGN expr expr) + | #(BSR_ASSIGN expr expr) + | #(SL_ASSIGN expr expr) + | #(BAND_ASSIGN expr expr) + | #(BXOR_ASSIGN expr expr) + | #(BOR_ASSIGN expr expr) + | #(LOR expr expr) + | #(LAND expr expr) + | #(BOR expr expr) + | #(BXOR expr expr) + | #(BAND expr expr) + | #(NOT_EQUAL expr expr) + | #(EQUAL expr expr) + | #(LT expr expr) + | #(GT expr expr) + | #(LE expr expr) + | #(GE expr expr) + | #(SL expr expr) + | #(SR expr expr) + | #(BSR expr expr) + | #(PLUS expr expr) + | #(MINUS expr expr) + | #(DIV expr expr) + | #(MOD expr expr) + | #(STAR expr expr) + | #(INC expr) + | #(DEC expr) + | #(POST_INC expr) + | #(POST_DEC expr) + | #(BNOT expr) + | #(LNOT expr) + | #("instanceof" expr expr) + | #(UNARY_MINUS expr) + | #(UNARY_PLUS expr) + | primaryExpression + ; + +primaryExpression + : IDENT + | #( DOT + ( expr + ( IDENT + | arrayIndex + | "this" + | "class" + | #( "new" IDENT elist ) + ) + | #(ARRAY_DECLARATOR type) + | builtInType ("class")? + ) + ) + | arrayIndex + | #(METHOD_CALL primaryExpression elist) + | #(TYPECAST typeSpec expr) + | newExpression + | constant + | "super" + | "true" + | "false" + | "this" + | "null" + | typeSpec // type name used with instanceof + ; + +arrayIndex + : #(INDEX_OP primaryExpression expression) + ; + +constant + : NUM_INT + | CHAR_LITERAL + | STRING_LITERAL + | NUM_FLOAT + ; + +newExpression + : #( "new" type + ( newArrayDeclarator (arrayInitializer)? + | elist + ) + ) + + ; + +newArrayDeclarator + : #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? ) + ; diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/depend.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/depend.xml new file mode 100644 index 00000000..8465bb02 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/depend.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + This buildfile is used as part of Ant's test suite. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/A.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/A.java new file mode 100644 index 00000000..dc6df231 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/A.java @@ -0,0 +1,20 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class A extends B { + private D d = new D(); +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/B.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/B.java new file mode 100644 index 00000000..4be51f78 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/B.java @@ -0,0 +1,19 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class B extends C { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/C.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/C.java new file mode 100644 index 00000000..d2bfca9d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/C.java @@ -0,0 +1,19 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class C { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/D.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/D.java new file mode 100644 index 00000000..127de573 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/D.java @@ -0,0 +1,19 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class D { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/E.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/E.java new file mode 100644 index 00000000..0efd6134 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src1/E.java @@ -0,0 +1,22 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class E { + E() { + System.out.println(A.class); + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/A.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/A.java new file mode 100644 index 00000000..02b35be7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/A.java @@ -0,0 +1,21 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class A { + static private class Inner extends B { + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/B.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/B.java new file mode 100644 index 00000000..bc7b7d24 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src2/B.java @@ -0,0 +1,19 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class B { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/A.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/A.java new file mode 100644 index 00000000..1d973b15 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/A.java @@ -0,0 +1,23 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class A { + static private class Inner { + static private class Inner2 extends B { + } + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/B.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/B.java new file mode 100644 index 00000000..bc7b7d24 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src3/B.java @@ -0,0 +1,19 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class B { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java new file mode 100644 index 00000000..d00254b9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/ContainsOnlyInner.java @@ -0,0 +1,24 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +package test; + +public class ContainsOnlyInner { + void method1() { + System.out.println(Outer.Inner.class); + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java new file mode 100644 index 00000000..276f0163 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/MethodParam.java @@ -0,0 +1,24 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +package test; + +public class MethodParam { + void method1() { + System.out.print(ContainsOnlyInner.class); + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java new file mode 100644 index 00000000..0b709002 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java @@ -0,0 +1,23 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +package test; + +public class Outer { + static class Inner { + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/A.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/A.java new file mode 100644 index 00000000..19521a14 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/A.java @@ -0,0 +1,22 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class A { + APrivate dependency = new APrivate(); +} + +class APrivate extends B { +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/B.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/B.java new file mode 100644 index 00000000..bc7b7d24 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/depend/src5/B.java @@ -0,0 +1,19 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You 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. +*/ +public class B { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.properties new file mode 100644 index 00000000..4c970e7e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.properties @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +test.infile=true \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.xml new file mode 100644 index 00000000..7b1b8bb8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/echoproperties.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/expected/de/template.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/expected/de/template.txt new file mode 100644 index 00000000..9a7af4e2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/expected/de/template.txt @@ -0,0 +1 @@ +Diese ist eine Demo Datei für die translate_Aufgabe @missing_token@. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/resources_ger_DE.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/resources_ger_DE.properties new file mode 100644 index 00000000..7efe9b0a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/resources_ger_DE.properties @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +This=Diese +is=ist +a=eine +demo=Demo +file=Datei +#note for people understanding german +# \u00fc = u umlaut +for=für +the=die +_task=_Aufgabe diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/template.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/template.txt new file mode 100644 index 00000000..cda413bd --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/input/template.txt @@ -0,0 +1 @@ +@This@ @is@ @a@ @demo@ @file@ @for@ @the@ translate@_task@ @missing_token@. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/translate.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/translate.xml new file mode 100644 index 00000000..e6debd50 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/i18n/translate/translate.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/image.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/image.xml new file mode 100644 index 00000000..2fefa04c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/image.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/src/badimage.jpg b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/src/badimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..43a786e106a255b3b940532ae10d78366f600f58 GIT binary patch literal 875960 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ℑ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∓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

    M&!bHJz_J68~c=Rb4S-58b}w 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

    uck0iSg)c-CeMRiN2SUAiDE z*uyY<>Q){72hhQ=ad}HG;uEMEkP%afeBnO5I!d+cww#nrVjf1`l`t4CnX#1w!p=QaB zf)c3k&s*`V4IwEXPkU=oFtb^jQ+$2VB==SqD= z{XzN_2%BMS!F3fU;LxHvTB(4|Yo)*s(25wMjkN1pYVJfT>CcB7j}gy$J2(0Yb%-0? zFgyk6>Wd{P;BJ3Wq3a=3Jo{^aka&;o#1fsj$qvJlPmz8>>@AXD^hs`!qqadyTs(kr zzFc>j_Krqu9>_R4Esh(Wf!-7-6%?yy7XWkpCFyUPordI;XZCKK3D_f32Ux6h$f`NG zZ=bmQLSdBZ;L*+~-iIW%t%<1%jsGCOXP%8O)7jW=iu|?pda1d|V=(ie>EFz$P#QVN zMJ`<_K5gB{Z<{Y62q|v%AHY8vVI{(8N06pWkFCy0#6=1OU)Y^vEI85MzLoQ7c}h5T zZuY|P#f%%+8lK4T^W#5hujtGD6!*bv-CLWTV*KH__eWrzn&A!qpN7lszctA2SLV4f z@ptA^EMf7smDp~UFp%Tx^DEmlmiGBCEE2gQ?KgCHdi=-sEgr+t#mhZs1GCK*#VE^kw8%1>bS=5Bha=kMI)2)D+-5uP`O(1$W$Y<)MIpTeEOzH zM;J8`^7fm|+pTQ!=DZsd6X?)qR&cGCvibBR;Yn@AXsFH8t7{aM#q_yS4oUwz4r8-7 zIMuF5F+<;`UZ0G{v0*E4slf-MYK|r1Uy`i08Ma(^&fC~Kc00R1Eu?laL&jQR1nv3V ze)L)XC%c|ij|bZ*95W+b9g??xfW($j6?yFm0aW@=Fe4m0m z9C@ejeaW`$lbw>2eg>sHg`|lk8xH%vsZRp zp<*Wa(DGq1_NX@0Ioo#+=krT~W53s{tE`)E*Y8{r*9W@ZyuEuFzV65QLxB^_e-u!9 zKII6VqTUu_EI&&VC=A0!g&=Li-W(UX1!X)yZi*+Xc>lwLuKrN8SH`Pp{s&;1%6|Va zl5NXX<>e!mu`v643s{}j`r7o@4Hg(mM>w5mj$6q^CT&>d*YZUCr zLUpa;F)nokY$tF6!=dQ#eA}Ycy;W3niy9Zn7k)XeLr`e!dZO%y$4>MPqDhZ{Y8!%3 z_TA?ql?edfNt#!Ld9Hdpp}Z_OX%3w9U=T5MuoBz1IA1l^_|Z1Y+5Ydms~5S}DCoc}Yrc`d>zo!&c9z=odTa40f|8g| zN}r8X9`Ov=MEa}fd8M@9Q?Fk?) z;kZ&EEQ(Y$fW_}YkH4fwMD_jRQwPqS_0Yuhr419sf>s|o( z(#+SLSendXH<(<9?hWH^JBwIWaV3Ni{i6ECdY;_y!>K)vmJ_~6JmFBlc51CD0Liis z0$O+M2pG$CD;N&H#f;n?8dqZhOZb8Sha%W9qF=Ct$d^BnuzwcjH@hxirsLh@ydJ>4 zr91V|%efXm*|NI-?(pc!yiKO_Euap8B}87C!(31M(9qV_&3?!5lL2P*o``}kCvDq; z{v_G4UM-w0=3v}y?6NE)QCw1u^fU;OGO%&{Yfty9*;v+XeVr#ut`H46m?eZRYzxUP2bZS9L| zllqP;D#JBK*LG1;w^K3Q!Z#8(lv6qZj`|~!SAsY1Z7n9v3g_}ZW}lrD_*+_aCVq9^ zUW04)M%FWtdKaM$kpoFJs(MUU>mh|?qSaVKWN%GjMn+rGdp)VFkiDgou^|6bWImU*FwweQ?8=kL;_$(<0gv6E1>kD`ul zLNa$Ut`&ZA4z8tIZ9HjtkRop8dbu0Yhi+r-Qyk@Qd3Pr$m4e2evkDRN6w2+rx%?c}uYIabPSr)H7DgOb@-8n_1+Lb4_V9*67H!;Z=d; z{yT{=~W)GNsjLDiigL+PIzh z-MXPh<@%GIyJIDh77mik2&rghbB(2$(?5HisB084j%L6T3AW8xNGW}Q3UK6K738tE zn>65-({anVVWWSu}2%)u&p|!!Te8pr3JXSf@xcR*R*HOo&F-z~7 zl57f3>q3{S|5CeMvSgF&_{VXwO-;dvlfS(K!=xE3iiX9E9{Y`maaM_-Yw!LUzmcGM zNxwr%z&2s-_Ghs9MA~Rw`HhC7=E0{{v6ek^P?CwY3DBz^%^Dl{Vf`@SW=Pr7En2mi zfQ{*3)t{i&E3y{|-E;=tcQHHT(H#E)uEoeI_|=1#_shDzRnV6V*$$TvGV`P&Z1-a0;(vh7*Na6e zc9V}Xt&jRMGDdIlnSJy`x&lme@B$ks&{2e@$yP#q{#dtr(XxQN&LGq+QRWwYrSYJm zycxFsH3ms2>_+!%L`BVAaWv1evtLn8?JBPLbgfEO(!JOl&3suZ%vcems)Cu`k^4 zwC-Y2YFI+bg0r6ykDq~BYDo7dFE$gy5dEHDx4%TR`@&5>?+W!5W`3WbMIZQlT`xj|dnoF(4sc3Rp{kUqlOXDslIX*%HlT~*BS-_mb$E*`m4nBUPgC)H%8 zhg%rE4f0Xa!fp5IU6f{DmV7i2r5Uu?b`mAqyeAzGh*z})?1aEy^{wHOvN$3g43Pe0 zsjl%Xnq4dBQ)A*0Lj9<}9N@IShAEKr$&`|_E2gnL5wz)4$`_G<+>+zK;Yo_?X=Xp( z-HLw#H*C!aZqu!Wf>;y(*ty^tyAf!GoAt`^3i4W!H=H4<9L(Lzy8)ZEF`bfmaucWQ zJ-BM$ph$aKKBN=^=dMd;w&T(8jvEziuK%gnJ1OIZbX~Bd8~DPcJ%MZRHbF_?0op5A zQ=VcB(^8Qt?WdY8k58%{Kx<&*ba^qqgQw}YXx@P^{ZZb zF`@T5-HvI|koqlgRc&NqNAe%Ym6%q_G!0cs+@E)0QEWY+eR(-|xWBHC@pZux?zpsC znK9Y|W5am#wn&T^xXjZ)1J=ZU$qU)fkw79B(-L?w?5!CjneV#6zif5A+eziKuYm~l z@nu>_9_GJpeEE4bB0064rQ_I%i&GUaW}?iSJB%}B`?;$Se-kamF{kYv^Ss{p}=Z?KD4cZ~a?p9?>;HxRR29f=X=l51%V#qd@>t_L9aclHGlvl*>f6 z{VzA{?|bgF9rK=q^bkbp?L>zCzu3=RcQk`JF~UbPzA7o?<_odoP z?UA*hwc8}ak4th}pI_)7aQ+gNA@jTV z(JK^o`rtP@!~TD5zj?1CYmGh`JP8u`*Qs2P^K6ymtA*<4Z<=kg-?O*wJGO#)72RRO zT_vS@szbx}Hdk(jcjr$&)?`1`KhgckH=?Xz#%*}~aJR+3FsA>9!IhL&M`O8@=JQd5 z?a0(hBUliZe*8c@M=HRtK^sB=(c@m9&TLix2Y9Ig4Bl|$5YF;ZD!o}c+=eWCP<1tD zl=HG@+0L4s$_)JqW<=~kaO^bA045MFFHklh?1lO5=Asf_VOQL0n|eX+I)homJ&7Q- zd9e>(?~R_hB&&S(r(J%u{`xUR{F2B`G?x^Oo*rE*WrgZ(AE04dcN! zavDcwJv<=_WxQeij^)E2bj>3+E_bkZ5TmumOaZ*L8udrH78MyiE4EY0H(xxs-RMQn zxJn2iqty03yh?9H_%XuVJv1Hme|*(O@P*$*(3u^p?h=!IgP~pKjEwUA#v799Hlg7& z5nEya?lusf=mIC^dRLS9xD3Qi(XH@WyTH@tr`x94O>LUeT&NY({rL$7Z@Xv}_SS&IJ-$k)Auul9N50!7UOUwUH|-rI=KPQXQHw1q?iM|bB5AS&Q|Y-= zI!)O)O^f~ml)YpAT;+#s(?4c5U(%B`3hM92!#2(&zgN;f`^8JFj0G<7F{sP$xT7ii z@8jX1odgjLhd8k_Z^@65PB!>v1F@@-s{hBqVxsD_895aE80RZL6uH!e0xBL9S z4jdQ`$n~WGPw50_v-z^1DF6GW#sJf%OMLV9fohl4@DZB8?vVI7V3=HZu0Jl zIi02Ge*k4*WYsyWw!4n_*6LOsoLxH*H(GY8g*SoVB)=sbhF?91}|buK#hDNF(ii=TXsbOY>%Bn5?2BmjS?P#89@t zLPWGa_<;hdZ6;=i_F9c$CnDjkA0rL$6@2pgQ5HUaxWuO_#Jd5rBPiWPR^L%v-86On z$8WM|Kiz~+HH_6ltKqSDE_r-l0qqvd4x|fA%!`X=#O`%z49m;>=|o0 zvB7xNapz<~HjO3qdg0H&?)E^X7WtchRxg9FY>@R86OBULa{7j%p*~AqtcIN@YrP&+ zf|l5#ekIUqb;5|D{I5bvRYF4K=ww9f*`B_dZh`&Mq3rg!1HHjr7$Zwrc?=0X1}y7u z9b0pNjab|c3%PiGS?N)s;)O2~#!jw@@p`5$!&H*soaU1&r(v`9y5B}eIoU}iDOY;O ze=c*~H6W5enW+W%`xDck8I# zpRKMJ*FaBDwLB4w+2dpncJ6Oiaci{x`XHC?@4cee4(9xTe-kykowmeO+cc8L*YX$p z5k7WbN6V?aQR-J1@FWS3r|Jm%mo=^Uoq)E7JRHKrP(ivCu*jsh0VW( z<>#z@lu2#I_22ud(eY)*6?yj;?LPPHlywTw%fr7A09KCUK1ax;?*Zy-KgVm{_rB&;9(Zq>L_g=Iw*oNSi*(v>lU}@~NZHW!LHe;UWY5bY}dkF8VUu zuRqv67zIr4uM*LJV17nei2BtxYV`EjG68y@aI{LKJ@^~89257G=%x!hbKr@t^$8od zFJ$VNah2Ad{k>?1hZ+8n3amW;aXyd>_SYQqlMKJ-E@d=#o8deWJKMnXAP0FT@aDfx zXTiP{Aomx3T`#dN7k1&u@285}-nny|%*!f;@qg;>TzO*d)~heVF+!heuzaeAP}_A> z4Y%5ws8OkU9XpP!IiyvU@qA#>VaGF~)B;4X1XTG-?SbD>{##nPsmJVO*p1=l->@2% zw4Pn1GFRP7w?Jg=?cAyGcHjP=Ut5yI2$~$U{yZxATzqSz;eB&Xm|L-$h1M?_j9iG= zWnsNj@B)g0x5?X)AEp-hs9>wzRW*cXwf{Hpm`a~r236}G3VE&IRx7_@2hbH zN@^N>{a%MIbHW7_*$JRoE6cZb`zKd*aYJBOt){{ZZS0TRIrU(62B-s(vca^dv*mvP zNsXWmgG)1NZRwgpC{0;YlRxwRaNpl)5UoL#O0ido6YgNxj8kscK0Wc>tmV!}1;)iL z0QYi|#ZXN5VfnSA!mX9|Ih**a;hJGeHG|3Cp5Ee8Y`9BzlzEC4WaP9~X;DQnXw*0P zVum_=j^b@e{$a13>JMG^y>UxD6NDUTYSfs~j7iEijdImlI`ipYz2|1&n^I}>YPUOx zI=tZ15I2|4pMl>f@W{yREmn$2`IhFK=u1k(1?k86ZvLNw+yfJAT@#yajun97_oN%( zzIvr0No}{lbKv%Z=B?V7chRTn9@0_HQ)h48Q@GN<(X@ywbyR|$G3=xTzvj;=yfkw7 z`qrTRBkt%e(*kd)_>t3Sc z#)SEdiGvltHrvZ)@!1JecfOE+VOIoj3dkTiMbrf)Ud9QUA>@Q@v_F%?JmPsj^^Si- zKHsCtekn49c6W~n(+iA^x3Gym8C_zpeWBD)@1lQAS}()1gr!nZX(eCAq8O0aNKo8h z2)~1UyOOcpnEKaFN;f_QZ_Az03fSG}_YLTuBI^>=o6gvAY;@5(3HVQf_A}f364J#^tq`Q%AkQcCAz9t!5(0IbW=oRb@G`Ocu@ke&a)cK4i^gLNBAq%QKL`=xw@Dswf| zi2&Im^Wvsnw=P75WHmOmhhp+Wzvu?f^u$QitU$SN82x%er27uo{-g5xTc&$a0J~ zK#3$Un=>Em_lr58%3qyp(4IcE_-hd?hiyE1{DXM=-iw1{kZ(R?do zi*ADKZqQh(mU3c206~tj5+Nlj!?P39_Jfne_fHG&uI!X{=6l`eQ%=hlG$^pNdVt*T zhW-o|Oq8wq)X%*V6sm7pX>XU1aP{(4;yjOGnIa9&IZVu*Eg#5zS|bV{JQbYHQS7M2 z?Ai}i*jEYR=31P&;nz>#eE6E8pWk0IIkf z@m)<|0GA4m6r0(hQcZ||yDBvD{-6K4#I0P5CS*wTO}1MyS&nn6R-eHZ->tSHN)D&Q z2fa!twu_JJ@~sJ1B~yYvD9CrsFwDmd$SV6vkvllKmmN5_OkXtG%&|Vd@T*ZZ&tY|} zilTfKCXli7Q_d2Qs`H7f$;8y;ktzL>O6`kNo7ri$rQ|n>j~z$6{Jmu9?+f3;2B_#V zP3QvzQ!oatv_cL?;JM`3ss86}riAXQWu*v=B20mHqJHSj`-5gZfGME5G@ei{G$~RT z(;qRWl(Zuc1qP)(YUyk{u&LZ`cA#Cl)l1r96C!fB9kDg-e+GZf2UM;mS+^TzV%~f^ zIrZUhJT*cpS7f^cwp|YVYEnc@Rp$|IT0}!OpuHSL#J&GFpaM_#!FVTv^4k5h+}_bugIzf& z1uQ{N+(V3yrS(3)_`rU>$%LFbA>*y<4qBwyid=Gy=W?4GKNmTT=~Nbw{laO5tcBXb z(Ud>tXOoQ?^!uz;SVHLDYX4vwJ!pcB0;3>u+gG*6tgofVK9Ku3n3TED4Q=hz6=>a{ z;V-l#a8*vJZZbVt^E^P1gjzK72}h2kU#L3-WsVWtI(s;FZ-D40-+d}sg3z1tYy138 z&oo8Dj#j=Ct2j&{&f^SO6`}z;`A=+w-z;{5+!4jl)^4({K`oLy<`j*Hm5)0m)B0QE zQo-oWxI;bAKK1`jmv;|S3IhF|K+>vAro`(NG9j>NOE%CEaL_9AQ8d)=d%m&Zb$KT_ z)N-<^4_P9a%~ihh9vDhC30|Mdsc$}@0nP}Nq`N_Bf*ZeoWhLxR`_Yw-FSdfzNSr7{ zi_*7^pjWQl7JQzN1yeg9k;dYS8-HPUHUdk4_N^sR*A3D^sQ?Ok3AMkbQLWOtHmezi zVE@AmWyHYJ|1|Q(>O){`F6zz-0A+?mV4EOG#vEG%ZWf zA8vX32htsYmmDW@36JJ_N8PsP_>!L^HEul3_wL@a#$Vi4KlE@;Y>Z+ zrSa{EYuk4$3;aSn$KSB;l&huGCB13c3P3tn`CMTykvon~y2ko76;g~Qm)}k*i&!zY z-9XOAq)*_8Y&0rEA?|i-jA=S+`fhlmp69(Ej&l3QCJM|Tv`8hYv?x99atQB5WjT-7 z5M&+*c7RaBt>0N41`QH zWV=j>Aiwq(Nnx1|WfZh!_t;;%*(6UdkdLRRM^dlsL{8%t2Zt{ZD&~;zTCSjm3C`Om zS5zcgv~1SslysF-D${Xh;-Y3S0NbhGhN6NAH;v0oAPN{A5>V<_tek<}E-ebSo$F$> zvvC{(2e!6Bm)oc9H7TaB>bWMVpq?rm=Gy(;+)85euyNg zg%qo3bEeg#`?b45HfAd`UUPQ!}V8~tss6(8#e{uM0^LfpHnZ4@>PD^$dL-e9lffLv6TR_I-i%zj@qarPo&Z+K1sG{jYomvoSsbC&zh|XJI)7iGd;QtKSZPh>`(hT;)S8NK&$K}gS9fB%)Tp(Fr_En~ z)128OQ}P*;W!1URM=FFed}8c$n0eyy|tGA0QBA4 z0*N12g-qTQtwyp8y0P52y>e3iQuacHZ5i8UC93^R;>QaaO6_HGN4xh{#Nwta4@&b_ zxmQW5NhT@cw`xwpc}hnwYV1Az_ZJ13=Ueh)n!Cm+930l3G4}MpYwaYXVCA}3t$!k; zwle|45xI??r*+KRERC+w9$fU)Z9Q7f5B#!OUN&BhtJ8UCPx@Y4WW|?n%&E@u2{vAz z;&!rjwAs^72hM08b*5Axsw(M8qw0)ff&(*>=UKJS-mu!dQ5IEV*^@A7ez9N>G1XyNv~??UekdDcDiBV7ng zAUS$hx_fH-R8Y(S%w{F?Ni#6~%GQk(gSSUUMm6>EIuWJGRjU=&n(6&;FDnO5-DOAo z`GunfN(v>#! zJ#)NK$zD()arrMugsf3C{Ca=s)xB>$A5#h(znaQW2^!egkfq=~*dG7lPieK7tc)Px zXOqO#5Gd+DfW#D$F_=2Q6QM<&E?>4PNcoXkuT$6eXYxi#2lpYXzgY0hNi^0%>K$3= zsRhwnz9P{EJ-bbc-1OXEy`{i^@i~l}jGCeC1osO&nP|W&z&3FR`9MBZ;MPYpQ$wnP z$yy5S5Gn`2?P7JLGTU4i5}AJ#{Iyjb7dzj(P^{a;~A7-}UWLDJGC; z>-jZSrj+05mn4Mkyy*3HHXcZU!Lf`J+qGNiL6tQQ;v}oa_E+??7=w9#&FiXzr$zMG zc!~sUe_0#8u7+oGr%g@!L)QE_Uov&#h?(a&6)zPnoLHwBR7=zTE%11fAw}4dr!P=K z<}cjWPv!7m%kxLkI`gh^cnXTP^yM^ZKKqxL(5VmD(Zh}=dpwI(xM8^Qp&EL48CT^R z2CCX7nN0ZtE{?y9bsZ!8ypr81FPDTJ&-E^4uXi!!ks>Xqh zR>Afc8q~mlNDsJ_7e(&_z z`^c^42?^hot{nhq2Y^`&)K7@H3!4V` zm}p`4?$+)D@(?0vD^F?zz-X@Jwb3XQ)7=VbXB2Icgm$srNyiM*NvCzI`T6-38c-qK z@2~T1KVeX;ue^g%OqE}u8L1Q1+;jotlvHh14)lB&?sfylMnSK}ao-P|cqdIwdY-o% z1x#QXAFcO8cnb^rM}^AawLRI=p`co%A9^N$ufgzi1?0pX-6G$K>lWF)wV5*Dmyd>r zM&;i1mHtQGKO2+t;?gM#(B(L? zqxSKxQCimn7ZU9>NUj|ojJMJ%ye=0mI}GXt#1UOUD2XJWxuwpFxuNN9tWOzweflCy zu=s$(_20};i#E_@a-bm$wmVw8s&AqVy*--NX@b`5FK=m5V@ka$7m|`-A@niN`J=vb z31B`c6D9H#jvp{Chugo?VM?h*n|09T(LA09-7Dm{*I13bg^I)He?ketu*2n1z9+a| zS5k;NcIX;Rn@^f)0>uzsA(XQc#xUMCgU8QD`#my%=4APpWs7NMMPk}ENqXwc5OATS zQ(y&3U4aQsjUlL?{2M$Q>5@Rt??iPLd^5x+LRh6;FJR>IB_4J%$|sws00)v8Fh&@w z)AoPW=m$|*H9!~QF3}g=7tx(xwp$mg8Z$6M%6&$ImT}OQK1~ha*r{B{-F4${9Jl2c z;l^G7xCKeQ-b}H-$2a7@InS~1M0mDpoFLj8y|*;Uh=#&g^xUi_^ekdKyvL{C2lpHQ zGYd?`rI6H3(5TbpZ*pviUYvNFonE~wJRV7vp|w*{-yS>+k``x+6(=t06#6O16Xbh# zWBL)pA827)v!Bs4hH`Fixw@o5>%Iu1#@4)$hwXE;%qqUp^BY=9XWpfFo|l+BmG#!R zzI80IZr%A<3OMgR^cDo66x}s5)e4@Zg|qz0Gmq3iO>~<2X?K4dG+srN|IJnq_X3gE_nXO8Rr`H3O(k5LyC8iEGfj4k%X{QoAksY3_LMUWk=R z_WRNwaeX%fJ#rt+ifW4m)H|sFI7~$%rkjFT;h5o2 z-hE0;Ct4PO5>8-5wb}g#NI5q9ixdE)`r1YxpBJ@I4Xu3tV)V1v>v6&#z>834ITQp6 z>9;d0!O)>XxOM=-`Uv=}A2YR#!x!}vay$AXa1#GNiq1Qp>i>`8my1hgM()k-UYVK2 zz4pjT*(;k%Qnu`M5u$5dD_oaCsLW(UGU8q%gd+2D?Y*B5ZPzgv|05WN_Cz~I)VT1bA@V(lIq%|EEIUHJ#+KLX%B1rm8dKXK9zX*J>fVwAp( z|MKfVd|F)1VE9yudr}4Anptdg1}?Tb^dU|cz=l7^<5VxhO=@+`cCO*wF>-glr6Dnf zeiYC>$RaoDZWZNciWZL~&S!xgz+X-9W0eUDh==1+0!$9D)A8?+Tv$XyyGaIRFvi8J z6G?l^InNU5uA|oHl>BapHx24h#iF;@CPONYfIS zL%`CVo#LIPc%%E32YfA;C9T$0!!y)P?eziEuIcR!@SE zfaaE?C5TK_oK7F}%}CP@3Y@n3@E?FJy#R zo1e&>1AJ>6xE&?Aq&+bqBizCLG0}i3f#Ed)#!W<~`AOsNE)4S6Hap?==9By?MTY>fd(HWc_$MiT*0xC^uL5@;gH7h)!7dzzP zqf<^c*wAdxR?a!Xva5m3&Wi8~n#EmQq1eL|qO-W`tWEOL`5Z2|M?JFfM}-fw^ltQv z&C8g@{sV0k++(Zb(6t>RK;ZESmn0jyY)5v2`~j5PVwuUQxDn2tOEkTlpMlC6e}(@r zAYt-LHJ!WlCbMUhSJkVfOaR9)i68B!OxQ^6X}h~?xy86(NPoNVu1A1w0Ijp%zmWk~ zEg5i$Db&rMg$C+;?JnBq?S0R~gv3Y|_nUve#|PY~o6r~KXwa=O7?P43_T!|&tb?Vr z78k!>nwQOTox`hg???J!Oa~4?;S7hWm!YTREIAb~&mUOLmmk@`eqinozL$}wF=2ua znh$xzo{X=}#RXK{ySz1Lk_ldJ8nlpq9K)Pd$JMl?>>KUC`h3!w>_l|uA+nqm@5d=M zc;WdEm%@%ItAQOnsoV@~Q)kCVRo3b(S@O3&zC-D=MUTZp71iMD5j4_vH$&dbPY#$T z@=Nmg(1IX@L*6pPr*te)7?ff_Nj3t)&PL-Eu;=o|xDfJ#^L%*qQ(wCnZCjw#cmEC# zDxfkG-6k!#y@%NSgli1LP$1Q>5aOw$VKOlA3%!B%@<1=T)=4p+E~GJ}NRP%C z1mhq0b5n`FS1$im|1<^fn@00w5HQrA9{VpePmSUULr1T#aGbjDJYJ@?X?z5f6KGe;shAXyI5>ZVo~9$Kn|SUM z3$6w<5}||(bE~}oFS0O6nFaLFLRN6!&W3~GR9IX=Le$2YX*vh}wyu6HBm)AwXhkVp z&)z0;H)bGzfBCqY8$~`O0hh_=9JizwlPXOh|29<&(=M$#7K=n<-3mwF8e@I@Q(~1^ zDR|osQ;<$eWR;m0|EMV8Q@os2wAAJ462D({)^1^h>m!)~8 z{-O)M?T?O8AX041&0=L*B|(h{u{p%irMnVg@ieBB;VDnUWiKe8*8}Bapw~eH!3D@t z+rX$)dLK#~Lc6L9#JVt0;NQdVT>kYkWBggqf8Ofocrc#vA7FeTAG^2e12P;xsDL`Q zyoR}aa(nLS*G!+thTbsFx%pMaepr=N;!$7AkQp-VV9;s$+21kKK!# z$VBUPsc6EgJILkFlsjF_`<*nNr=He4)E5j}6oCvGuU)zi0yLz-j!EjtX1Z_^SS8_O zC{p<;=mpBtPcuE{NBPm9PWd9UeL|9EeOf7vl?$&-^Gexzsn0PYsu zn!vj}o@OC;U>f;p00@a%_hZu5#e>@y3*Q70n?xzWJwb)@^tfOuj8=$ck0fX^xU0juGBaC0 zD8&2OfmH@e$UA45Ddj689gp(0u`td~=If7KtMchw&1%O`uV^x)vvs>@j0-i|iEeQ# zK;W{&eWEmb!i_arvUq`KVsTzIsaN%{9I|W7MN;l}S+*1FB{!T62 zF5TT(Fig1j{E@b&%HJ>GxV^`-;3X}mE|mIY5X;00gYRmT(1jr}isQr!UUl>nYV^7B zTyw(aQOGkS+v$B_C!CpYbfNl0Rpjfj!-EgE*uUx6gxBbfJ*0(;r7?4d{-1qxnthVE z`+UJW`VMLA0y#h9{c!Zr;hA<}NX1`0@8fijDGGCC&g9~ZX%=x=ue^? zzSivqrp|kYS&zSXt*mePCEtYpM!wSb);FJ)^nwnq5!Ts79@{7;5ez3)>vWPTp`XW; zr2RfpFZ#mLAhsf3nPC`-X=2R%!LcOR0ORi+(XNv@0rUfWVO=W%b&4*l|1b?r1Xo5p(y5lYL68Mnj0PM z5dVGG%z>u+W4Ph($Xmg_m=%rjFCi<^?#Fvv5einMBm`*yo}Bfde71s5d`?2sa$0S# zqX&*qvg|z&FZbz@hs-tI2H>9vkuw)A0g#pI%@ObfgLtgi7j;LgmGk1panRc}967m` z>aLico7l@wX}A!wG93B~O{uFaFSQ*urfXbG7Kgc;1yVRP$@_RQvV9dBV*!wR(0EIe zsvae3ZZF~%v|LEYcb$2(RQ_2xph_Lihys9nn0baav}HH})KHWTO_sF?aFZpyDI>o3 zHNc0)AAObr6dp8$il<{6akdm_EGI&!N|AZst#XrHF=)wAZ`xp!gn)xaQ4e!T1}>4FJ=O2KGoDiLq3W$0$7N}ENm0G&k6+xvLd)Poynn|=(%;?VmZ16bsj$`G zuqoj=y6pQ&YMiP;LNV$THG$bGFBy`9H0$?h3c}voF5POW4~F@q_wzrNN$n+Kr34LU zfy3zar;{aTT9=iZ>Oma}56cI2J<)WlQTBhU3l85hzf=)m1a4W!jhX!T_Y5`%(~ZAN zl@Vu-fROm-6Z}&@-gMbhje9rdXvIoqkiI8!%m2jCt~7#`QXeLraH?CW+z9tkp|zO_ zJr(+#O`a$|)pb$cWhr<5aqH~?ixf04GRk7=2v^?73qP@M6SA?B81K&&m*u+kNU6=E zj$622o}jzJ}j4_7hI z&^=i)<=iPYI`vJC2Ln#8y?R(#%=XJzx;>r0u#s!yV?gk~xXwBpS!Z0~0ol*No+$+U ze);LMI={w1t$}$Sf@af2PD;IFZOsC)D#L6-OCZ|@2WR7Ob}vghP!6|KW{m&MEj}ry zcID6)RQ?^6*{Wi1LxTDRG=lr3H_eX7q?rVsk9Scr02sO9|35%>Wc^3%MbTac9!hm| zcp)-ad#l8y!gRpOvM-YhB_yQuR>>{4T`0*p`$-Ug1yPq?n6YJv2%w!$uni+s%F^LB z(&U+5vh7Ec$B`m7EGr&P#=td#h2(f5Ly)ieoj z{a)1}1^vui&^Y;&H!7C{ABAaDIE$Pz+Ba2I#yTfJ7`;{5XguG_hQ(VmH?ttC&Lvm@ z62^~=@d+VJGV{J9#XJ)UiW7fj<K$o4!%}OsjC}b5Bp6a;&pkB1`}66O<1H0t)9Rrd%vH zkuh)q(>SOmFu%gUwK6^TdumTjWkfpK zi7e)!dubPe6+_7{UhJ8iDDQA@RFik_+_?g$3ALR2Kl1ldxDVH_9n6twlbw>~4Kd-` z0w4oU2j>GlBYjdJ?Vus|;@LRGUXqx8d z@SxDIM@Iuj^tzRi3)CTmB2mQC{Y}pQnF4#XG|Jw83`f{$;zenF4DE9t8 zfaBAKS&o_-n_h{9IL}PF5{-EuSbB-$Tgw<3*}OB54|j|u2)f+G^jBy~wKDiUXaBW5 zfe;o@X6jvSb=xeey{S~MztycZSIFy74$Z7&ot##dAHWpm$OyfSk?#t<04e_TVKUBn z=-}eCI39!vnZiu$45xOcIX%(dU$~r1oIw)AeR~<(rxl|Qc+~(S1)XwsBjKk>s?7aDMvbtdOAf&%slu0#Vj3J=?G(tK(cnTFYb0xUeanWKzLqr(@Ro|-)mEICf zK%W}bRji1%V_gr@CmdbeGH@WkM~sD zDh@zu{s+XU6s~;J4dQ_IC+EJ&vaJEb+gE*boDsbsC|X-?k!Sm@He_(b(6&K#i1b$% zZ(Hw4)gbkE@kp6=HS(Lg0ycrjQ?w-n{#UAju2Sif{gRty2PrxKu?@gUl~vKK$;P#K9R$Zb{F*1bt1$V5d#7-T3^1i-t{i(w3vJbVd?j#ov zz80S~X`$GUnMs7(BNmZ)n@ZQ`M=MWa4Qs!~-IVv1nIDmbib~Mg>&$poCeJ2}G?7!{ z60x1UOnab2Yc)2#ny}22W!En;Zr1`OHn~~5IZ=AzG)!7Au2^<2aDsa`vWjm#nDhFk z`znP`;XW1Wha`aLvhRxu0arQ9mz@1xNl2-v(v9D+_=Y(KkFi@Jg_bCMdkl1s`4`81 z_mVsncnlwo-f^1#8j-6#69bbl*1%%3DCpovJd7bxn@jSq@1;`zTyVHCP;9(MQz2Ku zVD$EtwN349sgKc(FiaaB!M`^Z?v~nh7L|1C*M&;z@g3G4Mfn1Pq%Xe_7$ZaWdiThf z1)6WP;nRSL9s@dikm2(4?pLDpS;_Rkr6$c7<~~`h8#yF^GN6uN!%Y>$Y%wHItsp!c z`PA{>m7nA1ylC{!zs1WiQz3avBFzdYloow_dpGiYChAmaOJilJ1Zz7wc>FJbxcsk+ zrhc2X3=P9-rnk0+fc)sxm?pz+_@c{%sZp+vF&aL$ ziu1MD@*yF?U~=-K<~?>321*?E6h(h*_U|F36oj7nPY*Y#N}FP&Xb>wGNyX*sd4Z{( zcdjZTJe}OHE!*Vx{+R`z5xs;ULx7+mj>eLc=a0uFSjQiZy5tu0Vn3;V1%+-OSRH|v zz7ml@jE?F8-;Lm)&aZYowF{5Dx^zZA{eHX?z_nQ47^gc~BFkak%g>aHObG@(*V?_R zT@c%dP}CaP3D94gyKep0MtN*oM~Jpqi7A+f+^|<%@SfzGPfhqFQRR7|SGK_!I6tDS zYKYYrugX33lSKvA%n=A17}>Qm%Z?en_sA+k_p-+y7~nZ!GKH;=4G`cS1)dprclhf) z=Hr9Q!f>{dx!K1j8@hY9E1o_vAG!PbWV>2I=%or&+cwU^g1hPQly18xjlUg|vt0Mk@dB7BM%E^uy9pZi=qKG~kk&N%Kbqz#rhp~c77zy2rb%aUmPwx!7k=T~d;V9UG%=*|5f zKr@OWikNxDeu?!sRJ|E|{QF+@&9%Jx>#++F6rVPKx#WRtT7;KWTe1c7Q&pd3uqm|o zaYE-EIvrRq44Sk1^{rlPsmQoA|E{i_)px~%jTF)h;s5@z z6@;JDvJn>h#q0*ys|j#pPzTDt$M?Bmgj*S6s&qJX8dA=n@csiHF z+#B6i3F0CW>7iQ2N8iTz)PW&f`FZi$8sqOhI*HPc_uh5;hsh0pYTxhBqly!s3PQr$ z`Ba0)@tBQ~dnvgqkJoPa-23*e&Q_+&PloAKm!EBaFU?Pvq#RZ3{rB_n^WD_VJz|7n zSLj2Fukke7A5GmVS#qAk!<#84TLfg50mxYbG=nAq>9F@Lz} ztOw)|@2WNmQCd6_$~)8PX9xmJw~Y|grhOvU)`qKrHLGIFJsG||R#kxwOzc<^Z}Xyw z7dQ7V(*l@R(La6b&pT0w!D_Ztp!Q(7Gh@9Z{SdHX3+3B>PgtC9(O*Cy*GN}z3gc&J zi&IG_TSQ^(UJ;M+*+TYnH8;}@dRJY;NO(W9~-ub$$^ ztmJaO7@3)X%{nAOsjluhsdeT^HCO@T56tBX-}nwi77zbh0}aptbX$U?2opAea#%j6 z(KAyHjor1L9lLq$2$eTVy#A-~m>-P@AS|P)P$SA=u!xb}N!pbPG?$O1Aa zt{{~Cq~&*R%0UOa95HnOtcxR);gdy*ZJp^A?{Fra0VyFknX96L;A=|8iXda4L7B4^zy)H)M+@ z0;F}rLd?AcFLs+1eIJRv5{RMIf>kHJiy08@t~~1uU3Lm_IXB4Ro>F z#V>0UZ#efgfr@;5^gvz|c%dZIZ$=9`qGnkpZ<8=^*!47u-d@Pj-Iq=}eN0S%J579= zg&S+?J$hh%$AdxmMq&Ha7Xh(-FP66g33;zSLp(4PgN6gGD>cOBcSa|Um5QGHryf(U z9ewC})QEej_#`jcj0039;b^D#n7|VjR0;w#=t6q@*P>5N%3so0NY^^m3kbRQdifao zV$b#si=HPwPW#Ztwk-5i9Bx9Rwiui0I~r7{Z8}3Pom2J938&tM|fKn=V@vN1L9w-nOPJMoY%zw0>-&HjVx@f3lBp!? zK$E%k7mKzuwlJrWzyt@D)o@azFa@pvNZ$6cQy|`HV=Rh3VtOxyMwcAjIK0q-WcWe7 z?Yd_kYof{3xmv3c%BNnC&a^>xmVEQ9zBGDA-}RX&<|0Z@s(9g#Jqoy{9>g|T#!2Q% zS)hYuwD`jDLe)zf4^3GCtY8aal9-Zog%~yf;G@WZObcZidJ$;Sy?DTrfZ1;6m69Gp ztou*#7@B;)t(oa~(%viTKN@}JZ!m3{h8Mc#KYVu0Bav(O7nD77e?To9^_Mh;q1}mz z5Y`|m+Woc`FE^*i*pZM4AtFI@y!FktyH?pC9s==7RYTdmxV+;uK{WJe==5T(+fhiS zC))L)qD(ERN_U7GNG>=AAJMF#cx@2-Qxuw_8KclLA($_r7Xf^0)ZybJ!|dS&!0xNE zh=eGSFbD$Coklcl&=W>Cp#73=O&m*er-{ zp-W@99R5KRCL3u?fVG6~Cb5J*;m*xzN@>z^I|N32K_DJH_(3t8z8=hY$g`LFATaQt zIodw>)JFk}yts6~soY+k0%fhb=|-Iko;Ocb)&Ye6+sd*;P~{x(G{rG-pnAnH3VwQ* z(t`j1)h4V~05u4L9Sj+S1(m?5a6!mryb=qO@}O|)GF9EwMZ&dM>WSFjW@yG1-=0vC zO0gFewQMv$!HwG7zp(Xh?+orlDN+qSgCfECq>hIEcFo4L8sy`?e;r&RwxrVE70_x#!_ZR_Njr6rbAG0PFI8V@@u)g zKO42aFfwNu>54FETEx*P`W{txO8&)@2`4PMA~5$Ndh^k_8D5yCN7M&{c^{)u9!{}%Odcjzcs9a$vh+b)2NPoIHdwV}1VT;mNB+A7Cv;J8QZ6F+%i?078h@|i6~ zXZ*&$P-L0!$)%XsbD6sSTemVh((qYo+6rugG>W8E#K#VlV;_2(OA&an*{8RucqtRv zYOYk!N81bYv01i9;JJyuC%=X_)alN1&$5p{2)!d`#=hykG zM!Yn$VNq+k<%FLhB{t;RfS1>^!SamVzLKvF8mGVKyaQx4kI=yuMClb2XzxHN3>jI-Q;y^qA za?i7&Xp06rmj{X|npK7>*W}ao|tRAC2FO0tLT* zv^za)vyn4t_UFuF{K5O{P!X`lM~3TZbRg`Db;a)qd08p>3t@Uk2$sk9H$RwT^Gyt{ z6L=0{v~~Kn#sc;YQ$m?vx9abf^?VgVdEME(aQblK7p8n;`}CHacE~MPuGnG*mH`^G zT4*7W`PW|?>2$yu0uQd_58k4)IF z+AumvpD%c_q4B3IXJ{nb6gH}Xne3_A!B`}>cV$nk%MSWbXkt`4>#~=1er#~>_A+C0 zY8lfB^gboXaw?zD@dNX)%8SsGu!WzR9XP4xY{gV2`kcJ|^-0B_3e*iUk9>v=KCo*0 zGL*k8m~X%K3!8V960SwunK)Q5?5cz=xOECOk9sTVe6V@?`Q+M)iPHjkA9dKKOT1&z zjU_+vhK1O^s4R`1rDJv373gY&Z5{JB*rq!X*66LI;F)z)cMBhLL$wgbYZwlYDTbwq z{ZvAd+n4t4bLLD2+bA3Sw&is05#cd7f>P~avC-*G|L&bhpYuk}HCq4N&fVQuP;Si$ z8g-al&9ndP%3y3mxOoqC7tf#dL?cMb=v-gJl$Oe=%y`kTfaF%*YYY7+{C@v|WhZp>YK)tObK=DKFN%@3*1 z9)14U6qw=7rB4|uhXDBgsuMf5|2zK`^{`nCA?vD5>9qpK`%d7RNHpJJws$4g`@f`R zIx-y-Q<^qTOrr&S*bqZ-DmSIQlixw9%wnw{Dryv|4>*#tfLv|My1j!GL#9JAVvE`z z%7P=x!S89fpg_gibhHba;!mF1szxjp6}h*zm9$%k{?6eY&YBmLaH05|XZ-b-Ro9jp z%v#La*B4TmtcLJG(m)c2nj*nVTWrJd@AG5dJrKT{wE(J{hR#;xkdHmH=@zIyY z25G3i(ub7u`;9D}H`vqv*-Du4rx%~lACoSt$B#XS4=X`kat@Q>4JJlO*4P!OZi2QaKZ^ zpuzbL*&!07TFg3^F-?ItyT|B^tbUe-^t-Lo89x!SpV=l5oQglY(JYxr9OX3Ly=uHn z8~>{3^11DDz@#v}PTiQFYK5v1-0e44uhaRajpgLeN~c~>sh#~=kYU-g{{R#6qtDJ{ zAEet1Zai12#ot~XxH5ZX9@zW*)&crA`DexBw7u_J(A|w6XFI7cDsPQj><%SSH;_5tY0a6UVe+aQxTCQTLF%JLCyNj{0F)5)vX0Vn=fbUEjbqq-D>pD#RgVDntw zy^&86%RkxrS@|cGe5d9`;uSKws&kg9dM~HbF?!CR=7V_n6pltsb%optKklG_m;zt! zYNv`1#w`G;T)W(Wh#fTbQAc$v8_h%TMf)P)6B$hmdX|pfiyc+EGCvij1JTE3!_t0W z7s+><>iIHS&H$o21R?(0IWhj02=u*0;UR5oSUm_psENk(`gY*=m=#&!PtHZdusZ44?p9KDlp@U=Y$QMj2 zWSkHL%pc`||C4w9kJ_?vS|WdNZY*2>^|di{sxcb3J_Ioohf*}>Amdy?C~~L_ls>VN z(x+#iUsuGc#@G@)hsO0}q73MGK*q7@e zC}N0B?vHB+I5nh?xd{Q6hK$pSu&l)}iO|IwJV4&?;AF&4-_Zr_2gmat6+4P1{ap8l z%6!5~@spp`OlrWawQ*6GDGUH`@P)%JgUT`G^iW8Nw++oe!`$~VMjHgA+E+Lt=NfLM zMW<#p<6)9e?x+U^Oq)B`dY8QeEc)e$3JfdI<#pXbRd9ZClL^z%o$z+bJ+ijh!wgyV z(fcXvY+y$-K&-awZu{0QlrcR_K>&Ny5|QqZl?%pulk(J5wG`xfoY^S@bp~CiqOOVb zR7z9X2SOo2M^W#^so4q$jf_$E`fjgm*XpA^{7v4w6T@tu`yYVeUojwKI3)p_awMaF zSH-MC@uPO9`J`OMx`cFEa#*`j`==ol1`UBzsT5*ZM+ zo^J+9Av9>?H1b~G$>+|mI!TAmzsZ``ByI6>-dIqh*I0V2ZaRS_t?I7X#}Vha*7Gc? zpB+3i_+!Z?_-$XGiLzWcIzOYHQV-Usn25Ny%*S?h?)$RX3C>PhMg7JUzB z)0gJ?UT0mNz36d@uO#e~@A=<(*Hp=K=M%}-a*c8ac2lnzA5d@`6T1cLwIl?-xCs>Z zCZt^ybWh>*u41m(`ga|UaVP2vjIuu*A8!~xJ+OEGXH1pu($>Uk^KA;XA#C0h4EbgJ znc-Ox4b*!bglc`vhrTQ3sdqnZ5UN|{oGmH-DgN%0&P5_+cL<^nC${t-AhC_pj^-G# zT5#)5$@Pj)96$`3kn*I;+{@5bzbYe=%EUN z()B`v=6%d!tx;TU-uBzdR)XV4YvIak4hkk576Y^jTLvtlJrC7 zcKX7&<2L?3D<{=u_UqQ17q@bDC)CRb7FGd}J4-f@L;@Eyvsf-svooAiI<>M{A{3lbs7j%#|8G|LR3tp0Pc z+ACe5f;}aZ7kQq!zqQ_u8Wi2hoT1eWiH3A;Pwiuc;ULhoO|13ULe14roBn9$alU6Z zriu}T108l9%>B65aoLD>bCb{H#?NRQUk|*gdQ0^Qsh8Dun0w8yi!4M5MEK}@SZ$LV z2`IR^j_-z}wWEsy9{nP)OWPGIU9bJRxEPyvaOZi)*V*){waMz(8)J~FnJ@h|xp8&V ziE0)Zemw)W@;PV@YO{*<(y$r%A7@@!m3>Y;LwJkiupTa z%U_g&wiibTEqfI08?5bdaQOvwiKVPxbHRoOP{vw|g zSZo8QtnK6TJnMHPFZoGO*ej*u@5$}vvCHynpGz^;58m(NLq`~7d=bfek}zM*YK4y~ zo28KlZNr6$6+jAKY>dWye1sa|ld?nS&EsU>J6~pU`y|f@L%A#j7|)!VAqWJ5R2He9 zCRC}LfWwd%&*O1_mM8Riez|7-H8G1=T{~dKLxoznsWM&FRk)0w!xWX2;p7zS4Gx={2Hx zbNcm@nPziKktVj7InjW%*rb!4uDLIqo%(YrlhvKYAEz}J$~ito2Wwc*OpDQACLuap zD0f{RD=4qp%DU(C0z&9SVC1h z+2}jee_80_n=DCo#>`v(D+RzryqbE2_>zO~pAEL~WIXk=Q?SxhVXXSCxeNjCVR4V8 z5Le>J_mN*->-@4lKlk-0@-(q=;CGOrDR>9=jO$_geL#;a>QMG~xTjySt}%2jKCOQY zUzVXanTWI9wUzW!>xrnfr#siMnR+z80g+g-5+~s_1LV`{LXh5PqZ#d5%sU5RmM!7e zn?pPTgxdn82H)L#;+kyf2!FU26SB1)f>6C4Ieq4u*~UDweeXHp(~AI{X%wO{C4^rv zYP^N7W$D%fJxI?s1t94x_1LU+tawjr;O3)}#>tX4>xsvAy1I|w1vzujj}evtJajxd zRG~p#A74K&qz(?W(X)Qal+W!;u%td_e7V9~+{o?oeDF$KQ#80?tK{0U?k{p>$qlJf zDi$UhxzBFD26gTox^149yEpy^pi^R#%awiPlE=|1HT_jYp7-H{{AjX*ztv6<42E}9 zbDnf~hPjis4_MY&O5_vFvmeh}ObWOK`bp!YGsbZtRnv|yyqbVel=NI`We8GFyrdCK zy(s$0(x1ketD36Zz6@7D!`wi9pTde~PIRee!i3{Nsu7(sh%e>&08gDd9x513?kHOU zu3aQpD*(q8{c%MkM5)D;=o6zh>jljv=`3&-qGM81B2+GT2o$YuLTK0OYA~bYFwUfu z?$PFYudTooHY`JDLP>NBvVF0_`z=b;L`vo3cm;d6_~zi_v)W#b+;$@C-xx-;XG)=}nn9sO+|6 zX7Z$Mkzh2RXc~Z@(jV=g7BZ0EOn{;HV1SGvg4|s0 z?xTRR%D{s9QlBC3Zc4!v<+i3*{BMBG`Q3QVQ(oh#OrsO6XwWnS=(9KgudYzFgXY-z z%~YRh5TYGELv|4gR4<I_!|e}Pt~DS{{gm9>`blx*g$DL zsXIA|S3$zH%>)nM#<7CGYbga`qp>bqle$Ya6he&-SKrG*489&s0Zl$~M1JesLiMRw1%{Tvf#&etCBArD&1-nTlE|fqK9OUB#FikGm*RyZE zd0Kp2y(?JugD?6@X7}fD>Frcc<#%?|GuBxL=)jT6E@2RV?R9P!Cw-b8jq$HngS_%> zCt-X3o%X^tqj&Dv%qW}(RAx36#e;yPMC zH~#V*p^p{F9Bi|mZ%m_iBUeo$Zhck}o}O-eEm?w-tb6lMhpL6{)Le${^ed}x6F^29 zn-a!{QqayS2^ZYGomD)iQt^K3#JN+^Ca3va-?j{s?=T=rU+`VdW|^OSlPz9JJPXaP z+~e!HiK}+wi7yVSw$l%I&OkW=hq+sQ6<6C*$Vtj0OWco_ zS;n_wmpx6JJG!u}eFpHE`V^h0vKrkGs7%fxQfc zMwMk$zH|nUE|7WXbV&cOs@YdpL!5b@^I~`UnPQh<0b96lAUMaG3hRmYr;|AT@9ri; z2I=VcA^-08NU7`}^*l(?=VowIZj~jGE$-bF;$U(_#Yv-S3e?GaMLFxE&OH)iyDvnn z@LTk#zfUWc&*8*o*A)MqGhjwieK#^y`RGq&aD#>8{c~8L5P+rZ{jBb)j3ES%x0k=H zmMF_|-o5kk&uUzwgM%7IOU3k`i*{EKBY81G7j%+Z_4JB<*FKRhelyC$@bhw$)l?r9 z^H*Aae~gOpRNh75$xrh8S^ryGvyJylYxAWNA4uZZ(JLfoa#zWXFksN;IMJ=oBx4lk z;WV^uxk;{Rq`GnPA7G&Xa8kTrkIH+J=3VK@XP|#@qvfWaKg^`}CZ!QdAdS^PEuH%< zMa;!dk|f%J<-)g3^7;nGb`oxs7g1RsXz|pH!O7UqK%LAa*BylO7^L348QOZ&B0k$< zq*glL#d*L--z%IA8#_wQ)H)RMv44LyloACg&hE$aO5x5QV*%x>oWO zT&tM)M6fLo5RFoON(I~C5zIodCTxL9M)M?n&j~q~iMBYBJ4aRriz!Av%?oX1-&eh@{ z4R11N?_|{tR>TQLTZnU*zp>rrykIXoHoVMHx%0E=;>m7XW7Ya3`08h@!S2AHKcRYG za$S;rnSiCg&ZJeeEjeDet z)t0NMimkj!2yeuKB$s;|ol8}anwt&@$(n+bcpr7Q|-)DU)BT3?c?vW$QV^=RbnaMu5Hw- zxq8DCGB}AyUXR)R-u{5-WuyQ6=aZmY5d)t$p8)9N1P+#gtoy}F)t|!I<}dlWl0Ujn z-p=67a^+b@UQeC*ncli}nh191CPrrnD6QP<4>xFQX&pXv_wqJ*{9g3nK1!!WAfAK= z6f~1}qt_hBJ99J_Z1bu>``{d{-PAbe-R&Ijuve||Gv3mULO#V|azXmih>rdiKij+u zsgpu7#4EUAPV4uDPWANj(1M?NpN9Me+(~q=jHE?r@{X82 zXKTfMroj#$xwm()fNuc6McXN1MLFW|w!Z*cVnua-^eGTl1Hipejc3x9wZBU%B}>!}pw z2xXB}fop{DdRSEOOOSGpe;OzJ%C1D~^d+h#IvvB_Y`lXGpQcpmW`HH@kGOOCw z)T5shJ!K01IaDcA8y<=X7eddC)NL8^$I{J5{Z48LY zzn4_8oG}1EL9dn4IpKV#k&Vte4eqVTj9v);uJ2)~#dLeZL+;+|RP%a>6>%9RPV7ob zYn}yx`o0I?mI#e3PJxo5WAO@^LM@!J41EgduP3RduZ*6V)Iw~-yAaA9Ydz1{SqJJ+ z4{i2;<=6vEXvs+c7!%@ zO6wvrb;nfA>40KrtO2h4dAw{%587JMVCky$kV9nA73g~0$n}{Z?*FgFM}$yYeDMlB z)hH%L=ktU5Q5Tl^$URDVYkj^hCgR=VSO z9Z4sM%55q7cW48-4|UVhL-qxLUVfHf zi0MNiKGC;xw=UcLF%!JFSRr6q=n?x381)*q0&qdx+d5oPUV{U{Jv8j;*udq?T%h&ce*B=ioa7#5W}l7W`g0PiZeDTiFTpIVsEqrh?3g80E5cTiG(G88LR z2Xi6^9~%i%#U=y&iOdlndkGyKWRh=zNcStkR8L1|ZQou;JNSr%Yc3^$=|`)y{iKtg zC1^=5m+R4MR}jRdTd4KKLw$#RM}O&y)lf4n(F-{05Q6v?fB^ptG!|FyeH!FjUj^R& zNA#V-eG4w_TnyqTz8HF7+ea(8lw66~r04J|;pXN>VtK<@M3_21aSjM%2%5!N82L!) zuIiCHmT`x&F53vv%6_)k9vOuLOq8ZNH+TBlI2cbZ!nvs~AR68bIL#V}T^5(3HQ!WO zMexlk%WD7n7IgmywaDiR+k(k2UZ^10LGtDE7(sGA(n zgIymzT)Wh|OKh~@4%kQ`QrXJ~I%x^gx5?h{XCS|M)~01Zoq& zKz{Ki|Hkx20LFhj1$AlLL3ed$%Ku9uXcy8G)l-m;S2Of%!=L(Jg?_xD^Gf&e0~hhI zH#CB2R9-aXriL_G^sek9qpHs#&v=;Vbps1p<*bm19zQ0!jltkjA&3!YdOU-gk>d7p zx-JxuJOMa3O+OnRSa}+Br)32o#yAfI$YMh&a2qKvlkAGcJC#3_p!6v@Lrna>MYiRC zb7x47pT@cYvSIRGZ~ozV56K^DdJ7OmyQ2Kv+J{N$TRulDg@`IV5Dvol6jw>7ppFKu z20q#9HN`?E5Ozgmp&v9m9)!hkNMw zlHonM=X0k#IftdQ#mVGK+uqoVjrlu4$B%wXUT9W4Gul|YSNXeb;zw*>T2rcXJa|>b zMEY{>!8s*!QX9+Dg)s@QZO>(#G~47|i6!-EKVvhT)L&&Og#(AgD+#hM<8o4HySLp^ zWqs1g^-a~NPQ)w2Gx|p&OB_|g`)S(aI1fw-FJt7l6T_=(n%+eh!n^;vNW?8Uy1UgZ za`gdPdV;N#+Li&yjT}Zk=XGTtq)sy}A*9r32lh|Q3EPKZG-IUEsll)M2q*VDDdx1- zth^}nIRFK3^BLEEtz9YX{`oBY+VGF({hGe_x>cI$u<|a@Q%7bl)Ugt;k62%u)K$;- z`oNbsy5Fs`#f`6S{hFR}m|DvTO!a*_mCf@`RunWDZ=p3EDAx8DxDsknW^K!9=qqlz_D@Bzd*1YO_6B2HKV8a&&5@@;@#%C?Zbm5wbj?Z)imIn&RtK7FX2=$6VVJ_T-tNXI)) z^^EnB?-&1;%5b~g?C8k6C#3;O@*@w@Va9)Zg^{-xQ1DZ|$xq$t;&O+B6pKYC_xuBI z279YTXHv^>Xgjle_2T`fk(EKbqL&qs+`)Vnv0ZJ@Z%vJV1oOCF)TbIW<77rplfg`! zNGaW!KFR?~w1^PL;7QPN)LwN`eeY57%|ZG~iCNA(_mb9l=uQ06Cp5ue$z8-I zION`s3xmC!*PaWFb-Q{00ZKNmzuJ8BW3Mk2mi|FL7c1P6;ma39kJpIc>$GS4^*8z4U`)}VVg`+pRj1zVF3 z8^t$jbjOeZ!wr#6kDXWb(n!Pq-TMKS z&-KK8pL2c(MP>4)IQKbOkUf@C_Fj)ek7Q&ld7asmGTj*n&9bQNhbw<6Oh@m1r^3b` zZ%V9(lyd#ZtKh~Mt*&v^GFm9NO%!^a2R?&h9-Pe>w@(LamJQEvOg!~>cm10l9L;=N z`-Yvfr>A#cay&KIX<$3luBb)2~iW4%g=S)(OxJq&}Ze-ENBsAR;sq z3a3N+|yVjO4cSxb?BH|u2+j&>cQ>kSA42P zm82a2=GlL8V~BgV`FyE?&?E{or}A;j+!b$2g@Z6msL;MZEdNZf!s;KN_patje;c0G znLYHN`Aa6rX@imuZ^N+d@{sI{$LvAkb^k7INx~?m3UY2idq%=_m-2;dSr(#_50TQx?o%7jdi_L z*}gUMLT62TJo4Y0JCpwe4;W)?Gq@CD)qoU;IKA6tP&Q2w3F?{1H%Civ0&%}LO)9`d9xk}hT~%3ryI$h$3v6QfkeLBH-IYP&-DdP=VJ_u0}DL*ZxDjg>j>4^odU z?hL9l3uE36dx=VJG-mjrERY;d67kgg%A->%PFZve8nW_ZsXk)mwk2~*oJ>2l{D*5A z4{pl_xYYWrVxF*AI;>g6-0)0`XBl_22ibZ(>UXLbG~ZW`FCrvQ(W{J<@QqMe=E}#?*HiuhO}M-#;F#KY3n{mQaDaR$Im7HO{2ympW#PJc z*WZxBA4A3W6z%3k1@Kk$c=Xn)q2-EIZ?GHkP5Mtaef2kR4}EM6Mkd`<_I|ZbPyvRE zkhCV}FKR1Y;x9fL zO}h)UHeISkr12|1!!#St@~c;Pr?KrWGks$|d$49WtG!0!T--fn{HxDkY8PMM5n;wv zXm8btRKF_nf!N&ZJAIvty=9ca3i}JWrAjYzLg34o1>@Q9Ym)w0f!E;NbOHF!_FyTu=t|vo3I;fcZJp1G&~)surqu^+^%nFk_!N?&H+tapysFVUVoE0Cxo zmZ(Un`zrRt|LT?=+KPmM{Ew$(efqO>eLJD&ov2iWoR92oY-(bSh1ffzOxMwa4yURSP4?fFJ0 zx=}^A0qcb>?4O^G)&~kVglk;+C`Qe&9p8c5+^)#y^T6U9N0_zfI#P1-qap_7?K>%V z1X7O30mMvSU=Z(c3h@y+0MRq1Vs&&r8UHS79s3^rMJAIv03mP}0mcNAj=O+Hp{uEx zTE52mqyA*T7)3}z#t`pk?$#kJ=Nyff{7v^wyRQ@xc#}^wsN=4VS<&k37L(~%k$#s% z$0vEKL?t(|wn^|j5|tcH?OT4nz<7or{3iNeW=d>HbS2LI(EAhqKOW9MzY5BPt9`Qrb#EqOj^=oHr&lMtn@byW-fq4> zEcQ8!82h1SPGR{j28L33&m&D=TRK!8X2(A&TBgQx+G5JA#Ub9*zH%*%(WTtDbTqA> zy;IEJ`Q=AONO&{hu&;+&x={Pdp5q03^jJ@3m9Eqfx3Fq>38fUbhH-2tJR4 z@MwV4m2{=cU{LJ9go;1VYA?;EM}JWcF*FV;bvYzu8JbT{r6tYw9aCa(0)RK?Bh|1M zH&(T4Z2is>w2vc>DEr)xG=Kuh7=xVO>w#~{*|Ph6R}(46<0I&`z&$&W8WTisw#+1} zgSQ9xzBxS+&*0WgU~Pr0;Bg6ZD)D?7g|OG^FQ4|?3iqU>On7FOadLtYGLcF>)9;Lp zg{PD6ECGAmH3UGAI5%IEE-ORE%8JKt#f$#{@7I!u9}%tG2KykJ+yWQ-zC{W0d-@xv^c6S+`y2?EH!FbPX@xHcNroZnKnX7m4Xu@2Pa;Ihbn|I|HBy*7*%knJ;h}AE`CB+57eHD=be*%{G(9xd zC3m6GE=Wdy0fgKTJU8<{z&Fbd*2p$A8V#!-3)nmhG>s0nKl5?Kg)pD~^Co* zlD|uhv1bYO$I){nkNETuHp60gplvNvUs}4_COy#OabdCX|nCT&pdqWi?{th+o|{6IG< z#K)86%-{Lfl;zxloAowiP1B+fRl2^Iv@CSIt1Nx?>_DL3iYnN^Vf8-%+XFwgcUbE* z;Y`}8IT%DkqDoEwwGf3Aa0`f={>>@%pQ#l?5DT2YiW!^X7y#;W8Gm{Ol%ws?tNK9wGo z#?pvjwFBo>gF5FdCigpqbkPltC-+TX-R2OB#&KE9g-L!yEX^m5&fdE)EpmS8*5cIi zIb@ncLOzCpg&BBk9q2_#$c|Jn#fHN76KYqt%Lcx8^|WXnzG|bV{9Wkl8I@*$l8i{y zExcgZFO3gYTDz7MKNd9{yAghO)Idt5Y_IS*S7S+I5^T$;Mp_)ov3*ApTiIijun9LPi`KtSueEc^eQKy?+3kOof z6TW%rArNJU6aYmV7%Z`LT}wJDQhLEd3ql_@?)31GY&c;&ynyBV@YnhUOa;@AdhF)Z zl+cZ{hQ+gTdmE-@@KHHGtT*UQ;6(}rl%Z@ zH{`W6%R91NveT{3s6VO$mLCTsf@Oc?&ReBf{q2&HG3suUHXrBNV7ePpq2pzPSjla> zM|MH>O?G-<>{I=9`=R>LON~uh*c%6aDya3!!Bk6K??GZ>qmuYTv3r!t6XhDPsdo{b znaB)-F$v8vdE!EJqh#NquS;X(rA`Mn>49B`)8IBdYf!e?U&u2#oZ;EHT+Oq!ZVUs} zA0B4uJM~WKf!7t7LatACF@Hvl4L!I+8V@3OG1TT#)g7rNZ0P)o`7JTz|e|TOEm4SPL!vGV2to z(5Bb)U`@QCtSwp~_7!J*oP^LQTLhZ;s6c|LJ?lQ0ACzB5{s*A1`j_(<)5D(P%EQB9 zs1(;OhcJGXig+ZNL?cD`!QcTnL13|eK~2HOQ)v9~>aPd)nKB=+paQQl09QpU*(ePu z`p_vxZ2rT7ml9ELvl#Y|Z^ZKPkhfqZ$;6BgrV2L)qGOaQc|1)xUT(#Eerw%;<;`X% zyG)0KEv?kLDfpA;Uk;_Tp*|3nX^)VRmG5}=_U2;N1X}Og1GhejkV2w{I05fqoH#cL zy5J9&4#6rvLt$5((^o3RXfZc-VmhbV=;q`^*zd>^ZXQ2+MgJJjz8*2RtbH@`O|FF~ z{6BkiKzr0x9`%;J#Yx#&u-M|GoNJY-!xEWoj2aTcRKM^4q?Nk&f6n1l5-=8?pPd>!EzUcgpwnR_mbZ+OZ z3ojY}nKUbLXbgN5K*}icoq5uBBR(p6F*_w!9+ykCkt8MC(~TIq>?8ae1A(_O z#hjeybpv|3xp{=dmrhCXO#+@9ckRvHj^uH8!6aS1;VaKwI=Prvd4jTKd{#(trTY$K z0QnjQyd#BoqwHiKC;0WX|De)1&*C3=II&%?`{?>^0>ACj0m@?-qBYDf=Fv*dpjzdf zt7nr$((o#>l2(u&_=p%57D(zVx0c*oMy7v(k;84v&&~W02x5+LCN8pny}dkIMe(vZr=;!Z+f1Tu58r9!zM|FRXVa_+ zyg_4(A7xI^>~R|YAN>ncyfFWReh1H&w^c|2a^adexp8f zuv8YA`uAOGSfQbq#moAI>F8ayC|=Rf*R0GKZr|kOWb?%68~!WNvw+n_;okIbk`p_- zjUR2CMJpANTWSt-#C(5ewhbUs(lpq4CC6{z7QW?+aFDY@f}E@3{QFgVa*u&eN!~wz zNjI5z$=>7@tBM50TsGgCrj|xOUTJn1(~`!Q7AQ=7R}I{KgeT#kUWqO zr{XX^cb_-`6CapZ`nst)ebz)3UUY>#Y6?+!n07K9wO)nNmVnfWWDUWQS3moL^{y+f z6bfF_hy%LPFf4$)&xF0ro{b=)+0LqA^Vzt=xwvJ?LZm(xfGWpfwJ7EiN< z<1;1(X^?g3+Oja4urv5LMsJQ6^HMi`Es^HzWA82g!CJcaF}4XK&!_(bOzy0->ezW) z^|z3iDA2>=Oy+vHc=JMGGr?+WX6Is8niWf19J)_>+~AJP>?!V)rP17SJh@Gq?VkdB zu@_GVI_AErr-VfQnn?a~MB<_;hdnn_yhsXI31vH*T4RX6;deURT9TM)QeoU;S?KBw zsj+W;e#=m*u2jJ^8mO7S<$S5U-+je`IeBm${-wnt$l~k1Y!gFYnY*ZXu$phOazXiA zg^oxTB~q_W;faB2@a-=WA-(Ngq^rD%SK2{rscFe@J+HFi7FT@dn?o0qu|a2nwdWuQocE9O&tSSs;b4b@jY^xMO-r`irL_ZS z_VqX8@Oe$e8`S`PyB~tIX2MB~1XTVN`N7ByP1K4w`E&pO0NVTa-xvQ>l!l)M%6_b# zeDYVMGe`?Y>T(xdf$G~=XZ_bBzS^4b2(-}%)tMNXU5Yd6X)eKPaqh2CI- zRO;`?DcQC*(frc^_`SRjyd(CA*!a!jyv@tL0b*B>%P zhgBl450kZr;668D#l#=`zSGlhjn3xs(a-8;4OpX5(qIw{!kYz2K|*Y86yM%Endz&I zz5w;9fE<-+_IKKz3TwVIo9`3)z;9jZg{Pl|C*){IFXP6!{7=mf_TuiTusP2>^{jMC z7xng(Zd>?^*{~OYqr9{C18R_W^+CfFl7kY`adnXwpy4Qor7k{rGk^@ z2GV<|DMv%7n1zIH6G4hlkO!AGDI^>Si&VIbTPse*!_yQ#h7f|k1re6>UcNCl{L97> zAcpsNevH2%JuKA=JQ`qqwxG4`Qt3=@Ys31uD)i5s8LzT;HW6BkaFMO#s*hu%la#)X zB}E8bQj2}ki`fn#_{|8VULdjkgme8wQheaEhe3(e$ zWJ`p3QmQ9uf!4==5C@bNc8lk-M@`{wl;?vhp2=fM^pt42^BDyRUEj3Vto3BJym~IQ z4!<&oII$Q|%wR~^wGS*nmo1gzx>!9k9DqYV`v5SM5xC-+ zx4)4w&YKz`=#MjH<}TU;eBBXv1MW>hj|;#kiszO*`AM{4<>pD$1d!Zf_IfO+L=M5) zMjks_F$?e+B0#-~wUpfgT>>ip2gqExXSttF-^eDRB)Pt3X_D@FXd9};f=We?Wq$uW zeU%jQ1ER8wb5x>KI@|L2wh_&Q!s@E82-VL+2R$#mlecw2@Cf3nCt?tEk4x+^6>E4D zGnF>6AynnAeyIQ~d49i`OsHPN0`o~SxibojZ(fav3ilkhJmxN};c#5Mo|K;29P=+y zNayAd?txJ&1zdH*bmMn!yn2R((wMZOedY7gJ-9VX5PK1yO)4#}bJ1e5Kc<#la zq;!O7E9Ro?lT>JkruWP(;&t;RuB(c$|3Gbs6QwZm;gn$8+lt{R^@ud}3J<@iIy{3! zZU*kN1&U-6?otTK7LI|Dy3;McIUQR2M84%o#M14|=N;V$g<38Ei4T8cAlN}g&B)!w zc2&FN#{rqP=Ik!`yNfxQJ4xP{$8`mtqUZ8DOhoI%PW}J@E#SpORSl(0Ot)nlo`BfS z8%x#_L2waWScK}w>K;|LcU$SnFae}xh8zOZ-ZP}x`@Ov6sYdMQ)90#CQ6&2irv7An zExZhn@Pa2#baFO(;5okRAbdah4 z%TsJYGu@USJ6FIsG%-sg@X`xptjH8isDo>KXCABK$yw!!JuK>1@K zUEa?$PdwHENsvq$m&3Tcb}!!*yzIhZV9LTX{uioZzLBhtB72|W(!iY9%OYIF4{DA1 zBj!FR`Q>64?;TgX)=_As}Ko8|oR)_-v;-P0jq#pJr`yv%8X>Hk)7KEj^pG5hyobd3)LAcs?g*7(apZ?{6iZzl8iDfqcZE#6n7of;qs9 znVAxvFy9{JIgRuwiGkiFW6rO%UTM8t2t1L=VJPKYRJ=i)mhKse$KwHNV#d9}J>e#l z#D&@vONKt(CywJIIbs}%ztw{%2F(Bki! zJd21_ILKzgSbke9Z(E>R!A;el7B2&T1Cl96R#sb9kTt#+IA|0xwWzZ`T!mS;UKZ0N z_lGl5L2Nw8c&$8jfdCMQjM1wng4=VdL|PZXpsGtmQ=ZeVeKv!0@4a8c&J{sPLCH}I z$6$Ew)kMtPGi!zAybS3)t1Rd-=Ma{62w=IBGRoNBs2`akBGtcSI%-P5}Uvc$H zt+?WZ$AF}yxgpXKw5{5V6eBU8?usGK+xi0W7Yrk!blI)sF`nU9wMxW@>rouNDj2Zh zoji10DiJ?ipXO00R6j_dN|2i)NkH%R$gMkMPsKpEl-=(p5kP9wq6T zQ;q@V0Psk)*Zw=lnDsqX80j^iCbyK_wNuBUPFr1t1}@U(wVv|CbmXK6?L1Z&!8gs& zCuLu7_gxBc7OY{(`<1oaY}Osx1uA}H{-sDV)lZW@aj!@O1Ylm2(g48;8-u{_rqQ$O zA;a8^!1uVhMJy?If*yEK(@@fsU(N_5q&+q%rN>P)F%N!XaAQD#$_d@)n@<Il0QpGu7`c8p(Kzc%H}f8L`}SNu5te%MxQmQxiHN*WI0PF%Ir z#MJ`)?d@)saz_W}f|RC{=f8+}{Rd#OhXAw}7@q8HqcPvkNHOUbePQ+s0k84>JP6Lr z7wFeqZ=fhvR!)KXE28o`zAue_M%1>bd^SG!ymgm9SyQ^#SqxB>|l{0J!Uqi*r zsH?tnx*TK08f?m%m~Up4a{Z-#uJXI^o<1+oXa&VVso@;9 zb-prt)YZ+$zp;-lt|%xxz=G1EyVK4AO?EO!dAy@BHaIt?vtx)GiklNx*2p=aby$}p z?>HDl;I^%9U8!8>E2`B5>$ja*?JuL-)5-p)miOK-kQ)qn$e%gN4%6er!Jbai$ z$`lb1*==}+S+UP42o`TT%fVT3`3LqQlAhYFB79ao*X{>&cewNgLLPFOmXWcbRNV`j zL@B7M-{OCE3cFX1-H9*GWsQ3w3T9sYD77A`0!;{Hl%lL*AVM3&#fYqc12V}kFAM1H^=G9dJbLh*cfmKhW#j=4CX`YUSCo{TjLTR5Ieo#P#s57>t-? ziHd5yiy+0j^7fxHE;+dt`1j&8BdXUE!2G$-3p+HdL<{Gt5BCy<)Ub+?TF~6u8>SA1 zV@GQq^R$yS8Wa8Qwg*E7n8h(F%WQh`fWO_$4h`)cjqQ!vFrD+;ZJ%WoO742lk9wd1 zQXvfHrX}-N%2WJ0Tq9bz=FiJdpNo+6emK#}0u5_`uV>{HG&yMoo!`0Na$*|tbMMF@&T{Uq9sVtf3xeC2%RA#v$<9%G2I>vVWc$9~SIL z)7}$#d>&1U3|>*4k8FhklrH}LJIrGWoxBlaDFy!dCCTn15nXJ+qSfLN!BD`T5|95I&1rK4ZcPal>@F31GYk5>oVY5eE)#_V=gMziybF0;`X}DyJoL2=0G>LlG^hgW$ z>VaRM6@#Km&FqJXSB)(l9d9E&d2@dy6WI-F{B;1OxW71s7Sr&vBa5@HgVzLueYd>T zMN`#D3pRe#8p{oeU46cDqJ?rBk}>vRhm;2Ov#sQfCD;DX#)jFZ)S|KCr)#dX(to70 z#r(Njd~1>+OJ0I__$Ir|@wE4SyTmI`eTkWFQT-q1* z^U7qd1op57z4*5#S#F z$_;7FxF&fVf>66csZIFz!6)E3KC^_+MqIbYfJ0~ ze4hCpq}4~OGIB?4CHaEy|D!bBejl!-53J1ihZm^K=}%*Dz)zUJQaiX!6n=jGT?gE3 zE&iId_|iWmwVUEMT;@l+cc^65f3cJjR_6Hq%iNpMLn=0RnSU?vw$He95?e24&36H{ z+-4}>COUf^&dvg-ns}bGU3f;()0uT%!6B^D+1fWdBKC5e!(Yeb*Ol@T)6~^{_>{;8 zp2EW07FcYxJO9MfFM^5~ZLkDw8*jkP>t*Acf$n|1yqNz0O*657gEf{L-Etg*3g>lL zFF59JotTZK8_cQS1ddZbOnC_-xqmf&I7pIuRGF2PwcXN|xfFnZ{USRP65k5oK?7KU zXljtthPZv#^e*S*+)BmOL2rFyt5rI%zGrcqTSI<@#S&QVbStK<%-o3swP0y!UgzLv zBa>lFU7^HAjO!+_836zQ(?5Paiy*X0Ltc!_+iI188}=VHe|OgR|Lu0USDHEU7|l#9 zn=LLpf2@^kNp}`7QrCKff2)9hx^%E_g*mtq|Gd}lTClXm5W@SL-M>1rzvF#UZB|QO znv~Wenk?a8lXz_PJ$DANln@pSdC!s9?Kh`b-8Icp^#>01q+m2=_CLT^tHIhc2S*=w z9_>|bo0lmD(T#6vcK(tXXtq|3MS5kv`nnt>=mDS$4-F0#2DL z_I#m=X;GVeq2iZpDb_dIQ#kxx#}3eocr_!bw$gh;^rxn^INSNyta0CZ6~vsu>f|AV za>G!Q9u4v4_$PGjFZVb5nZ_*jI)Aj!$^IzpAo-QqV>xdo-LU6MA~*8^?i4?;el8!?Wq*9n;>6 zf7x@c^A7@8+m-t7ER?@GqEKtu&5qhMa1K@3uZ``$b7|UmRGh6Un%|b-oTRI519k~# zI{UX~|YHNstizRxy9Gq8?Bo#4X1z=veg{22ZmXc@x_P2ZP%wOsZ z+)`_8??@OBsrJ!wbGIQz7ny|J=5LYgB=?r%vjzQPm0A5~`ZsWw3J<3rnlx9xJvID2 z!d*8=62I=dp7G8g_j#hXh1V$RVKq%r#I%eHZ(u7-(fSw@h&NMB*XtB6n_ueT?)>iR zspx@yPu;L%$M4~#MhqYznY}kBwk4O%ikeyGpQKBC%rKId)!L^!|4lcOl+Ob?x8s2W7~9_xr{$hV8kN zywas@Z_(n^rk{Av5g(cPxZ4`KD_YvBWY*09I8I46btT^2a^jzomG+doxaiy8x3+f8 zf*g{}2Ef4IbzroVn4XL6xmcXav;45+57L$U6J1QF+p}e>_h-MvvB|$Yd(HJRfRcX5tE$aVPa%dr z(8eur2A}sX_|ZY^4UhJktAMGix(cW}cK3F3q^$d2$G7-+%gL2+>VR<~i`};#1cK7u zd_C*v&1=A1$)ENr-<`NeL#2$U9b|E+e9_@x#yR`K(TSY8=-2L?L9C9Tw zmI1Xxz8}dWpzN3tBp#oemmu$_^3qUqI(bS-v#yvieQrY1<$9;j!x!%0>4wj3Qwb7K z68vUAIU+G1mFoHFZea<@g-wY({q!UfpJr|w)#ardM2qA0JToL@GaVCnIww1!f_Hb4 z9%%J#Pb?sceJ!E*80})kXHH_=iX_D3zBek^?G*uK$+5ZsYELmRP!y z1HdKuLx4A7gGmAIFpWv>BbKg&=ZAd+-bJ!N2#TRvanIP)n8(~natey$W2liHUwzEV zP77fiiLtjB#VEAf{2;bt3nIXr+*yhgO0CC#!lUW@N>Y1)YxLe!R|__U`>RD4o!a zdsg%qQZe|Ple$V5{Fri3$9pE63W4UCEm3G*XpHhlvL}Pd5X5E$x3fVhy>CM5Qlp-& zwfl#ZSJL4D_sA+D_&u^RG_OQR@8@$u9U^WXy}k8tYRIQ}j;lPsMd$c%q_QA9#u%Oi zM#joPNF+RfY^h~H$bIi~rg6b$`!_T6{KNI=KMaU*0aU>EH!rjWbLZ})k0g%r26NXR zO|P&l{0B&}%36ke13OF6jPuNI`u&Rc4AptjXgk8{KFr+K3jjx9EGajw>^ECZ((k7E z&UlzF&8kZsJOMXzkU@CPL3!pUwS@lwC;ivCiUvOH#RnyQeeETg{7V(R783pTnbzsz z^ft6)PHjF=aa!4A6yO?t9T)ayhx9>5)0sHYrtze6|NC`&*2g2br>3h^J1ASr#@APY zqkyhK!9rtaNt;-JWBNgv)A=OuV`kA;|KN}D@>?eUMe%)PBKdeWSawd21^^4LFWWqD zN)xv!8)z3!P#lo+*Cs%Z#(ArQNA_X3y?(vf?ZH5edTGn2Mc?gR_hf=*7k6xO~nbbSo z+bq0L@(mrd9o?Iz;ok%|mlWD%o70}nx6fXejrQxXgwfE;bI*rE_7OdBhP+Pa{cq!H zle<0&FWA*lS4rK&6;D5OsGV-*`=K?K0iG+n0k ze25XBL0u`O$iBW!m3YDdOnOMPsqnYDT|BKXCP-^TR&hO|2XqsVkg3qQwfFMPl{kGY z;~~m9B0w1SwevrK*blhDG_5U9=m`QnSiJbJ8X0OgeW1p(A5rp2<6R4Ne#)4h+HxtP z7BQiCFRZ5XS9?e!>g$or(hEUOFuabNK`(>$FwmN5ep~tWR3q5%KY+=%rmrpbR9p+X zP*eDh@xpINN_g9rW;rNh>TTtBV2<2~z7?gE~xT@UGr}0JD;>XFfijMO%S|=5WE{e8Y4mt@VCtorr9|Aub?D z@z#cq-uut?={0|Dk=?kYe}e_kW&5J#6y3z|q>Z%XBgs=G!0HikN~il5y5*G^xTAYf zzT?ufMp^&4{6oDu-W6Z9Ax=de4NcHA;c8zv%0G=0p8PPna4zfhd67MoQFeD+NE!oZ z20gP_@kPm~Gg2)0sSHO1a1KFU)ydo9KI1bffdRz%qMy_Y^MVaFS3L3AY?wdOamppFLjwa0m;sfwYyld0+2= zcyB(>g(e!cPP+3=xUDoy+kIp|l_uF_`s)up!QjR;*_Qn&xH)}_vWy#Zcjx4~e`>q7 z-(CQ`(1Ie}6!SU@N#$y2)^7WM-s`&+ogV#9!9u{iH6DdA$Y`ve>$dn!%V2JejHcBF zk@0l*j2D_Y`})aWr+&Z5q%Ej%z0G&))g~6|Ij)3R?>Q^9+;53JrU?-q{05t1zStsf zoc9T0YuefFpqzIJfFJhd4+1yme;v#D&@40RRlM!4Kzvf zw1cI+Q+y4Cyy5j1?lB4FJZr*rGxSt#nIv!Oe$Fj*eN{oURGib^ZWbppYam~eII_z~ zx`KLmm=DH3Ug-r@UESaJ?FcB@{C=lY+A+}L`@ggtR>@2x>T%^e-~*OcB(J6O5eC;Z zd-HSRZ~Vf>+|u-L^Tv88KE7S_*JZ-kE%hRT@+(4l?ejDl=X+95PDW0WjylEHGf9$L z*>OLPc6O{{mYZV=#ZOM78$HVxn=@TYL%t|ThDz|E^rRM=@{`}Gh@@zhCJp-b$ldAo z?q2!qVZM19iuiTBM{(xYZwdQ0Rnr)9$0Dc?_absG;4i*8P3y&~?Pt|Jl9h1%!BU~e zG1nqz&SC7OE4)-o^P{H{BL(wdLZ-U5%5J*ImfS+vd-~V}Nh_h?XY~o<;N|vg9Y5xU zx@R4)4=Y;H=<}dtWNyFdG3TY+S#8 zlATbPjPV`}xFC$+)cfz!j`oG?AC2qv<$lY1Of1K7@>pCRD4o|z&-A7nsCo+7dcbBv zAKf8b2}wwh8)7^5i;~g%8^T@E*2M1Jz4!TrR0@D%^@xbyqxH3Ve7=X_;cxhPufu|Q z?7+u$@5Jo8{DN8ln66H%p?8dun%~4F=G=CLdBhU4YH=$>MLW-+J^XiS;&@AYhK{RH zD*30uRZkQaZJl6R1FSjx#TvPE*Fe3>AX>kI6=HM9wi+s&X7=6f=EcJ3#%5}$z3?s6 zyxe?tjf5ue+e^}29-ahYr8|R5b8;(j3bv~6>`*A0q(#gX%iiQ8m?SGW$I|H&C~7i*JgtHR@t!P%x5VLKOQNayXU&n3E8)n zq`j!G64z0t?rC-3=p`6bS+jGOx`YKl6=?umc;-s3LMSgGDhfUJLkjpOL}jQ*cAbKf z0m`rWJ=~983#&*$hrS^gB!@rkpw)T^^8^p6GXygYk$EqNk=CfUf<+_c#pHu7k2G~D zK_2)7g{gj#b)9;OyUk_Rli4ntSUDwKFA2mroZ=i!@tbn-4zYxlYH=nZe}$MxkYD*h zzoPA#B;i|5ECIPVI{%?c`Xga>`?FK{WYwFO>TK`%X#hsF6k7l=VhBAy#VK?BeLdZ} ztTKcMg5h;GtACGWlP!iy{+(uF=B%2nG(v`gNue?3yy1w>;EbEtqy88>x z7+Jd*1h6X*;(O2NNjT+fQpqIRHj*Se22He~@#F*?mlhei4abZxf}gIWOkK>7;}SpQ z(w&7lp5!rYv-^JSboq5cVu!jRSd*Q5BxYQ%|B*a04Ow-MZEvpULp@)gsum4j4l7fg z=tsu_#I79Pm;dr;d_pt2+qxxp{-` z<~hyzwFaLSk9Se^d3>^HgWt^Xx;7Y?46%i9YYXs zvG{F`@ZiY@JVp(4ap+fBM1Z_*-q-Xi#@LgBADv9%@jg4ZHwJuM`S8jAcxguXv+J~~ zVzIAZYFsb&vDtoHPa(%LN$~;_pM^>7uDux;Jw-L5hQ!BK>R->oZQ!WT!tQ&{S_dw3 zPR?J6{Y=lDFs6@?dgYrF%d$DlRU^%J{D0rsS^WU!MA|}3d+wjMyv*6zDD;DU_X+Yk z^^>X>89S8pg({vuSHu)FP z(V`ynhBV(NJu(Nb@0gq9#dJ!p@v=E3ZRT=J?D^zq*F)nb>HY&am`7}AVW{J%01b=? z-pA`zbI&QKP5i5H^}^yO(L{TVL(KQsMeFZ_#1j>C3aYDVAUY=dtayTrW(xPm`}SzI zmV|!gkkvXC&u2br3`$j;#mi|G(hk#L)z`zv@AY1VT{jS+iVVL6o=k?q&TjOm|L_R@ zl-azeM^~L%*K`2v@Nc4exuS+Agyl&0Q_@oL?`vjMUKs2*(v@=S4EWB4cCA%j zY5RG4yQQ1Vd9AR;(9MF$yjDn-b%n55-!Fc#-~cU+FQY2C4PtM zk7-DN*sdi11N1!ZUa83A`VZjl{_&!P=>1^#PuJWRtzIZ!O{Bt9cFH!_oqr`mz4`JS z=cq1WIN*)O&onOiza0A4C2i3n>h4|Yj_h;$2=T6pGd+Drhv9T9E#&p^l;P#k@hP(S z6Zp$QY-cg7(IGYSP=dN5RTxe1L@xk(;HEQyr+rHDR_uSiNl)pRS^fE^h%Jr4Gmu& zj4Oq-)he`7qgoBM$W~8+iDHb(wUft{Z*ITm8PQo|Y|FXKr_ZD7)T)b!mo(foJ$gIl+%5?jsPcmg+qey$7LU^_UNTr2mca?007MU zt3X5FLGab=kP30int2@8F{blc3LLYdjNml%oJmj$gcvp`14nJ!!Du8Y@*rGwXxyA- zzU;dKr-BZ}d=i=#1ZoL$G9gWfO(=@l{v8^b$w*6O{5qDuw}gU*1?BxCi9Up~V73RC z0Rjug3Oz3)jYwz}NYoE9dZlyU+(_Bp*8W)W=;%qE>d;F`n6{l7hu7Kzb#jZRBqzEnS4;OZ{GD7@C-Ri5cP!Ih35tsBQbK$cL~!96FpP@i5AcEX>V5#>gyi zpZ8!EK>Xg>*(}6XQ2Oj2x&UhlOvJc34piF(6B-@k4E~)HsaT+c4DL&a0+ezhz=#3F z{YMRS^+|5ed*;-@EBm^-drx=-jhK64%pi5faAcTnm*@Fg-G~Tci|%>owl6W@b5Zu& z5<0dbO?c~4^p*Uwv;YDqjXLv;vq0;7vKX#nO06CE`XD>pUPQCW z=^sHqNx73Pdg;WYi%I^k4x_|o>Hcsh40aTV05l`GN$ZwI}WJen+;5m>Y!}_eW%l!`}5VGYV3Q3b?U0_{Bd0PdY3GYmwOq6h=x3M$dfmV_MBGEuJ7Eclc+%|9-rbn_K zU_jg&(h)jI5^dY#O1er6R+fTl4zrOOYQ5IGG}D5FvVVkvlOm|t2?l_~O15}nMUiin z+I=o2?~5ktl9D6185Bb;{)|!RO{bjQu&zfukQBkZ4zC@fB(o*dK5?i~KQ57}+N!81 z3}Uw7{%~?Z0AmE21bakiNJy;#MWj<@n36#Hyn-Y&!>6k@K=#336_%-AnGvb>2w*0a z)~tpXg{D0YlAZ9*24zV@w^i_CzfXi-ZZSs52=5_xj94K9N;Zni4cT$dBOwmF1juCb zidmbI?gNJcqDwn46wTpvj#OPJe5H=S5j}v!qUQF0B_PhZrRNY~?w;5OL|<>pm`32q z=F{HnS6TUj(XWYz>B1Z1B&9&Y8rZCMaV`1u4c4M(W<&q}?chyhq*os|7FV*y@X||e z!5~5u)hnwa2!a5*BM3iiiiHG?UnTX7aRvxaHG>{(F}zYGRYdM=kAYOitEC?HQati{ z0Vba_wi7^k5ZU0QQ;5CKUdp%_TjK>O^sZn+RQ^@a@n26}ezVu>9)UbT zj>`J<6d-l&O`>*ZHD0at8o@Q99AN!GXeE4hAuum1SMR~*(2@6IId4O?~JO1)eHJ=s87S46*>YiZ@A;4{YFi`KY zH=15LyZpZy=Y8uTkR(mgfe%w;7$H+Suq3m^C?}dnS zBEGL|#Q{LyM+%$TUrWw+V5+CBsBLA(+8~+bumVt)-?TsO7>P-DJ>swRstD9OAnqzV67kLHyZ}{~bo-n+BOc)-33~iT(YF0xKe>wkV^B64E;aJrNAJZ@w}82tq@WJOO#T`#PV=6p7;kOXB`}I#%dMA900?OxY}|K2R!ur zeP}t)7~uN%?NWguYw51I(z>BTHmp?*YwF2{tJ7^CyH-7FhwAC zKt~7VIO1;eREm*Zil1j?C+*&mUay=0p8jLiJWASxre(S&aLYnDDf`250k0t z7dLRI-nQtOiHX2DRZtEw*Ph#Zn#J(q+au5l)~ zwwYc(GAY;RNy9K8;F7>#AMP+cvC_JaD&A<{%<|-mcGii4g23Z~bA$Xq{{S;wj7ovVSFT4ScHn&ptG4#bsTop95*x;lg!@$fR7?U$`-3({ zODe81GEbp31hXxdl<2J_3V<-ThkT2cMZo~{11C5*9r7y7QKi}C!c2G@+hX7XdF|8z z^*;3y&u=4`Z2I03l-BkZ?&E z7_Au9kXxJQrLXaDf4j2(y_8vd+R+nQwmj&@#X(2Jj zW{gQBNUow+^yw}*ms6V+&E<|vA}FL z*2983oZ}VIX}=JBS)yrrhKZ-@_cr==r*2@owq-|-L?D7UGLpO!GCF6Dysh_zbX`L7 z3+t;zdF`Cag`J8q;GN5yAG!`sNa`?otsO7oM~EzR$!wU5hIBU2-IBh1B!U#}3U?ov z5Dozg$vo6r_rnheYue3*vwf#q%XMKXo+#ckgFb*(t(zj9=ll@$A$AA|p!Q+f)+mI`bxYsp%&_&(t z#LFRR(I%awfHn^y1^~ewvC#L;cQ9#sb(?>q+eaBtu(^ueVs>1PHy%z$ueWODB-C#v zIG%Z=1eaBI%5~)9>x1}HjB4t9z^##t72Y}aJ-IbbJN-h~#L-;bK`6l{DNGwMMhL** z{GewY$t3ivZ*ONen;StCkq|)=AdpH3KPfrnbGshE0p6oasp8wVNg`!C@~l*GfDU^e zKD}#$@n^!{0(jmN7m0j3WqR!|oA!wJ*-m#N-Q zf2GNA@Hl}~NjjBX=R1idcq@XdUsiZy{t6HAZ&;H;(mpA8r&HH-I~`8eTZ@=h2=xfy zNs;H-AcWTYE2Q46L}%$+so4)#4r?{gQQ=e%o=OUBZs|TN`JP1c&BaobUj^ z>Bty3$-t|p;s=GANg$t5OG|}cE=R%r(d1xpjxmfLpN>z-9yR{}f@JuX>2+;G!P>2y za$X|;0A<<9DQGQ*^(5r%z$$UK<^TrUlZ78*d_DgFf|f<1&*7^N8tEynX<9y@Z#8J8 zQv}+#%5btehHb%sZQ!dh3K)Pt z&}Y9x%2+hlNfT*0-M*s{UC^v|vOw5zm0&UlJRD~k9r*|0KO26?f3&B=NM^s+JOiu6 zXQwH-H~KE8Z>q&^0|C5w60<1{+X03%j1W)nufl)$Drfu>@8X+Dr})R<&xK^yweJqa zqTXEVx<$ls>J!Hq5xkg02*iZUs#LNCR%3^Z`CGKhBYE#C+{K7rd$*dKS8mgueo!{x z^u<=VyVWf&h`79!CrljgVx$m0=p!DWpHOS&o4IuqyO3VXcrR_w+2s37kM@{MU`MgH zayEqvj=^!-ze+v{d^Y`&eky!5{?)VaSHs^A_&!ZiOUt`!8;gdzzqb;#!#a6I*LJoNmu)vvm+kg<2;4kvyDR}6Fh&Uc=C_yo zW#zQgA%^@>%UCn###!k=p5n!biE0W3z@*v5@Q?V+k&J_W6Hoh+>8>C&Keg z%BUVznPQG&2hLDrkO?Yz$-uz?oR2uV_*LO!G}?snUF4Y^gmSSDxQ6xZgYu5;(!RO9 z{{Vul+1S`c6_hmSYgfC<_!TyDkD@hs~AnKMsGvD?DrBZE`Is zyi29&*LSxYBZB4Si|oQ_6hhN6K)XOEbE)$3+&Lfyz|y~IEiPShPZ-~#T3`7w*-NJz zeey_vKgDfg81%hnJ7{!^y$tE)q}iaEk8ng zrAw>J)F$Yw1z(hMIc6twYzhZ8$?5+94m=9!JZfdRxsop|8E2jd^8AgUka@ra{{W9Y zr~ExOEn~*IHkqeru;|_qZB96^^<7yuUo=Dr@g6dOZ)R}v`C(KI-3?FU&-fz;$6tfq z3AomNBKUVuPZV9~5^FkcgQi?VsFx0nN~^pcG70KAuNJlNhlsAm=ybW)%3{)Sl8v-57&#!5$4)WO*VETtCD3e$`&OrG z8p@$!GDsm-0k-6F0Ut0P`-dYn;8yw;t9D$$V{rac9pWgN{IUT!AZG`TnC()>aSY0= zlB18i^2ixSZa>d@tEl*IRnz2UlTVmNw&Gtf#k}CDW1XO=Ba#0A0pOhE+p^Yl`@|wE zv<_|x;5OW_Aa@~%J$OC)V*<6-nR9MRJQAqDe6(jEb@w0ss+bT)LC7Z{j5ltzm2qn- zOOLYcmnSG$qXPkRlY+po9Wlw;dgN93W=)55<7$j>0XfOQ!N5C7$S0>fbTv()XwDr7 zDl$|9o&d+c{{XJ3PpMehmitZRt+-Sr%=4^4K;)B?#~kz16}MyIEq_$CGTLdEQb!}K z@jk|lCEN}Q1JnbNobnr?7|u4M;-3%c5&@`c);6A6I=`JdA&FxdZOl&?QMjCOwDLK| zrKgAWeL*v4VRv!4hR-4flRL7bZU?Uezs+1fkNzllN8#3)2BYE|{fl=mlV@vh3te4a zu~PU%1EvN^JPh^eo}a`201tJ2MpmCvCrY-plWey_TrpyHfQX=+jk&-B?(>`+c*n-y z+E?Lsz>f{X;tv~ZMhG=Ie#xX*+Sy5|UurV#-?Ak^k^m)(pOgcfjEwyU`!)W_e;vPS z?}#ycHuxvtZBND?EBhSUl-5=%h(ENC!~Xyh zcxv}W)Bf9aadsow7xsI^u6)JZxox3OEZe${F_J6ZyffkZEhkc2i1k#tl0afue%$lO z*#Hit_6zCAW8S|wzBm5ge+0aJ@c#f-@Rox5zN34p#R^9Qcx~-Bx1Sj?E56W-0AuEE zJ4QC;h6m^e!|(VeN9}3w)5Nj(!^Xc4wJ!;1{vLT`)b&kj`7Q12V_4(@NibQQWkUIT za>Vn6U{B1S6Rm;&0EBXREv@wBlFh!=BSh-0F^)3D$OoxYg}`iw&wP3i(?nXHWCl6JQ&r|bsyM~5OI^EVNaq~N`Bom&Sc){bI zI#$>0#rsA0pW%Gb6060?e%(n+PKtieTCfYu`7g&K%GOP^Ylv)O`zs{dh>HaL!9tvjk&-ct zbC3;xOFj~oE8QmE`CLf4k}dQTLyfbnfI5)dyQmoC=bT`XU(LS13tMUv+A_$3&CR>V zE<-6sAoleir9-M|cDkGk9pp(OL`12PmO`X9M;vtOI%nI2@PCOfG+XyeUGhbDD2m~B zjgPsCESwIY5y0#D)P5`Q&XwXD1%pzyhEW3xhy#zBHc%e`lflS1W6I+>92%3u+V$>> zbkbPN@wC6Xlmmru-!CJ-9gkdNr4d_N{jT0&3K^n_qmBHaJhAAf91IhW$Bs>PI_2)J zx)!WH(8+H-@9<7kh=|5q5DR62$QT3>mN@4w$4}B{SlV7Y6{j!W{b7b>UNU_KS;n?LN{Zw=7M&n5A8z zuoMghEJ)}_BsOp>nAXfbRC7sjN4IZvEbO z3m0fUJ=SONRz9r2q-Z z=ee({Z2VjB?%%>cVYt(ykHoNQ*7tgMh@Zp~!Zdp*qleG3I%q-(mxDaM$zm%LPTtqkfp8d0K0xS)JB|%h z@aKqhzY^PBq%I{`Wikk4Q@AK62PA)Z6Ooa};a!LA@B2Krg}f`Gc;VxXq0=p3vemUH zZ?XRXV~>y87Q66o!uA%L zE~gEqjWnJbi|l%ANn>plt0Y$PIYm$yqrn^CHX9618JT`Z{jI(Pc(1`98T?se;!C(c zw{FZ@?etgouGh0mdl9;q175@Ng5n~Rk zq4-ZvmQ6;=Z|wWKol?z{Oi3e=B#{Ft2MrK>KIF?4AQ6%{KZoA~7V3KqOT<@bws$c7 zrrHY|lzYOhxg&k2o+QRpDdAfrWLLm8KNmc6;qMvU>N8z^o>_H~F0EwNP+c_3yex_v zZ$B>}h5(!pM+UtL>T>tXq&CZoidS~rH@q@ts02cK< zc5O@Sl3nRD%TY~6?x0O}$m=-=+!y~H#R!n}acw1ev@h*pBtk^R>z2&;h zH%4MA#X%!!83bn^*1lQzgQHKS>+;1jrX)bt>H#jPor=uE`^2{ZuiZQz{{Yhm!oM16 z9z5_?jpA(*Mw-V{wOf$y8$ilgM2!(g0fAfqa;HAE{Hu8P!#aPnEzSd~nS@3uSx8!o^w zGxIRU2L}VF>(4Z8A%X>RP82EShfHIqzcuF`H~6vOUx(43_(^s9TRX;w&xcHlb>5?L zxxgt3f^bP3oDMpUwdh_P_;ai42ySP$7CLNlk@nlk1)~)od~IQt=vO#Ddn2YR=iiLK zwEqCXzk*N!0S}SO`KRt=sI5}W4N5A|T{h59={Cm|c zw6BIg54HaQ6dA8p#NJw3n5-@2bA?GR8wjNI!8!KrUl#cH_OsUY3yZr?1;Um#WP=6$ z+z8haFU+JAU~!%sJRUKOWY@cB+9!o{YiOcS*V4lmp3(sEMbPV&fu9%aufIGqaEt08y59 zJPvbT+F$G;`yzhDAF!9eEmz0-mYtzNduwR1>z6k7S3V`YvAAHb5n^`{ENc)ziyDL| z&9#|^YPO+sa|||CHZqAN06?%rW-ow1cI;O4QtvA4$AA>Z{3ftN{ z`S;prdx`I2n1Le8G>px(G)Pea`FyZ)#fdmpx>l!qJ+-x-pLun0dH(<&u)%EeNpY5B z$^bHcWO2uJK9$@2R{sEkyZ+7EN5Rh$+4v*GT1SU99S*^?s|e;sipVnA!!dzYRY@Xc zORG}5mkMN0naFh=_kz9__>aV~>eioNSkKv*#$-s@^GUbc+j16jIG?GBFD? zO0BvyM^cT*-R5JE4nL1C+Nbv6@WT95@VCVO01SAOU2FI?+kI%tbs6K_!(_7v;Aqwz z^0wL3B5j1m3I*dodwdo6VK2h{9GJBGd;MEd1@#?EaE5sl9IRt3eo!{>ILIGU=3XqD z!`j88=ntuVg5D_=j0gtlWG#?eBdOTRK8=n?AGANRPwe$C?Bn5eYh51KR`E8r?KZjM z4WcWCjaw1LozI0(%G*?h`9^w{Z^hr+ANHm3AMJ1P4)eucIq^QGW3!4YJs(WDo=fN~ z(IZII24w`Fl!DFk9GAFg*YO}4HG`>V~+^|%Um}NjCj&Mi(1pYo!ejMLw zC??V8wz!Sg&DemM9Z6CFEZp}!ameQ%ckFFX;!cC%q)9wWax{qKxmzT-xNj!g&0xR) zM@-=IM`QT>X=C86S6gOX5)*$Qgxowf!1=0+%MuT!K|k*fy++zRa;mg!j~ggtWIMx- z#C{d$S5{YgeayDkHmw!J65>%R1rRm~ARGWdJTF|}U>utC3wyh3*dn@u zCsIZaQ-Z?;^y}1MXOFmsYe||Z;dtbM_PV;1Wg~(QzI%Id?(@*(A8gf9zGlK*5NB)T z7bG71oD6k6e*XYLik(<0T|$9o;W;x-t}A+BxG;YnmM23XD%0o0Ik z2RZD1l+poLR_mRh1tm|XBztxIeW=06=NRLTl_o!SaH2PYF12T_n) zxEDLPMQk}`4(vI~cg!IR60aj@;v|CI?&&JL8&QWH}{J5bohwxA?C7RLd%1IBv}bJG|Zc6K1dvH*{`fIP6H zkVwWk#yQS8=c&Sm2PHu)GqqRmDaO%&dYl8r812&>3}EJhhiNPPPx9`-0ddbk_2Q67 z3k}@iH#h;eZr#UI*QY1f-xP88vPzM=p+Ap2j^E)y=RFs<9OKwfRDh^ecRm0t!C7)Z z=YTqLbJ%p|fWvm+ODc`{Dp_2CoR6D5c;mSrN@>7k4Uv<(=R9$aPi&KqYD}IBWvk{{RT&9OJR4t^*T{s~qrfI&~QO4s-ti*G^X$Bz<^2dVW;H8_vZDjf1cV ztcRxz0T{sV(}9o1p0XrsycP_gv$8f+o>Y)?li1|?{RJrJ1zCwF9Y|Ksr>9<`k%`G5 zVS(;&qw&XHl!*RZVM8lk_Km_Dta6c{x z9CXiI;*<=7k-@-ZJm7M1ob>1P`csB-equ>Id#@P(01B?kM&hWRT8}L6Pzhg`aU-Sx z$r2>fc^vNNrG@r02n0h0gf@p)BGu_t+*J`k@k>QC6;o%GI4@9$F2$Xr34VYcOPtLwlnzthKx1>t}&dPpXd3ScnBqxu%Vj+ ze58*rEV#!Uf;$4oEOXkUFZ;B~a;OLq#GseJIq#4`92_n&O=6&K!Q03y*?9+X9eBYW zwBR|$dt_vRkMoKbD}qrDNCYS)kbK8z;|DCvdJN~Dl-D4FH$MQLe&d`0yRJqQFZAn7 zG7td4Z<}rk1_x$pHtPC&$%Z=4=*xZ?-ggH7kC05R@PTaSKe#Q{@*7_#g?-5}$F zG0Dgy@SreO0I?CH?*T^A2q%y-Ffen+tsDSA$;l(32RSE!`s7lK4ZluFInRId_|wML z3`jf5sz!;8na^%Ac<-F_UiUx-{+b@PfiN-C!RW-VvU&5_-QPDkb_X62XW+{32_03P35`;2az(oEIu_)cfNRwQ8ahCeppw*Y0c z(>}kMpq!8Z`LUd2kUt;Jo~+-zVj~#<$V>TKfbWc9x-V0lf=Iy4G^oN2@)c55HlTBp z&N_k*Kf~C74o)dX>;hXXH~@TvfO0Z2IWz;?9F9*sAEh8!9a*-=60@C(@@3UdGm<;< zz!8o|s5FdG831`?+M7vOz+8fHfPFqvLC*w!2SOMzz{u)2!3Wd);)9Wnq3Q_vD|#aABW(EL{dpDAuG5L3obrVKsoF3 z6a8t#?FtCws30CsZ^!keB#u-Jb;d@~)3@PKs*uDiY{Zco?B2!m!sPcnkZ^lvjMIw( zyJVMXA3JZtkVbc41IJ=B>yB|r*X3eKVU9`U;N!oH>oMQ*+pAk>+<66G9)2xl4zn0=C%=XA)joFC`9!A#CJ{0!Cg`x_sH zcG}Dudq-<+E%vypZ!OI1zrT^=QtA{r!hrlNW2tP6e}jJ#JV)_IP1dz7OGJMU!DFhM z3n^6?$91q}!iEFx?%Kc;h6A3pL&e%ZgM1wnGp?Fsx|UfW7B`c)p7B+q%*&E^B}N+n z9&^+h<-cU#kG~PWX)O!Iy5_avd%p$g`VWW>jiz2SEhV<1BUdsN+>6R?2+F0lu)rjO zE7Ct}Z`s?x-?J9K;6D%OpAoz<@lNl>KM!>O02^w*@Qz;npm=gkMjGFu|Qs&{J;mU}k1cGuHjNwmG2jSNrJj?J?$2Yz!)3uTD4_?#siz}p-O#vE5j`3BI zo;kM2sCVJ8Hk=0oBmfVwFU1cHTWA-Wcl;t6ZPulE35_);RgOzmA+Tb~k}yi-f^)R+ z3CQhr8$Cuu*{9tbY@kxcF*e2-+TBARL(e1XYnbr=0E)adJ6zAHT3apDcMmKG$+4tD z;gl{$HxHG#?z_0g2d#L6!`>q{@Y?BGl#nCZ`9|T8PaG0$#`j!|u0i>8lbmhualTL%P;sz0@o&Dyob)894(79CC7MJ1-dNx^}N) z;ca5-81;$m*{p=}M-kM7Co(V%$m8bYJqh4buDmsWd1XGmr(3&ekxZ*H#~D9n^FHV& z7{@`Maqn9p)t7RzGO);GAchz{4SD3S+*+23;yL1Iiz6iJ(MVVk#?m;*$sGs)V;u)_ ztrWyGEgN~8SxjU~iU{ktbsuydxykGIk0CTtM$D3<#>l{IWM#p~&jfuskH&%q2nUhJ zCxQNP{HcOTM3`obVKj;1Sc2f@xYns<7j9MkXxbNMbYD{{V+1k$?!v z2eC9HZ0=;v8_XC&z<_X1E70I`+kkzAIN;GaJhT%6~Q{O~$|jWwkz zz-2(%8_NvP`M>J{$s>`3U@^F3KZvLb9m?dEE9Ptxw10H)0XRP}&Tw<@(FwpCf#-(W zq?~h}anD?Oa(mKy`=4+B0968T#1|2Osgk5I020Km?lYcGK19Au6U`ORCjzqz!LWw(&UDU>$&%d2GY z0|0pkl12zTXFOCBS;KIT6r;_IrV29-6cR}X91+;$5rfjDf_I7Y9E34BBr_{6PC5K( zcBoyve50ry+<%{HE_D{VmP?JQB$iVo$+@5evC9y1^~Q6N?adI{c?z**_9AVGu(F&l z10x=Xw?ch*r^z{zS7ry3xPVHZQ~c?Y#T1ImEK#~R+EwtufyYtlPO{c->|~AYZ{~qx zlXh+8c!?uCPUbm*YC-pjR1GKJlOsn`3x zd9PLQ-^G1m-sav7ZsrTkIwm6a;#k?hjIhBu>G*I*VSp>;&x${?2f-hRI(DxtpALL4 zZ{jUN&PeRFNHkk$FVf+n3bH#QhH?rfcbtr4BP7?+9}NEhYEO+{4zKjD?0<<~GP2Sv zE@Npl_&i5>9j}(G#HyftE<}=GDE|PKhl=qp2Y$%j8q=V@m&Cf1+O_S;k}GJ;D7My7 zZaYX)PF$|ue}s-R*1GLS;yg5>B0DNCP7<4gUZ=PD!Hc_CoN>e`re% zwS6Pcx=Tos-6BgiF|h(Oxa4mtaKQYk6l0QgY<@84cT(G|wqntyICh=R^dZ$weq3W2 zIRt^U=eVeKKlml5ff2Ra$UIA{NiE!uai_x#lyKYWY|yzyjD|T+H_L5~8|77111!zN zSbxDwzAFn&2T7XV(mNeG6tuoF-Ag>Wx(QC^oMQ_9TS~rUdswuEn6V49<~?iR7mW0q z-BU)f(=IhhttXCXCrfpB=8c`vLY(D@QM{3X@}3Fl>NfYfT=p@@w-)B!Uz;5JvJU6NMkHWe~hwpq#abY}HR##Bz;o`l5S!IO`ZTH=Re)N?JzaxCC zz-;@|K>fWuBjSti4S4rj)|B=7&}J?u5fr6;@0EBYjq>Z;u|p=$jGoOEGKb2 zGFzhUCjbI5o-tcCpYTnO+6CT5zq8Zr;PM2~eTrqioykJwN|rzfJ6D2pyCXbq`h!*f z0D|m%Jcq$v5b*DXd=WLLio7+fCH$T^zSZ76PUYZyK{7FooH*Spf*SxyF61Uc$>km^ z_-W%`2TEhtv@J>njA!j%Wp=b+xZKMi$l3!hCml!9uQrggi0-tD`0uuDAPGYh$3QSi z;{$`(k4pK6;z#WD@pIu_)R6eI!CLjDv}(?}qG{4grOc^~?2`aS(YbkSb?L=@zwnR# z3a9Xg_KebD(S9O$t4_T$+C`w*tlG%`0EC9t-*T%#EOIDD^WqXFVNmi{!ozSAxq(&jizfgom9QWT7aJmE_nt&OK6_RF~N zKaKtp-9g~bhd&SX`v|Qj{=>L7aB5deG>|cg)W;9slXzr`L73%Lk8-mIkI_79@kaB+ zkXzeZ>RR+|X*xsj&A3WdH41=w zyuY=Fi{kU)vbSr2A^p_XQlMyo7$l%p!5u#F<2?=t%hYtg2`GwrwD@l3je(6~L^5O$ z*&VFXuOlDq2H*EK%)gcbFnjepO@g{#|$#X2$YKbqfgLw>DNRhs(CNU=`It3eGXe z%HWcJ`u_kK>t7sxCwxHofv0${#XctS9Gjwx|>b-ST(JF!rgSA6zke7ciQg9w|Hf{ws%s+kxNLS zifwB~I0kLXpAh_KulTcAjdhshwTnfF*lG4H{{SvZ6+;upRtkq5F^;DttZMc%HY0^% zx3o$8`DNTZ*$D(QmOa2@f$i3`K0o|Y@z2EX6I#dO=;pDr@SVT*CW)j>;!o_@)nX6x zbjyT|u)i(>{o+fvg@3^_?YgPvSdEgK=vnuQ6RF#DcpB zfM?8MhGk>0s}O!{0z2P|{{Rg?Yj4|E#Cqq2b^id0x84r$B-Sv?ePojhSne0fl16)m zK#@fxo3=b;v6ssu85?W4_=WKb%g6dwku17Yns%vgbgy3UUurgXcd}$&OB*9FRgq^x;4t^ZU#P|&YY`= zTv%mW=Ybf_rd{fGM%v=)A(Rh{l`3%9WM)&@jeMT2$m;5F%0mO!1XuKf`%iwvJ`wnF zbK(sPL62V3J|1}2NSfKKV}@o=KHQs?GL;1t9zd$Bp|O_RfX`oWd>j3zEo^k?d_Uti zcQ%l0x76gFBQj&=`SL=q1b{gEgRV~ATg4s-(fnYd?#kxg%TOg+ck+?MnHT|=Adq^D zk^L+7gZ5GX0D^~DXqpv|gFY(HE6JtV`Bqx>&D>U^aHn?HX4-(^imHG(MISavPvL|1 z#Qy+-Xn6ks!(J!Uyhq?K4eCv$Y8sWnT{g=|xx0IBDT>OR1}DnkN^(NB{o8P%zNC}m zC&NWcG;bLAd(OX)Fh+HIbYs9cY`+A9#!n;>)MC8e%i)f-WvCXNp-Xj`8+gv*(*W5K zpkPirFkWzf+RFZp-~QGg0Gd5E-To?gCJVh?GiH+bp2itu`2h`&FaXDJ+rJrZ21wd} zICQVsd*jZcn%<$Nd?@k$p{Dp~dD`9Ohl8~X>rE{N@?Loo5+hX+xnkJDp*aI2b`}>g zO?w^87Yi-5)v}lh%96wnBn879i^Rb9W5P&GvZYSA58gk~a3- zr1Z|yjARk%S{A1T?yG62Ti-=KoqKGr1fFzKLgQnMqlV`oHZh;PI`dv@t6579mp!ER zvPE}kaNcn8JxBpML)Ul_4Y^nK;f#!2bX| zP_Y+TT}rCR;If5p-JBh#7$*dhI*fD2-Jr-Z61GW=NC$8`hjE^rKE1u^0Nj}*1!m^} zw$toCA78_zeEspnd_vSE@Rot#C~jjnnxjvxYEVpJYe*w8^nJi&hJ21sOk=Hm3Gk*J zGRsNSwTt;JB9d2*Hd}=PIO9#(!jaVd-1PZ+WMaM({jnG0mc4iI*TMe)1|z?LbuSPb zuN3R{avOQHt4Lnl{{XD>6nx@Ia;GPZf~O2V#r>7v;I4}g#4i;5V+QzG_*QFQ2xtnR zN2uykLpocuxkti8{#=Kq?VEW7iubq|WKknAc38rfV}@cBWaB;fuNu|JmsHd)V~#Ng z+hmYDXwI<)k(mQH`=n)uCmlc-;C->DD@CW-+q|sP3sgr8RZOHRs}QHIa1R4KjPg18 zGW7YkcM_rmjLgloK`R(6NCf+GJuA*WD`{FDwc!0q(_Ms1r;I$tCRLdL>dNH&qz;60 z!2=}Mqx>hAP={8Z$~&Q&+jA?df(9BW{zhr%;3oTS%J=24o?{8wRavc z8uH)7ZKH-bofZfqFfoj%!!&9`F5ZCT@z;)~yzBO2(*6}_KMXY82f$Yrr%KZ$n&#;& z?;)0PJhHy&rr2CDV~_|Zg&DyB4&U~G@dw2Z7JNw5{7vx+<5a!z2C^eZyVVk7aUvvW z0&b877y)|w^&Fp=zB>5RMgGy&A=B=HTxs$tcrC7$7rJDX5qE7FRRD!KJcY&&Dm@oL zf@@7K2`?CV!q_{4*=6}bY_a#xHTm`XV|-cgvg@8Fve2~xnud)s%{8Ts^j7y5&u=s^ zscoF3V{(F6<&{GG$0$D1{gS>8c(YxT!k=!_U+g|1m}u~7SDIA!_LgmP46=};Y2PUb z2k#AznKX0tZM7ON2r=CZpwhRMu~e&@_s;n;Kv292f9+ahVi zCK5ha+Eeo5C!Ri?`RiW>d@H@tz94w^D~}rKBJ{K>mNCQ-M>C|RV6VLHo!GCJi3_&b z7<5$w^k?>t@OHcK1Hh}{kB8nix0N2{u66k!cU!9?EviO9WCdY_ETzjsvNmX9VYrg* z`sLwUOA8GHNww3he#vPSnk+CBL@F6U$=Yy9&rzKEn)x5c^IcEkeMDT{B#z9F2v(7j zKP+Vzk%999a5(wSag$%v7sCxRNYVTW;j1kJPX5l)ZM3-Jwzd((j~Y4*?g&bghUK%# zT!MHt{Lc95`%~2XSFK)Zx2E>?;`!d<cJJF^vrEB9e2J7#SD<5XS|11RNFd50A8+ z5XTIT(cD~0EG*-l{>|o0!{tGqa@cMd4CH`vDcUE5H4RrXg$CXz{Q2D@XDEQ+u~CkP z(2_kXmbUSu=zbr)*Zg^Nrf3$iO43FrxkwpeBnZLD!!sO!7w>vkQ?7UqOTN9ew($I0 zHnBIiKQr3IMoB+-1=@KzAOV5TO7h(=;{^T@@K&?qKa5xUFN3TtBzdg`{rq;OJ7NOD zvPkTA%PGpLsLL@JP)&LV{3_Y}W#auC!M_Uht!u^F&ZJV-J6$hNmr}U8xgeKVqD3qM zj!8Md8LySRYx`YGcNPAX;9U~oCXyzO+h4t%AqaNhJa80k+??Tx@HobDIxP#~)`w|+ zjc*LzAih#&jsz-{{UeR zhniP{^jj~7nr(=(g6~+d)AU~^>gsfY6qe@Tv~4e&Hqb=IR%{^HBWXx%t1D@*u4A{b zw3hbjSuqS2@fqcij-MbIJQvT)kTiNOMl3rZQeH9QAeRv(K$b3!vQGU&T0#jV^UyJ3?G`|vfdsn&E zB3*L!8%s@4Lt>KH6BDAwxO?5v2PYClLL!DGzRLJ<`y^lLmiAh|jrAwep`XjTT@KX) z+?2^}vq(-9k++2euRUukQ}J(xd?zDE9D`TX;$nd#W8}vo{pH{j#(E!4xE1=#@C*J4 zf3J9&$4c=(#rf)d`R(C)ySOca@!}Fi0$BK2^b~HmQV@dcVwP0 z6yzHHknq>Q&xJl3(<0LJe*t)6+TIwvzBF4>NclG?c3kqxhmPd%d9Ua5T==c=3&c0m zYC6A*b?eKSB=a20s!qhHZP${*@z1r)jpfQb<@yBr$}PtG4D{ z+0F?kf^a$x02L&^6*b$KSuZ}#DN%^_mmrlND>9YGQJy^qLz7y1N5U@#cy@Vb@cxTy zrcFCL&n2y#a7`zjA(BY^(eo87N6L5{0l-mIH6MtcB-P?b^-V_V{6dJaCB%;Lr&I(u=xp0lKl0~I#zzEqv_hkv9;8! z?XKe7BtbMuFOw98#exoyvI56sSFa05gx` ze+Bq|#da^IYno-H{2~0vKGSU#*@ji!vCy#Lfo;KuBd&Qk(9rx#tay6yZ#28>n_0G) zrWW@P3e1gw%EN%lM+9`otv!vE-A^Sm!;>X=}bExA7&) zU0uTkkO{HMhLTr1bCPfd0ae0|fShEWBhb7!d^uv8b&Quc5X3gbCU%g82OO~_n2=6g zi7a_FCatW0Ze6wA+-VGwBt;JB zD;}#JoTjxs)%DWd) zO3rk|T2G?c=Hw)QR~ac0Ip;k-{e|shv6zSjbj>{Q9${8l<%7VYV zaG;`L6UYyx)R4l_=mH~99}hHI`r{L7I+s;w+cR#0E_O7*Oe18+XnI%va?<1@^zUN2 zUJ6Tn4LQ(2GKLfO`jrtEi!q~Z@i4uzsMuEPe*ootN@Hq(!h%4#^l*?Uy@gs)0~afC z>Ea>HWqUL`8F6V~^d>`z>jEnrw|uC+dVsK{w=l$khtz*F{bu*3lcE8j;aT`RP94gT z*OYeVP*Lnf6q{VUdBD*z!9kX0U!0E4{|a|RP|B^LF;q`Xz5j*9Eg=;UD#flOeX}b? zqddzh~k&Dl6QB>HYWHY|=7; zwcpzJWIV)1Y({k27(}(NO_C&%=DZ*Mlso}76VJfr@?b|lSEv@f&Zjr4vWBzDL&~*m z!ckIWh9aFTNun2mtq#wvG`5E255-c| zpdWTv@^}j^oyW$uMjQSyl(a^`gPy$$SY_$&xLEHc#pc7%>u&?=P{=KqMg436;Iizw z6S4$Kv5GLdbC(V=^ccw5bG&6MR!_rvmbu3K0al2fOfuy5V)aSBh=$%rS66W@h$~vg z-|EII^yI2+m=1nq@Ws#1S|udFUqVzy-2VeQ=;j}ec@(()a^33iD?}hZ2NDrBS=9Pr z*io`^iEahF%9M1w+V6O&8cqK;^Gy*~;7@na&ZF^4hj%Zd8Qq>4&5bYxhT3KU2|Tt3 z;nEwL%u6Lk#;(d`K{zxCPWq}H!!_Oq2yL-a0(po6{7I1hS;3ENZ3;Em0!YGkw)V8O z%V=xA^DBt#OdCwf-F)fVo6XC*!}(NNKvxhUbqr(0z=xj(^HFh0x)%vx+~)$k&lHw5 z!m=3UL&ND^dXO53-vLXj`y>~}gjg%IWC$=U%AL}~@HSdJ_}~(c$~S0w8%mo5;BgV?Jd=~L4Gwv& zBaM|k{0VZ#5iZA{m21pC;QeGuDsk6c3jjWa0g-CpZTC}zKzuS7B0--DZ{nfx$Yu1L zEWtrVJPhspc&w6JePCH9@+k%Ia79=ZkH3Aavj^=oBd6F`nob5LX?=B8so}j&PEA&} z-RfBe?FX`Z{}jm*C)bGZsTaM=Ul8p1ONfKf10ql*jtjf`ZCJbl1(FNS!EgSxO%CI6 zw)Aq|y5F;FVcaMsMYw6;j?xL6FmQ??d`pbll#*U0dInHM(KM@8iNi{OYFRIWfAFJs zVwjtOoWEaqI)T{8^DDHm^1_w(!Ew=-0-hZCXMMwq{FZKwKAtB<2lG(@Yf6tqX%i9Q z-b*+TGABNlP->E&w&)zbgUj}L+F!|B_?MisL?#Mkp&EdH%=TT=`#R(G!xV7;o%v>l zfl+v${5hwh;1BU1t||#j2nrfqc4?3_;d=9d@KQsZb>pY|kxJ9dVlj#09`1R-vd+<5-PO%M}-C>NU|~SFKMh^39>6_jctz&=+qPM$`J#H)cSJNWSXD$7<(RY9mYfBuAmcM2<7aRw@`w1T-1^HgTP*)Nv|AnMv3!Lk1Hi9CXSAkds5wSUyR6Q(H6AhDX zbgumTrwz0x>Q_q_(4qg5J<_8c^#!x)Te$zk3k!mRpoAk`Mh0WsZ@1MG1hDrcmjW@# zC!GYDQNt$s+x8*J@HgdcD2gCa3SFJ+lBHUfmrcc7Oyj_+lMOWd_(g=%Lu+^V=*f^t z?BzP!m&zs#v{yywV{|IJH!iG`n4qcI7GM?rmd5vaz)K{0RX~|VdJEO&bGl~){gKKJ zNm8d!Gy}vHb&SXNx9d!_QxTrkoW}+lEGm`A1GQ2euIAX^!4o!eKV%uD*gTS$5W6$PP@}jaq5Z&TJLCZW{2c$J zHz$&qx@w@6=*s+CI62c1wRgf+>+&-Hh_|unqw2wh2%~J^w@EsZE|yEV<*J#wCHayo zdENbv6hj|d?%iV3+BlXq3|pI<WT*B<*dui~~-2-AMUaXywXRwnO0Qm-B;zoE0~;lN;GN_ZwF^)!_$$ zGWK@Mvrvw*$~U5XYBViDUr|KZ)(mgrCjpk|<07JB_2W8TVd?8r-R<}T{Atv6Q!w|2 zKT&#)V)>u|IKOAf5cE~A{aM^9=`C@r>srR&g+Iz{ZvEo@J|t(0-6OP4H>~>>kww1o z#w~wNns*30I;Qw1A#I5$qvt85H5WPQR$2^x(nEn5;*Rj?oucA-v*$%B9;Xh@lX|L1 z==#T7Z4VU036-Rcqf&c_;N{? zrf=`s?Wr}r;MaUU8~46gcS z+tC!uZO_LIyf2JU0J;IC2=wxV$w=XpB->}Vj)+AW&h{H<$F9_LfAQ3}sa6uG4*Ws+ zRjcVXK8@{PLDY&u@_>)P@6cSD5_Sp-v424?%$iVwUvL5MOuxHjWB}gY?;8el6iIDt z?7Ui!b+8p3VxxNLjYWFbTG@a~xQHnbosmI`pc(|R_x17XR|$nHo2AUyoZ>l0P0ymT{G!z1e4liT| z;pw<+;|F!Ze}D%R6m|fXxl+KpVZTlTlrF47y%u2F7S~&HJBfHhCw}V02I!hE90yv- zDPQT+f%fT(FZ~0?><$(Gxet=8`ZHnvrmyOiYd)J|2umvNNtjYWYrI5oNTJp4KSclz zU2Gl*wFtOVlGmZ)hLyIqenDuKtPoAIOFleT`~IVHSZP)sK!_$%c_-z_SO2A9QY@Ik zBN~D%3RUVnD`B#_=zV7E%JUW}s>+r{`V^9g$kc;(0^c7U;vBY!8V0liuyg{R-J0B( zB|dZ(ehpD&%|*dGsnp+_=FM&Gd1#w)xrAP`JhzNI^PDsod2Go5aHLX0{$tLN`bj6( zF_i4~B(Os{gqqkAN{0J3BIl3$MsV9JQUP z(-I41@?AwWZCYFw@a*2PDorV3dn&DzP%y$4PrFUA;BRxCr`2}yPnxWzi=9$oQsL$Y zT@VSV*g0(WrxX=U47OLBn)Bh%!pAJ!Dq8)*AK#&<_^4A)wZC86Ql7`;w4Fj?*qwe* zO=lkcoN|hl+GH1uy~&AlH_n_t=8ztL#8Tt<=xP@919kjBkgf8NB1j4^w+cR%Kgyp{ zg7vV?YntUY8C7d@5&c#&h6!zS;))gu@`CsspIjlnc~&Ec0;Bz>Y3$ zti*%iM8}X4$1?@m$8L-oB|QFdshhJ()>?wvaSf)S8z@zf`F-rJ z%urqt5lHY7tx)01J=`s~=s@wv$SuY7CDKD-1`?|FGl=q~%92^aaA$~DV*tckiY#1C z5Ia~ko}7rxx=}z1<{XGbWv<7E6kT}7!Qsvavkh|=why*DL~w|(1aURjhz6epii5yR ziYix;%7<*a;ujt&z)#d~W8OgvNkqun=IDE9K(UeK*+am;1 z8eV#2e1ZSESXQOb%yGu8C;pCa_kd>Pm}7Z^U{})Cnt1IF58$5IVRompIUW&scA#+T z){=u3H9Z&9JrsUeBXs^LGOjjs78^{VhkU>b7AU9I*0Wd`Mm!1Gez>pTI#C) zFIqzWx>-zC612}I#TsC^tu_+3-+Dv6S83vl!Q9(J)TjMXSiV0|__zLQpDS}uC-F(p zCv$OYC0C3`c8j&TOJ``7YsVGrd{6QB+MkLluN@1A)7|Q74YGWezL`N$MVTnyO{&hm zTQ0@Ey2dR@BQO38-d&WaPV6m%$>?m?$aj3&8*7WkgzRfCBH9`D+uFIt8{+7D&)iE{ zAH9)WSYb=+-*u1Y4xQCuc9+OX$Q83}ktZR#{(|W~uh{Jm*DRN8%fgC#ohu8|ZjoJy ztC6qO^Fm`;Fn5uI(e6tmEuq3oJ`0=&^ifqdE;{quZo<5(;R|{^$ugft(y{kVJiwfq zoApE7hr=q;ZLwY^fie1ArtW4TmfFex0fIQ52fi#l2ce0ir3NY9$wx=uo$fq&Ipk#T z!5EOV`C4&ZNIbQc=j24dpo{YvMFXDpv+PUUcC9Bwq77`+D7l5kaTC4rLgLP zC$V?ja$=N?ErKV^bo`y#Gwh5>)-iDLXhZj4H?^#1&B=myV#n>nyd!t^j+Lj-{&zt| zv}fq;bC6Vp!~+ z86nWWMjLgIsYQ25ee4l=5hT>q$5`jvNF2*%2X#A#<#}vCkg8LKuC_@7S-Qp#WS_{& zkvUmy;!^ZM|0M6HD73~q_8%AO)Y>o-q zA9=99`@`?QGsND4x&Z_!=1VFq`}|n4!_8(Imf_Sxw-2A?S5xZjGAEgQfTG$_O;<_; z>-O`!@4jl?_l7?&XUN(wA3RR0TG`=Ny;Y1MQF1oA4>qCt51_Hg?D2wQ1N_Z=Tgxb| zZgJks)Qns1*I=0&b-GDJ9pr(K`pdpe_-lpzm+><`&(C333YM1V{bQ5*e}o&foSd>P zd(!I68%knLZ2iV4R1Y)NaUGTqWM{oYAxT4=kbl3i-6k2VwgRuh$V6e#O^M6Nz9(ru zf5pNCmV|n|4(ga%JVV*!0MmcyruMW^GXbWyQNAdC?$mFIrkbf94)?fenM5R7mTx09!ls86-Unu(_bp_dVGANm8xD4C57|O zQ1r926n~C`Jb5`4uTA~0KHFpM(U5^=Y>(EDdvoq)^P882*?02FOw`!!xYcMc)ysTA z&*shaSOLSYzO#A&#V|lv_V@PAgFQ@61ZUmDu916$d&ElPk#6J5k+?SACgTa%?~1+h zy@#$9+9D$!zq0dDkM4@?y)vYtC&S(fV*f_8XSr0x+;BKPy^|+&8JueG{O~rZd5`;W zxd^ZHT(Dt6D4SE-e9kgUg^wNCy2H#gZ|nivaEj!lQj>sZ7y6aIkDHC>j&)pmL{nI$>ALRnv9Z@F*NcBBl_t}`kl`oYLwfo7wR`S{*;05mMtag?+ zfe)|05$tgTUc|8)DMC>3YG)b8M>#!KY!dwnj656b?c1uM3u*ubQ@o{)u&xK6BKy6=%6f1O#7ambZ7HF;-eL~Jpf5ha1b{xFSb zUgLfo7&X16F6V!I(tCdRSABxaRF5UQukV#Ju-@MaGP#m3&pzf>U;`D-*JG$B0Rb}HSL?<7}qI>dY1gjIv%&bxq#tzlWn=1N`D{TFSGM~^$&+W{ z>)xc4HUeYSSmj?@@#!*3#Kf>HKQx!vOj7Cy5J&VA5N5*E%wUPWC#iu}ZorK*>Ht4)liNK9Rki)pO}P41pK6852kc2>)+bfd!I zY67g$Iy~pSO5?6X7m5l#@2ZkJ-&$dllUd&FU|PK8w6SCALZ4R0@?jvNq1^!cas;?W zc1Z3>klrW!2+o~Uco!x0QSmxgRGfoS@J#hCi5Xdvmh_T!o73s9gTL9|35*9{(v9yt znSA=JtT3v{w0nqwF+co?OSwwrT$YIGU9QZN`00qQ^ciBWJ3ZM!GUGJs(_? zW$8U3NkVR5FC)ADJJNb)Y%vD07tqsp2iJ{pdML3VsTU3hMU>$PAwP^~Sa z?f&|cNmtZ0Yw7OSb?h9~!+N?`g`SBm>eoTU*{A+yaQvTz_$a}CsS0==t+_w3mSr>( zRacr%`t%=<_5b z9ukNtj!kL~iOh*qk%9B%Pjb7Oov=#Q`NPV#cLJST#_%weW5 zv-*5Sx8cqAH+97+DQ@x}p4EPy%H`4I_xP}|4*?(oQ{DBlY6ua-!#u4wFQ;lGx~Kx20@SCetHp|~NaoDIn>{5r&DTmqpR-*D z=v-p?ELw!Gu6pwEj^j>4*^q^}Ywzablj#YzQWtT4y$DiO*7@`h?8uDgY4!o;mu}1g z@5G7B?3R|G{a4+FvDKG=P{ado!36W$cZZsf?k$m%7;H{;t5B;-E*lDz(g?ywA0BdQ zUKkzg7CYU&+bmX}R6nLAm?|3T9=Xb81t`x?pyEPN{tEs&^JT~DyrP=bI!3kTdt6Z{ z8&&coS11)4j(vQwBb~OnYueauIz1p`TLfeKg8b>>yJw++TLhom^rYW8JdX+pFsWEG z`cx^u;U;DZiIRagGv4~pCD;n&RPueI{zvB%6?(+4JgyGZK`?^H0L1n4k33*cBK z)Ep$Qr1!XySat>B%&uO@_p{Z=m8Zk}(?w9`<+oyn*@Vic=4)c3pum3*BXj5oaGaF= zIDzwRK>2pv#3dKHy1)|3Buu9pL-aV;IZ|X+x|*0|>)7AFqMXY$)5+r7C%XhYCVKS9jL)eG z2+RjYM9F_eE&O=o+%%z&BYXdJulK3%AFDCfLK{cnnJ(cLBukuWUpnKX&rkFDoA;_f zY~Ny~_21&%xI(7{$3Yj@o+ss4psAXDfMak;uxsqcxT#07B7ZkdMr3z65TNdfYjYx} zeUbbI(siJsae(kYLwL;&49pwr)HjQE8(a4^7!15VlkgJM;S&(X0fL>z^G< zdGdD}BTNsXD$3p`ZO)91xD>zs<$G5n$>fgFmDo(|H$)O(J5j<_y)jg~jC0ez+btrP z7JRAU&Y{evujP;BVIgj~+ixpw()hX=F^QdgM+L?JPP}&d=HN=7k}VSzwg;;vlZL5+mHi zMO!KbNChJ3=zp33E3d7)=&Su4GrAZ57$lE;eEm{7i~FE0DIX? z?z$>Pb$GPcym7-!*E}NJ2}~OqJ-aj%F$q^uB@N@Q%?^LrpqYjAC&z=nVeyZjMuK^H ztUYQ$Y;Eo8#KjwK4#KH2gY;fbNupT6AhK+Z2~R()C(!Ew0LjBan`%CX6SMb$XIyqo zr=Ug+St}1X>LAhp%Dt9v2Y3MbI87`c$pVP=E!i_8Yi+Ya{gLASUchSn#SM%zpr&hy zUfce#kR^@=@yf)NS9C3(Jch@W-H#R9iB^NgdS96EIJKCFpvmE^Kq*`k2rPFndZcN| zDI&kmMd2V_4i_tPBVMyiz%B7D&usr)@|8U5nbTUNSLi%EM?Yj(;c2)dtLQHuzF=n?IL0+3`$Oh))Ynoap}TjTT!MdB zH}Tdue+v({1SWZBA#)|Yv+i~O%)IP2Oj?*PYSgdbChOfchOOa&tl$kS+7CQcM|9f1 zei9;J1lCvOX2rlbb+S&14PMsz4OKUP-g%JQ#$n~i0Erwa^lq};%~8>}^yPeATYsf3 zIRJMGC#xyryYXx;!Nc5vfNR_^Jo7I~XsmKCe|%G%`Nf;kRqE(OBO|Wp z&g*6KRN=WS4pq-hkT#9iw^-7bpur57)rAi^9;s$-BPZ@RA|<3Agk%nE)qn`#7x(uF zB_5s$a76gs}tHGW3u~&4c+Fe0YT^4e-u>5AcgG5)CZB&Cbr@U zCf;Do(Fx>tmV3|>fST~)0rRO$bzeg1EefNB-yTXIAfcXNvsFdRqm*Rw8nCzKEJhoV zun1()KEaU+M!ZGOC=;0@5*y=94KN)I>?+~};;oSVNUf#sdJIi>iWO$VYTyAQhC5-NF6Z9XTEPiCa zID^u<{5P3BX_6p6EGC$jo}gLPN-o)GjF9{bk|n}0;(I+Gs)0h)J3GNQ zXAt~74ad96GI)Bd-`TDc_dXbsZq>0o& zs*h3x5OK}2VJNX#V4-6v>+oxS!$w=XnZQQgA9y)B3Y~!UtRH0_8V{JLCFTVJWlS~TXMC6^r{;&|;-JK;w_)iJttPaNAU59yD7Yqx- z%0fIG35??3KCzNP!X~R$#gyhK4Glu+XW1zzfg$da;B5t-^BpnM864Ne$rh` z22TyQ#O{>1?d1s;Mx+AokXfyKL1x^7=u1;FJl&a{91lb51km`B5*Qc<x(a%fcPA4m6uAJf-M66#|Bx^iGgiWde^obcFqAQ06Wlc ztaEaA_d)xwtd%Y(1-lcm0B<}hx=A*tKt`I3^PMz+sfh^El0V^?crcs6Tw-Tr`hAv1}1tQ7-kqX$c=|YPU!P^_Eq$wYSrvHJXsKrSDc*4@}7FN|)m)f`x1Dm_f17a%xlt zR|NL#WUq^PY#X712{rI^8(u>zVli$iDEaRRQPe=1q&ZCDArtmw1BtrcfMa2kU?4FA zKl0jk@EebSF?B)ebYoQizAC+}eaf)BYryz-Bav7Y+or+h0TH%uu%be?Du_X^uXPTe z_|qkbS0DSxMzTiVJ6ZPL)ie2zna}l^NoUP~Yyh56>Ek_&(w|HHR(@9!fg*2C_m??J z$y+Eqmx0NH0T0E22Y~Ia5jUNH5KXw1pG_JR>a!qwqL54AzirCHElEwkh<-wYhy-wm zQ-Yug^Fb^~y*tXYCZYaZ7*-f$sRRltF5;i9kL-i3a^YCP+fRe!HllfUAy%tlNnlUn zt4HX#Cs`b)l%0rp8?`|aXhnh@)`4R@@UjM7GQ+|>B|-Ty`?)7DGOx4kyGY-nlrxGckaQU2QoVvzE-6Xr(K-f6D!Z82rEs*lLv0LU7E`(05$D}S_Ehhj-3`s%@0lfjXk_rNF2uja$yr1@R9VIadWj`7Xe)Il7{G-*jN?<1; z_MWQwS|}G$Q7eIj>na(->5Q#+4Z=mYl}RaBYEaF6I9ZOT<1y3}I~d{7aCcQ*x1(Rg zb|eoqa~csf^VL`*p+aT8l*XM(O2$+&D^ev{E2L*wj-vQm@UseLEAk6-#;_RKB^zn1 zGmzQ-$xZ(rgkP$QMR(OsjDEy@pA z$sc(@LLD>vl*J=)X~~sXVFawI<7T-4^5F<5|6J+aU`vNpQV6cf8L3<4?*Mf*=1P(__s_Co8kc*p zmE<3A3>`yhrK|UrQ5h*mn?s&^h_cF39qHHOF82X zG5)b8dD$G&4B}D({qvW9qlh&)8+S|m93`O7`CiL)F`C;5D6$G-IDgfSyQ9R~_sbgl?=eW23B>IM9Bq+oN z$W&_acxZmRze>D5zfM#jq6Bhw87jE28>smo;CB7=qgJgt8#r@7e$%IjyE6<7I=iYS z-d$||_AE!bVZpS%3QLc7tI8cN&9q=KC$RQEZoA!&do(2KYIwQzNw{neRYg6kZ||Z+ z&eK=oKd1Q{rI)^E6dkSatsdJpGGC-DTxX!uQ-)01iMWt4xp- zd))Lx-oI`OD>r@|PEqzr#tJgFNjkdbS^g&+^?zCs{rBHdUikq0z#Eg`?e{l%OIyv4 zPCIJSuM{!&?~+Pdir=npWszxjUh_XXqSNt>8t=VxxNu9Rc&O?t*g+OMZ{*qfJ_?M> zqm$@I$yv&O7MOiJ)Xw*2%~rs(sa{ zmc$10(IJ8UVLXLH3StE+|8nK!h_2d<+5lNc6wDbI_El_8h9%B?v*H{#w%Nt3OoXn3%L%#>Du82nbgY%sU=ssMQ;IsUi~{9=NJqA zuoh^aYWI%a3`^EQl5r&+Zc}1o2W4Q8_Nza9{d!l`ZrL>dg(&mx6&+*ci z$PmjukcAk+MyQ2d#xN{9>AA#EPiRI0P(+LvFK2V?D9D_Z7*Ej&gQeR>aA$AB0ZE z5JV&0_m7?xK#xIn=#Is^`+`^n6VDA3lOM(Ad4f0`7r_fXc`hSdt4KL@7PiPp_BjET zUMn?0D~_^`N#OWs&U+6&ysYHTTo@{3q~STFM%%2<>IzcEV&_tk#iF2Xw6>mJ{BM7D zsHFF_N&uv`_Nh6j}h}mfHPFuyWH~E8U08N6~K8&w!##;#cYoCgTU+QdRlCx+mJ{`1X z1VtowVS)uX7ehbJ=~ClHM$*1(H&S>GE3Vr5UojcH6CS(+p2H7xde4X@BjA0VvX`9Z zFWcgBB}ge$JTWEz0bqZ>a_{QjEdg_63#z?n$?V@{OZ1b(at7~rA;nb}4H78v#oHv0 z^>-h*zICwpEBa2afSMT}kuxbjC7VT!qMG4f@fapeJfdGYIotN1{1hJ^%-J#7;NsTH zQiNpilcFh$hle{{qV)K)qml(MflY7}yc9M497oxTu59O}&S=yBfqNg5vf63mrm zJ#qZ`W=x)MtnK0VbD!?y7t4#==QA?1t+zhqHFr?(M4v@?kLgU#hea(YEj{3rCfHtQ z5uR6^4=C#b9l^gVtptk~=Pi31Gi|EUTE9q8=@1w##XjgY`*^W!|?}A zXcy;~&F#AOf4_BZo2PArWd&D+bUjg6%3q{Yc=wPt@Z~|#udh*)1SiLQbPj!>pi9B< zn3GSG#%kQcGKsno6Ex{p%13)nNo5qQH>Vbcd^8~FcPytm@VePI&#dfSNS&WPi_Lxg z0M|}nGBRLEII3eQ&UwhqhKSFByM7cj53kW}T3hhl)l6=R|2lW?P$9;0Un~BzJloiD zYZaB#JpTlW7QwkSJXrBV#mK_{(Q&t-JO6&%ibFf^ zxT{w{F@|A~1gY4KE-(UCGl>ZyQnE9w7m*2nj$cOr0Z5c(pV5dW$IUbK^ zr)WBzI2g12Z91`y+PB=XrFfnoG8m19he~by3Vs!+NR+_T&j-44AhL3}4v=G$(aej} zMBajOZ;$5zv{^2zkJ9p4zue&t=z(+vKUZ&}NJMUX$4yL|lRudH@HXm1nrKDTT(cN_ z)?0ZMF#FiVuC@gjQ2X|L=;_dUy<=Vfw z(GJ=;i%Wna&B%|M0VG{A@g%L(S9@4Rln9lW1A>-Tm4eqg<}wB+9Gu@lW)YU1NIb{_RrRE zQ>DxY27$Yw<+cDSyZZ&oRHrAbgpmWaPi}#Z6_t4Mvy=iAF zP3!l(OCEXiRy*5^6@MDuenQiNmY$6WcPClz$gzwGVR&r$872P0rkB={d~m$tqsKF} zRIjSak=FhBw2Ru2@e&}*wI%_uPam&9OjJiUp?LRsUZ+nH?3M-wrgL7`e)_v&W6#4g zYv%Xqz7oqeN?$$pO~G^5eB-|;;DLAC@*9xuXU*n@%qI;dgJ;wmd~@U;xl6_G_)`@Y zmOL5?e5@y(RT!ZtB7`__EnsEf)P&tl}E@ zyyjF?%hBvxBbRfz(wc-@=M768tmk_edA^PVksLpY?=x*@5@y}i8HVkwN17^GPbcPVq|qC$7|fyRKr33luT-Et)|C8Ou9cO z8ccUy@0tm+8MmQi97vKJO^u}tpIe(8leWLUt_pFOS6O*hHA_tn#rwDw8utgg2oFG{7|m`?D6m-ELRbd0}iQShoh^vgHs3;dU&pmN-K# zM2ToaD%pqDH;lElKLY{=wr1~s)~YdZqp9Q0gd~b-Fd&zZsn;EWUe`!@&YLOuJ9Yc%$VWqJO8dL<#gA&tDl^k+dXHYKnqbHx zVAdD#NOwiX+MT($#;BHpKKrYUT@ex2b*p!o9=76Hz$6T6dPGjld~%0sU-E3J{)R*A z+D32k;oh?Nh_}~S!`RS5 z9v>0(uVYHK6#4%uiNHYG>x>)H_cx5^V#_V{BRlhAj|9&G#EOMS^|c0nDJE)`Cuw`% zAyYPXpj*8b+s`@u__^oDo2bYtH5a!#+4rVr-}I3s@$|(-2<2|e9;I>-raD*Jo^E*k zw0ku))zq9odcYc(u$@nrPtvza6As^YI-x(czi#m&eg@8+p6y%4>38=psx-xG*S0q| zHKSO$^q^peKNs5a7NuKpm^Fy;e$ACNarlAV$eH-2|KemIur1NE`9^nNqVi`_C)ToK z>r6*HV6Bur-W!T0cD!Bstjbw+BEhZkI8fwn`S+g<6JF!*phvKlOw;=f-J#pSQ~<-* zEIQB55$VcT@|+l&o%=`|?iSz7JI3&4m%i15&{*%CC7VL>;N02ZKOuA{Z&*K=akBi= zEdp!3v9N4A{Sm1ASi|m`$XYaZNAzzsH}0jA-4Rl_S1C_&KJwx(@0eSgT!ly}-(l|f zj!P2mrSu4>TpNR0z^o~^m7yq3j^oq0;41zBR7QUIzsjrH@dF-1s zskNV7UXkli{H=kXk_eVD9-8}CpdwzJl4}zd>Yo2L{XB%RG9;*yu z=Qr&Wk)zqKx zE7`yoKROOrDzkpPK{UO5e|E32fPAPRMU-_dY4qlb4=z`gxQ<357_3MvCiioe#m~{} zLAt$lZyeg0Yntvpd7a`~oe{Mp8QwoVObND7!ogyHa%8joENDxf&Zx@QYdp19mK~Fp zx5k5q1HvLMf+DUYf(J(lCT(p8cY9eI6lek;|E{=m^B>?%xI@LgB`UyS$`2X4PODY} zn6&v4@O<{liTHwP5nT4Q^bah1My6+fo&H#i3A79O@O{(UdVHrw35fngI$KMb?)ARr z{==j=Dl$ZiLV+b60lMTu*DpvMs`XzB0d=&#L3K>u%FwZgu2wszZt6Ip+j)Gy_7<1r zzdvA?U$9xPN~~|&LK^HbFuOt^Oihr8kz=NP;IdEG;;nywXR5ke&CJTAgjC}=a`}>0 zYiFfDwcBt0%CjEK6=Z51jbCfU-R1SsLF=C4uU!Sd>{vMB z=@LgMiN)7ZcMAComX+<=!0mBtZ6wUe*$|YI4%uZ#FD$`_f?z+yUp-UrOL#)+gNw+@ zX+0;3?T?p*#LYa#0=-}k7SSBX`Sf4iEWSW?whUG7l2N@Qu`%)tyXqb!Qhn%D$2;-T z*sii?WPp=D8X zQc?gEy#>96?+~A7sE>lyd_58$CF6lLdhvS zeH+maDAW8XXq7gj%fs>(?HPrY|0yvsz?GQ#hTBzj+rFJnY4a&kt!Q-)Fo1~bEP<6V zx+@XMl(zUSC3aB_=^aGoGoC!qJ8DB2R?zK8a355Tc%h?s!O!`Gx}f%@a&i>UK863u zu+%^PP*O?2^xG^(?}#&91>E>}1^9#=%;<^m0Un?3>G4z$?E)4{9suQ{q+AIa8YTh^ z65Js19fMFV5+rDL+Q6tiJU}WV($E>yYE{1>p*IP{g>b=G5CX&Awq-8jX$;3^t1(ZcKGmWumm~+$9KFh<(4+ z{pW#l2YE|w|3}fe$20lAe|$4%a>`-LFqyODP;Aap4CO2pIUgdYInMbM%4g;jo#qrm z2dCr^g_IdGA>=qVmgIaEzQ6nT-~Qa=v3vLZzOUEodOp8OKo5S!TF%R=dSi0+HSNvy zr2?1K%76ej;U*+Tmw7joGij7USpmTa=OY8Zu z`w7r-_Pm%`EEs=5;$Z@}c#MHea|V<#o|-)QKmgs6ni6PJZmjcxEhXCks$Z{PU%Z;N zAwuow<`p^CJ?N+EN{}=rPm@B=q<;OVIODuL9<*q5Hjp{cDl;U+@x(O?-D5H_$*kFQ zN8^Rp>+7JF~ zT9MpwgN2qWB8gAzejF>#&!~Uh5-s%ZHccDb`X4BYX~{G5TqGHu8%c}QkGXtkxj?J@ zbLX_S>K+yvHudH(@WO?}B`7}KRc~SkdW3a+-S_RGEV#a#se7t&xJB_r%u|8OVFhZN zO2sj`9$uxJqd(2B+*d!G*H`{7$pl~X(iFM;=@7H9r7)GJ;tlQISkm)lyMyb z(78cUt7MqeDs27Jc}!8uJ3XNj@d|o|Lxmj*TV~rNNNsHR@}Z3@e#=y9B54X$DR9?> zB7ffM*@ec;*BBskJdD9+j-GjKs`{1n%LGKa86H9_WwZ=pF|CTNt(_=fv)ThH`%3-L zqqH2Q6A7b+lU)7Wkc<66`Fq)BbxK@rNo++NAOIlpiB0C^L=vmLkRw9FfQDETFY&~O zk^kU2xkCHvy(i5>T9?Ov^R|+#&56XEydBEQ&S^L|q2foR5PS65`cWatTfxylR%v)N zS`E83$H}ux>L2hoWO8D3$@#J2Y3n&G*5ofDk(A+veD=WR$3Q8EO!q*>-B3-TO6D3=+!D6pBjpW+E{|vR<9pAknJf9W2*p(@NhA?wTh@<; z3$FB&r^`{yp7`D4gA;j_7zWA5GcrEJ`%Y0i{qS~5liFJ-Hy$+6iAXl(#Qu)Q*(%GWHJrpm8f4M|Emkl!xKS-yHdA{x5o-|ic;X7XY-CfH%`z(-Zq#G9BA7K zajFj*kYSx-Avh9S1~QzRQ|{W}oh#5_6_9KSz6eYB^i5v-k!=e%q(IUHwf`Mv-GvD6 z9Mqx#G2(&UnHH_Wzf`qFxE|=rgq7)#j`af{4!48t>x_dOl z;SQ0UYJNl0)yAL1M7~;VP@Uk;RiEH7S+U8sd;QE4oCsN(Fg8R{=|#uI^J0gu07QV^ z9X^iEF0VsC`JuuVsGGnUWMF9zpC@1s@=gV*rf3jKsh%_XvxLfSwQA~K%c)Z0gm`cWgJ<~d@t4lu%#5hv?+bLjN z9vE&vYcYby(>55pw5R!I)u>4x2XLJQZslNeH6z|sL52%$hV`rW6Nt-$S!liV7 z6XhxHN{FP1LHs(*RYQjQzm6n3a=~Lj*EI^sDT*w+b14G&bpIk04puV!C`8 zO79n?xuxv9@qcO<*u;6JB4?^5k;ssc>*0k!py!F9&^!*9{oR4cg04g3X?!Gt9!`;c zZoA*`fFFN$WRaE_N>J0XZ6Tupdv@h}vmaH`&+KR?x4ad=l<(ts9yAbgGriq*4STTW2=xO z2%Kd{!|XtxLvSbr-7DRU&+QRQ3b>bSOOfrc(2B7h!J?qfQHSX+mhX^Bg+_tONTyJk z=`~R@$(HD`9$oCmpWIM0{Iv$Vxb#hyeXMd;YsLLI{H&5mX=3u50FuF(KuXB|Q zMC|Rd?s=beJdEkmm-CX!siZA$`PpYV23|Rve(E=$h5@PbqBMtEa^C zMDrh7X~VN`rQ{@$0z+-&QXiyYUWOY?@fHjV{9?-nuajWRyFKg|63}J}rU-YC{L%xE zD?u%E$fv0AeYSlc=rA(&pK7BX(tNs711mSEQHQKI4vGcB%FX>flRx(_eAy9hI#al zCQcgx@=z~}feyIX{R|@9bGFJeH1XN>K=g!>{2%pc0#k8?qB7a6Kn_3Pv_8|w-%(qu z|04cUdm2d!pGyix|4|(}S<_cA#HUaImC}jUzi8|CA%cp~oS(M}xJ8hl3EeJ4F7GQf zu;Aa-fM44D8E!C>&_>M;DdxB+#Bgo~NdeR&n083fTfqSW{ z%M>VWT)fbCrdO7&%%i}1=zpM#!w-LY20M||lJ8tru+sLV=Hc-k>yW|t2bX`9;r(x) zN5;}MsH|WFHx-{p3K|gnlBfcLl405|x{ua)Xoqor@@2RAdW`MxYWdt{Qxc3%zP|h8 zS~nJE?z}AjQKvxtNK#fYL?qx`L8?EZxtHF3YZuvD5>3A-S}iK}xVI#4sMv_&{9u3C zd+d+7@6|fGS_s}Ld76>3KDAL3YB#zTCfno|5Lsmy6IQ30BWk{Pg|z;et^XV#M-p0z zc79TNux*hSGP(RbwLv8N<$1DROm|I?rUff%EXIa z4QsZYQh13sBqc&n2mL-EJ_{{}m~!7c2^sI!OeU2Y``?Hfx85wc_Ne9yZSi{Xvk8V6 z`S_0u&&u3Jw&RRbMVsR_A=;hJntzMWFL5&CTUa>aX!k=OEIZX^9!vSo+mE=J#t#R& z`+8?PK78hdT$`BAOmalgkEe@_FP)0xmJ-Aq|4imiUe5gR>eb#&uFGTlZE1+t(z)j$ z#@`X)lM_R-I~8!%RR4r%NKzQSEZ8MQ#zNYcK2&4yJs(sUNVnq z3%gaGv1)PhM~wgT(t;s34uXhuE|bs@uAiUMy&2={60Q3l!hciYMAOyNHI6p^9?)5g zk9>IZPD}BjLr{Kjkz+aoK~SHoWh5=zKGS(H@YazTG%X@ka*Ts>pI#P>2*wdkN=Dwk zY%V0`nI!}lrLEt4FCAYzi3#U;@8NFB>jh^hv10QEd4i3h zO)FJ{H-G6og9duR&xhva4YD~~=)XgmrQeTAGDRT^->Tt+iZ#<~-vvrH#p&HncKzHd zey_4uRx#03HgF-*gE0M*{xg7)D(jeUHPzlR`*2dnHTG90gy;(3m(7y?*4P-k$WOcq zvBh$OC=!FIMIzprUMBel5qLAML>x1rlOE#Ncy#&Xq4}Fked!~k&6vZ-|Dw5rm`)D1Y# zqQGtU@XV)Yzcg3DcB^@%Q^Yw=m3Z%ziR22&@K@bBjXm_rf1F*m2$4;0-JuPg^)r&Y zAkeBjarY%4^ivBqrIj9=GICk0m$NbYUs0zW#h;=oGvcMDaQAz}c{gw)HM?hwzS%Y? zWhd9)y885tIvk!vmcoO{U96u%za;Pk#2U`Ov%K5-QMkUFp<8bDMrPqnZms~fF?*Iy zV}@rOHZNqYa`eJ+e{9GcmkXaIt57}jDp zM7m;t#Yvrm^i9D(lYvhv4p@iffdN>U<2y6oUj^E@>^k5#!ci==QPFctkjP?&3^gjwNt0j;2Ey8!F#&SMf>x zH5H$M7pC9}cp_6CkxILeJrglvaQL3sf=GmxLVJ&h0FA@Eh^W~NysC~ZAK77FXOf$k zU|0RCsy}TQG7~D%WL>sC^q~0!Tu~&C?ml1m!Y|kuyxap4qsS7jL8o7%!4_)l`ix4K z#T%W7Y<4I$CuKSkI4F#C3vWXdxWnCGRu-%Vf7oWBY|PxmB6;@7A8r$jmr!+ZW;%9CyDjDB5=(0`jyp@-{hoycPc<1COOh=m1M;Zz_oRilNopkn*Wr>h*BF z(_jyLyELWr&v?uwKcq!84FiKyJ-6}W&w!uXi?{pDr+}S8mzy8!$9yz@Ow9QSIFr1j zF6FBHhebd>5fUE0PL2l9rt6~pH1@ELrils1ndQ2;XEpw-xid9X|5F7JKeAOuTzwn|F4 zv%L?a^b^$E`BUN8;;}sJZ*Y&0fz;idoD6H|?Hw5-7w_tP|86 zqV_{{ouzyx*^DLcJAW>=nN5dDcMJPFxGgwRMVIxbM>fZf1OreCZWhl&nS=Ey2R7x_ z#tpeS$7_bnXTB$DVh4?H`Jj7nf91Keq!55eC=#uNxt`Zt3SV_jfvryuv&t%kl4e;N z>^3K&v$n@FOOjc6Sc6$HyR<1m0SLVFO8Vj;vws9J0)Dm!)GLqQ%q_!$9vLs73@na4 zBPoHcI()ynC_JKuWROpZlBvhY@~Eu=j7lKJ6lvMNoW6QB=IT?ga4(xO=|{MJSMEgp zwj$Qh=jpx!iJuqV+W&am5~!N$@1s*hq~(nWDXgKovE#K?9Q3T(A=?JCY}os0#^^R_ z-o9)C-{6lAX3GE1SK6*xG?AJ#LQo%no}bcWt8B*z_Jx2rxGR~rIFJ%fF*cG?P4m-v zS&MVUi%!jtjz#A?pcCZEgFKVEp8@5WFTa2L*qFW6J0qIY3RqF>l6etJZ4_SIoWs!V z^G$^Vyv^~?q6aox4r9Oduun#Nrc6~zx7RLc0-I;)bAmhfKZ%mWMSirKy6FfQEjj-( z3E5b?$+?LM-t1K`{LxT{049ae`rVX_c-;fX+T~N}4UvrSIj)sE_S2C~kspmK0g;dC zS;gu;{vzvW!q3D10L_hJtion^gQBH=>g5REOH<2b$Xl&SvFX73L9>DdhwZA1XDs~l zhH}TkI@cdPsrCS=FU?N^yxvX&b&Ahoh4UUkVVfJwrg9I=hnVM*QJ0S=42{ z{10@mLwNaSJo3jS@@k`Q%-15s7Ec9M^1Y)ke4tZjSnI9y;1WyXOk-ku-1oPtcN%}3 z4Zf+ik=<$xLGY-jP-qz^mYZ{5c$x137LCh6!Z^Rhb}zjbCFZp_2dm)8BK(DbJ8?}v zE?Hw*!&>e7iKct;v5h9R_?3TFqkrF)4l9Rqncv$*`|s?39P!ZaAl%4ly^2pXm=z5) zu_pXvh>V{JMax{muW?eD%Cmz*=f=19YI}nO?>EOwj$aI~zED!%=1Z9r{=t1iiTJF- z)#7h~J4P3h`n%DA>aZHR>0okDylFAgsVB8D_Qa>M(E8HJZSRrF%vu={@vDG6N#$x@ zR3wFG%)tn5puxKIdq>gS_q_Uz#WL-~djpyp`k%4}B37OsCG5E!#8CCmN-tH@3XM$P zXRKJ=5FgZLY+qbbwx3*(?s5X1lkt{s?2`yhy+?MblxUFX&SJhDt5yHAbmR1q_r;2P zmrm-w$>q*4y}fuY*LDHkG7*z=bsRm7zXh#W9#C9-1^^lZkywK_ctq39Oh3S(G+_x zRl9F27VmL7nZGhc4)taQzPJU+mow>mshRDqlPo(PYglto_e=U%z2ZaD_04avt@1p{ z+x4A5tQ+XJIdzc>*Y-`-@l_^u4m#~SJbO}b`pTy%zs~;OWygn@}JTlaS6vq7ll0TC=koNlv>xt-m{liu-Ve?Rv(o`DY(iyz6nA^JV&a-w#r0kN?iKn5F0T zwATgpP7w*lTH`w&n?`$V2l|^~zYZraH08aT^vwh6G$X!A?^cC9lU0@Y7KOxw*{4;Q z)sF|D1+wMo^J^bMO7HCL3&@#}^(=mpuSrEB&gSg?jjD|wNuU-wOSWb3>M#6UZq3dK zX_`Hw-r3OxX7-%HCr-Tx73!m|+7f*=O5d~x2tLo;zPed{QFK<@n9P6STn^EVL)yf^ z;u=n@`Iz5iPd825JAt?7$%dcpAJ$WfS;m;R$QjY^(0yFDxic9k-+fziyXvB7zjxTz>rzw0CQR(G_qGFu&e;@@V%A z!*Mh0D0=EobVmCdg{dz^9!~>CIGN8Ivt+9aqZD=jna0H>RQG$`_t{$^2To27PW_Dz zD9w3pB*?!dBob`zL{$Fa5`Q|7@ZJ&#)okZQ9_R_g>YIPRGS{soR+CqKKytYyyZI#3 zrzsgFYV~uiER%U$fIa(t0LT>tVrrZpQVQ_OH9U7r3jP9e)Zx$8CEeLGcj54zy!&l> z^N!;k(dE>|fr7FBf@Dgi6iRcAt+<*r&X9<5Fq+T}d$6UiKE6q!_i6>lDB@F#T8I68D{#Yz9G<%3!NgQN-|Z&Vn*bmG_Jb#MOppD~TL_otFb zfjW0QkLnKNQcvnFx>z}}h&mSWuFUt&?t>%m50$t5p2rPGh5nkGlAdW#nSt`J-`+dr z8@X_a{C2Vrjjv3sTF+DXVFle4q#0ZNR_JArC8sJPDqRud4-D);+({JToo7pm|F6A*k{DO z_5G-Q57eowTA%>ROl~1^j~CD3(5u4>Fy)%ukyX|O(er=DfGzdHXZorj<-cKT(ZyMp z*C!xmXBG-gEH-C9-RE+?>w@$6ve)FjpojuTHaEmPlHrxg7EqP!VGV6B{3$i-r|5lY z?^Byrh?8h}gQl|o*9xYnWTjOeJC+$d6-;#aas$Yf>rMzJnL38F(F5E0#qhSWWJc&Y^QwVxu-Ctb=v=j!b@~?;QCP0zb_&q?lyYgFI~CW8UmH=#YqK&@`~<;uz!y?oqYkj?84{wQO9CTFSu#M zdFgUSBteaT=JDBPX;XRu3XLY~Tc7sMf;K2wr%KCB;>sE!_v*e5j5%0c_|=x5!k(V{ zRZ)4P%G}Ft;Mq-}!~k@$+4xUKB86vVK5tZh(KY{CV0884e>cXJ=g%$+@9hgGvYnhp zig-SoxdOtZ&c!oOM`b-(aTTUP)IwHD0C5vzkC3Xm{)HgI^M~Z=X4-4T@u%fKOVt5U zD`I*uhy_4omPd$D#8!5;7e-d%&pq#-mrdT;YZ?xG`Sh*E=R3*$d>T2|bNG=-6W7>{ z-LC{(_z60-*AuVFf6F!ZFkY@h-Feay9Hjef)^$Q3lsuR7Eeyb?<>#1bQto3vi#dw4>llrX$ z$x5E7*{pOtD>F@3%c1GCD;|1~M+MY|1WHfDxt~OlqX&@@b$-&T)c5CEtS-zeSqvau z-&3EQ!7C5x%vS300OCEN5SV}RLV{`(cbwLyNdpt6lO){4w7d>5{WqDV zuPu*#mO=1jXwdmWx5X{l{s($zA-h%-tYTuJ^)uv+B#xdW^ynU4`nD4UUpPSpwa{Lv zgeKX_t0sEnPss7Kxb|5@2dtT*yGT_%*c)`WD{EcThB|~Ol-^@u#Fnv%m?_djf@TW0 zW-2}ZKhSO2=dZ1`!R50nr;Z&qII^g!Br;riHRPybE-uC7I7+?Qtker z@fCtYS*S+>L>Tuuw9ZCTD#&cr{PlbR+q5vHG~}d zt!~v#w(63*AXt*i;ANP{r^hw76LXqaY}-n9Q2)ww^=0tcQ0{6lMz){ikB>9hUtPvv z*orW^*tU+5$p^QljeAR^N~X5edYGs?G`5NGUg&T6TL6K`J*51Jgz{z!KahY%@2voE z#cF?6D4P_F`63*6E!S%=l2?foFk{qUnDau!$wQAQfj08RI(82O;-s}Nn* zANV!af@?X8-VU;ebolFLeL0XvQr?^nap$s>fCng(gr@!l)(rWJ^qy8#Jn}KVVlfUy zq4rnCCz~!6x(5hv-0cz!KzhD@n;wEf;5TB9%dttR+M&IJ9V2C<0iP-A8a@9865mwy zZJ<`SJsHGiy(a(l^7?$4t2gf*cKuc-VGqxC_V{VXc(6K9q67>4`;6)s(k8LtD=UPb z?-zK54BvGL{14=1oOgwNwk7!2$%KAn;;l5-_W2n2&A^<}{)&EeuI1}$E$21di>$h0 zxr=bj@_}kN)SLaIw~@WiJ`iNAKV-NWxq6`fT8gQTj4r*UXQO{d6GYH8Hx*;#Ii@9* zyYuD$F(w@%;|(dXdq+3vxlUi%#qV81L*rJUu2@RdF7zbyHn!)1T1q0%l_#?+g9)VK zpf8yRQc95*ukRsg=ZnI|SRK-4uC=(=Y|7nBWFO`y`XC_V<3nd}h$Q6;+p~ z-t2vq)0jW`HJp=2HE&3~=%l0Ya?~HQeG=9tfU~pCi9c04l29fU>D-Ns7rS=(k(X!=||$%U?Y5R})XnNi=3d|HgFsZ+=JKJ8;eW7|@AC(X)B5#eu)b z(4`zZreKnrTO!X8k8#XD-bG^!D35^aq(}2Ej!%|7z8aDGkZDr|>hgFoLzn{K1bW$O z;tZ-i1ekv1NqX9Z%&Byq!AA^=z$g;eN4pgXx=Cc92Jrta@mIA*U6c?KKJ3&bAC-Cq zoEfpk%mI>6?Yi(=B{F;v*zdLxqZDkb1!EU|Pz=a;k(x1zt?rdXyNaP?XmUieWo>;) zatK-q7D_?^xYi?119wsQ*B54gv)mQ(M&)T8NMJP*8EPR(c5M**Go2RU+B%6ruMY9n z)(UQqW^+txFaV9DKKRgvnB{?Y-7KmUCvu;Lu^KAWS#>=vQ@z3un&iR2261aD&tB#G zJgg3>Fy2w;7GaE1u=_;Nw z0uMq4Oqh$ERY&n#hL!d1xA~uil%uvaeHQJ-aHQ)+|17jKoTH%d4Z9*<>nxXd%xjaT zN~%2;ixOE38>uU|9+uhbRCDosQB9$o>}Y||61JjmGZOn4c)mL}rbsw2F$7bPIa!^? z6Rv74D6;nF7X8X*!|QNH2{PNn=93!RpM-M;YU>ZXP&|FVCg@=lvHHy$;6}Ok%s|W3BIqHPv**n@)wUB7ma!# zgk_N)`jz_gM>gd-H9v*_;Mt|USv7(UJ3+4EBA}gp)HkW}2d&%BMu^bQ!Q~#rT+Cw9 zF7;?BkC_QGU6RZ0K?pV^S4i}3p6U-4H)-0-^5!%GUEef>YqFL=6s2;k>;lr?pwDB; z6|TGhrXZ-aAfR2aDkXYrjhb5tqI%R?wC*#ut!{^oMhEDG0=IU{fl*_wNXb3pLH%f9 zI~gO&ECNr+OpHlN2C)_|4X}P$uPat+sAE?F9&l{AV7)>DrlOlg3OgwR?VX%}l&%(U zuMIkg-cGmfVUwVrHd6nS^txxqcO|hGg26~ds7@g~!%0SCPhz-L^3Y%cQb`I#=Vp8! zNsRVMmIG}TzyeisnX<9tI!Cn0Cn)Az!7#DS_0yPh5mwa~_@oqGBk|QByf}}ZlekIU zntZ8C$ZO24?7IUYf!y8M>MP5qtjXo#mfRs`DR_L*oY8u3i4O?U1p{3~EuZSoUq3Hk z)R398>LG7s3LS)iu)Sh+n&H%uo>K=U&$uoR0kO9CWW}7Ew4TtxxoAOd7Hx8uYa4;b zP?os=8>P!Tme|>>WZAz}rHfuau7Vn?kpz^Nq=zyGI(>j!$}UiLI|sX+Z6Z}aX^fP; zXJhaMzd0J;x@>_EE1@b7LDK=9dL0&JyGzL-yb51;bwdyS2gHF3;JMR~iH2J;w;0RI>KMqJ7{-4%G6 zk!;@^ajR+=S+-g>u{-DV(gVKMZqMWL8VEO>S{!J2WJ9L{7phkq7r#ms&1r z9~K5BTB85G%V#6PPxZ$Nm)@*ZCk9UP;WqK)I})Il`Xv>XVCI>Cjq9yKClgs>hvb5eswmpe;)(NNex<{p2QdG z>TA9>JGHv0pmz14^el$69Pfc*7T#CTXYP}I`c)Xj1pU_NnU`#Vo#s6d5tA>4269^H z{l2NgKbp%H*g>~a0nsEMk#$)yH0b`NaV6&0?3`7e6Kfty+jKEBf?NoEWz3l=`ah{ycxR)0Ff;!4aW!?~yxm?}dI>Y+mQ`+>t}0 z*bP0IuFB;GQDjK){!kQWvZh#bGb-(m zYs|XI`wjEKl>$=joh#u-K1t4bF|Vg%4Nv>)Kib)h5TE3rpp?57%N2`{|j~a zt7Bc_mx^fmsg&8TUvS~fs5>KKW`c`Ygr;5ox+1}&bK~W+z#Hk4t8PrT;X%keMPt|_ z?lwbafXg%;MHBk@TVL>)e}Us=L&K&paS}fawYB(n`u%(nVnxRqrR+ZJN#35BF- zV;!n%u#tcR+sfS||1dr0r3k5Vzdx05`c4nHcV)O$m?fH^%?%#;tf=>=N0EG?Jb&iS zAl33*`P+=uH0w`>;B?s1bhpB@N8CzbeSHu{n2dhSPDn-E9rQ ztrDRMyW2^m!Nfnf;))$VjJyIUz4&vtXN10087_82lIhd{KptdAcxQ*)_?!~;`p*6R zXs=JRAAFyT?7}2(w!P=!%+EZkp-yO9u)9sze;vE*7z5j>x)>-q!f@Mrfm-~LP_7+az!d43WdSBvfT%qT@qi>=;bVD72h_{PA@eyl`_6kRCL-{hNQ_Z$|@2} zqHWV;tooi=y)q^eQxbWl{E~WpP>|axHxO0)`4`*sQt==R1yKG;p>=|_Jgtm2Sh+O0 z9dn9fBS^44!NS21yEqy#2agAALju>A{7 z^u(x6xv1Zm7RfGO4dd7kQhu%IX;X@&OR0Fdjmn?fpKXVHAXU0CJNi$eIncd-Nuuc% z!1gLsaX=HfpH9kPu`85Q923}l0% z0Aj=@Y1w=$TaAbP53Y;4`~A`l$@A9|cG(83q;F=s5_vzGk|CqJV)f>W0eu0m7yQj@ zW<8y|LG2*K*+X8Z;mkuQ1s;e9otCK5XZ%oO*Wm^OeGb8G=oS1`xAK7BHJxX-KAJml%?S0KkCcfDwZJ#Y_p;$caf`?ug&2LH!wotPW3_}BerQ>P~kp9JMhZqzm zAa7b8e(}ss$?uolVoK{Ex@$cfy*oIp-c`whf3JPA3{834IiZiYnwHxZVS3hwAFLYC8-NJPx^B> z)uqa6a9#?AwnG_P`hvJSfOTG^esac?JIzzT@kW5gzxx$m{3V-GdKTd^xgepP$S<`S z@jM44>L*1~5l4qsar!Q<$kBH(rLXnD+gy`NAto(}ep zjt6nH8DW~irb~M5nS$z9cS}uO<6cu;ld_HEnS(nSm6wMD7lRE&KSGA0PxC3D;O@m6 zuX(sOEHG{@@{0T8Qf$cWj2#&(V^eP>j1r%)6ey(`74&gp`LANq)t=BUF;hs9$-z!7 z=SgW#atHT^U%Ll)?%VUfwG@=O{W52+KQj+Nhz%fxMGXP-!MX%nkaWSqnuzK(&w|wp zbgxaAO@?T6Ko`owf;NH&y9k`l^5N9RsS^0WAn3dHk_5?Qd*Aji2-R)9D{Nwq+0h2dZCx zr{;8b!mL>BeeEw=tk>1LdgffNa4m}`pBJW$#e_@>z}XM9>$JioT%!Lu?)e_@M=cbK z{GMFTQ+`p33*kF@JwrkMm^GCV>3zgD6Je>^zb5WTmgoxx11K`Byd)QoSoH%pxB0_Z zee5g8yT0cFQ(hKoTu_jq~fnIbd$yR2`U)elvgx0t7^k zLgmku@TYf(d_}(JbxV>j@W!_ ztvqU&G+i8W|5{`3g;lGi%dHpFefmKr2D}Cd7VST7@1G?<{rS}0XghEoB!1e$MLAR( zvmaQ0`r~OpPTK06k}G$DNDb5W>S4ZN*@M1bv!_otejACihT{K)0UTHxCFRdfZDy+T zx2W*wIE6=;2Y=fhU!6f-ffCe^{_X3>Q~lNIA6b0%zvfdvV8p^}fzGz2D2WvLiTd*CPs%O(C9B)Tb&x@tzY@ zZXZ+Y4mzu5*jTLkLK&Jv5G+Aa^k|olH)5SPcGFYz&d1tpETx7^_vBULimuk@MmiKo zXCHp!N=i1~XoWOaBjSMDH}k(Ae?RDFI>&9OfAe~kPx$5@dH+e=8XkiPz<&{YTx75Y zaX35%Ha>^X0lY7XW81o69Vx-OnS)oFn+^}xk%dAR0%bgN%5Du9WB=xm_F=uu(kg6Nz+X=WU1u){FnEhLreJ{&#EVXEhQh;Rf`XE zobMnMdVH&QJh&;QF!pEO^DZS=3VZ%Nc_~mKIw_6z>h=pX$f4rvBf)z)#u*uEugkbr zhd&37?ke`Lym%D2CX*ZQ?k4q&*Xc3P9;4}^+{onGa{s>ptL_;n4@{Xy3-pHv1Rn^j z;B27(RgUOMM(OM;uPY5-!bhxmPtQb$QY`5)qlt`4=wCw^>F`8RJ|%>0F!RHCrkkS1 zf4w+3vE9+sg1t8rpqeeAL!Y1v7N)T75R=L!-9InzLS!caL9uoQdVPmvv6J+1zqhxG za=2{u@sg_oMnWJ!!D+2$Iypo;jXC=0s88j8AoWtqC)(}pa@uvBu6t;<<&hsX?DS>` zLqf81e|1!1q(Zw|Dla945IV$fdHWX2QxxZqb$d1bbG*-t#K922AsJg95^CKjC8L(8 z5>S!BtNN&0sMr7O_(-i=#@$M;ABHp@3zNX$DB!&3SR(z|*;tF`**8rcv_g7F!M&T; zS+y~T1kj-B$|ydp?=?{p&Uc05wi<1zx09@E9vw!BHc%5}tV2#W4{@XpWY*~?d0NVE zQ`*w2GUEZS*{fc$jgn;PBv4UzjX@{H!uPJ{mmZP*q?8sfFfgptwKU8t(%QU1=Urga z&XQWBhBNfa0d{92|Gph?RT#l@bw5UyPMulGEKOe*iXAW#SHnOhB6IdXsS`$DzwLIL zZk2{M>bD06gOU5Ry7lo-Y!Pd2ALZ#5+SCnrw|Nu4=dFJT-yV=mL5Yd zByz~!V-)^^M|?Bp6Vi|I^?A-oL$Cy=x$FwwW5id0xdwfQvsAz3)@6=oSetD z%3)?#Cz+ML@_I|H4Hoem5 zFcPft;izk!!T{&Vg8J%I%IXcOJdMS2zn;KrWZ`}0{5L6hfOa$Sjn`-YY;Dib(UfE! zmh)+xURi8dQ4Qk|?OJhq*l+d~awT_mW=_{+aO+fVOjh^u@j%LWC7`A%_A4B?##y%Z z1TrwoP-sP+!nael@H=$Era~`N75~~tHPuQa0<9k-UaU$hVk^hD+2*84;Br;kJ?YpJ z?BPf{GKC24B7L7N)u!2G7?P(o2d{d)0L^Cwva+Iq07(PWw@SpnQTW0IQZZB<*A0np zsUlA=-u}-+A7R;!f&qcv>EqNo14$sw%jK1r-_flGi}ojn1iyp&t0|-VauQ>R`0Wum zNS2HbR&BUK)b>e+ibqpD=32jBwWBv2mqbHawhYM({n|U$cy4Y_I5vgiXWRn~JOg#h z-@XGp=v_(pGp!LlfR0kWvv4|D>@ohYsb)$(B04YC>8QA;0>tDHv%>%&stmD)n4|rw zqRXyeNE!fQ*VXU5`SVq4mG8!TL#-%*Z}nriu`3Y;kO)J#07Jo2o?>e!JG>gW$aHJ^ zI{t2KrJNvK;t5oLhDuwvpSUQKsP!g@n+Wi2)3rm3LlTtZMg@3glW@9IC9iWWnq!s# zCPtzi=B17X6HSM|Xqxv$R@4KTGY<{2>y+RAsKeq5df_Qq)wE)7JsG7w&R&ZvJN7Fh zmCcoR?siAAgs=uj6KTf@?+h=u50&N=xSbska@ISG(3Gqv$r()Zx_o(+O3P!{fHC`= zHzdR09y%MLTePHgtEZd_t+tK&H+A%_f-Q%(SDohYI=3ruvfYzekHT~GCoc6~-Iu=) zEm%yWg03RD@eF1{;r-ArpG7}y-h6u$>mV;6-P-zmZQ;hoR8NX@Gk0E5t88u@D-Eb# z2%SnFgi`kt!{;74%b0h+#6|q7S$7|~aCN^Sxhtal+GAk`w6~M_AFm;x(;4|DA#xlw zU!1PT+nllf^|Rtn_aBW9WkLmQoh)T~JuVD#sdB1lJx}R8y)@h&H{UNIc<+bPH@B*w zEt{>&8Pupi4_5;u@3ULMmQry04k*qzf!$Ad&oYi>;d@{+|98>HgS(yXl}ZK*1NTvU}P?MoqZ4P=D zW92q4b_I#wFXm}?+q=5So30#Bt|obC7BkxfoT<|QBbX{H5qM8{QN4vJTdITtBXcH3 z;2#+0`RyB&T;}e75vv1c<4vDV_U$gH-S{kVhp1wc8Vg${&(f zntC{G$SNIS4NN%W$gmwY2)yl;1;&{K65L~Kmk~X=&yaH4Q%F$yK4n4IPwlHP&xw?% zhUJz9M|V&sqZ;*x%`DG7-w9-@ukpLVV6Dw`xf7zx8*NjzwwW`Y_%#G|jJ<&r;G{w6 zJYa~dzVin~4hO8az9e%{Nca7QZ17Yf?;0sK#^d3*TPG+m6#t;BubMfBxVfD-vbzY1 zRpy{FS)kn-xpPjVtq58S2oz0E*6YYxG(F#H0#(Bk<4?*S9g>|vNE#tJ@J~z&xCQ>e zp9#y^R$~ZaWV0IMPS^c7iMdcdOKy>BnpiZgcK*O-E2RDSD}=;}-8qS)=%wh53b-X# zDVIxJehMnjcQ*l$g*&|@!^gLJRy*WTQz`#G&|ARi7VSHXAl={WA?mqIRLxS7(NVlz ztIif!BHYqKubnZO_Bj1IhqOTKXZJQ%r+pMiVxFO^f9~1?e|;>c*E5)48p(>)LjON} z`09`i3w5hAr6n11c6Dy6yi@d%gtDPmuk~Ejae~YD?^3Vddbq1sf4|JQ9bR@G*P9w2;rAPPu z@#|~eTVGm3&wUlsK�!2M#*4NF{@5pA}@R+fpb0ED3$p=ADH^k4M% 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

    ZRrQo?p#xvUBQDueBK((O~scOg+=+!t2EUT0% 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 L2TVu+{Hy=jfIkqi literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/src/largeimage.jpg b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/image/src/largeimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91040552b4bfbc02bd7f21475b3d7ed09a408808 GIT binary patch literal 336783 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

    NWPAC?QF`4npCbV@tmqncRW*_E`hc%`Z* zoqK7cc6BpDXFPsOUO=)deqJuiY~gQwRDlddHy*zkH=x{9<443Bv->B|@|prtdW9dQ zl;)C^hL!!_wmaLxLZ)yx_S4N6e_QJMm`6wt+fmyiaJTvep>~pkY3)Bi)vbwcL`3<9 z4Ub?E`x!&EJKGOT@;y^y-681`udILDU$sq`3@7H5t91w3XWib$_@GxW(Pr9d&l0nv zN8rh>jo-NaoW-09393astY8g3bT5ZiIwqc{I+0!E&sk%O4$6Pg@7A8YW9iXM}{TW zNWO~-SVl))US6tXcuv}i6+W)^O5<9+>r|qGz7|cfHUGmUcP0+>8C!x~nx;Z1%loBL zUmCb&374zW*36~}^C#X4vXPd@;sZz_QkNR|{j0%+*vzRf#Wf9W6WN7Fx8l}DZudE) zOCyszQBQD4*!j_b{1MNOt1I77c=t(M=GJE78x?~__vde)4DD@M^5s{v5Xc}_}!^pwX-LkWb9D}U^7THQjNq$l8zRxH{ggwKt44NqZm2<%t*u!1qReV%YRtat+E2q6Xo^z_#4>zy1QB6+n9iI z)674wGM%0O16Yl3KkOihfDv1pys&Qs^NTM8of^0F%@I5ob5>~g%t3K;)6J1mH)0$e z9feQ^KF%HFX|u&$ani1S3$-dkp0cLjg{Jw8t$km{efuq_+`xEXctkYLQ799F-AcZ< z-LQU+`xq?iys^MZ8-qwcUj3N5Ve;mC5Dr9kr#Ig#!A9Y87&NHR zZt52P$0w@|cPV=Ny^<#zzSG*0K2h&>g_O2@+3b65U7F>Lvc*f=EudRszNCe4Kz?Z= zFftYhhXV7=S!;;YSLN2K%nqcchadAfte?nVNoSDrN%byXx-3sBe`7S~uYcP}{Il~X z*-BpEq=>ph0VJ~J*I@yblKB}A@oTA5R~9eOi(66hoAh}iXS~)<%l%bRK~KBsGG+~Q z_FjLfHjiQ9UVYcWuWcm4*_pXSresatyN9L;?k9*zA)RODM)_TNE zev^5aw9LlEa=4QDFU-M2uD4Z?Hqn#mg>soIL@ZkCY3G3F2EOVEc$nz*yU(m`w`b>;igpk1DlA5 z^?pUsZ;g$4qBU;kgQXz_)IdQr!9GvjgoJQAy464LDs`BN;Ye@BW&?B6RRO=`IiP0an7U3;!ZX()g2xE4v z3W_(hBqJ@e148<;mds?n^%XZ&mJz=g+T$FYs;Pl)9r$#C!t%-8Vo%E?H|^H$o`mk1WxgthuYFK;rYVB0sRHr|L~U!dUz z(IZVnxYbA8ki8WRZ`OQdoGSF-Xr;3HJ5@RN_WiJXzv%xz@#%f^wtO;OHWfvx-~5dR z5g#@kj6xeS>6qGe-jAhX^eu{aXm0=u_D+cL!=p82JX2!B*W;WurT{mGdPjYOal8nqV>|GS_uFuYA;|cc^qA;Hm1=ZTG z`vG&r29q?W4*L2$DrD&&tsc*-YVjG53l5s_U3&on!@nwP8LV7$dm1Cr605qpyk>7) zrzIH?YceD7>)Ms?-*^f|FJp^S%1GJIVHvzaW)FQjo|<4uW>h*i8b0%NX{E0sn+=-sxF8eAl5qq}u02BUH2|8T7DHELg`ckeaj*_c$6 zl`ove5#~!W9i9xw!&R2$K`L`|8T>L}eyOV7H&_7erzmguZiIo%X!(Qb3JVVV?;Yzr zQk1;WXi`c8D!vbC#-+7F)rnWB9yAJm@gv^SpCctmcDRQJFkyHkhxl zAXpnFJc{SO#-L50kIukZTCQ<_)JD6k+=Xp_`gI)bl1hf0Ck0&U_J8Wu)(VJ2E??)c z=OXMC@*remu+%<34{qr+xqa3+tLG51we)Bu$N?F&%~wiuSTqprUNB6+N=q%r-s6ZDdkp=y7HVt13`{g>r4Mm(+;5HFB!_sa z2C*QOLvA0yPA@X(Cdj@si3;6${)F!}U7nQnX>>Y+ydR<9{o>$bk6o!LFUfQ?)t-qn zI?Jf#7Ws9_uLG!;(P*t`a=obM=q@1RJVrtq@z?G&I`7ZXAdAg=O{dJ>(AhL8hqWZ_ z-;Q)e4Z*{}KaHPGty9bK;)=Q(e|-DOq`C)uL=s9IKE=WydC^@(;;T?@hnJ^|{VRTJ z+J940jj~0RS1MwBYb;W$-u+u+q5he)U;3})n$@|E)2zWl62|wFnF-+25xNBLn?^vD zMOw>`Oiyl5*yV2Zvd+xzNuAJ~7z7>DUIdxamg501HS>s@o6xyE^+LzTqta5J?b#i4 z&38Ep>ti_id0M$(<<3Xv31bekLx0xGGQEs5(ws}H=#0M6X&se+?jFupdWL%$-a{71 z0HHLu6(hN0MbceJ_$`x*Y7S}S_bNy1Y=I=yG9k;L%hZ>_ATY!wdc=B+>O-tjC7pB+ z4Rw}sAJb6k{*0%AiC^SKWFSd;&GUxwQzq=%6XNE;PCl@&A>?2Yle!br5%mytwqL;S zb$4Ri^H^ev83(4rALDaB`UKEv%iyqSsK!;i#R<>rc&D0w7^0@-Oa?%s=Mv|`Ow z69+n-XdADMoMMPHWuJ&TF;V0l-evf5A`nZVCrj7!^tFCtkU&=!ZggalMEPP1P#H{< z^H?i|e&9z2OIBhr3@@OqO-%LK`D#B-U#~Hqh)h8Tl8qnXj7{T6;Hy7W#r^}xY_@qF zJ-u=c^1{2M?Vot1_3#q+kJ^AwO*XhrZgSqOYdO4suTf!gsba}0n?zo79xvVnGHUCQ zCv*~TMaq8_VX$k^Vh_*tV?rV0HSYzfu#&??IPEgw<*)SEab>#TZ=NmlZ{o(4Wum`8 z`wNTo!Z+^2W!|J=VY&L{;v`#H(lbv?a@r?bf}l(PA>#_`1#=hS{*^|MPpIxza(IGy zRsrk$&)tsssgGD4ufTnaHKJ-cnlPN>Iiuo8cH zqm%mK4fb9S>BE5y>64oxychYaI$4H`iExS{Oz6jcIX_{V@xE#%t|CV!%rbTtnwiC5}Gy`#lZQ|s;$E`ac?qq*5v)b?K@Lf53&T` zJsiQ{0KX0&`%G8+cZ+aL?*|(NSgZ7#B9(S|E*eO9x%-Qe$H_vrk}Vq#6JtEj#tkeZ zNqW92ZG|(2(qPKYwxqP^B1Ea$WV@mP44ZG_05Wn029k_|q{X>L4RP=z?tP>{4&5K- znE<+)UI~L~u#N~V-3u~7w7P%wH?u|_h2#D&&@oJ%mxJqlZtw9k3cl3iSEw1iMXria zJ%Ufkz18nMDkpae+QNHYe-D$M`(fX@-l%;vAHntp&^RJUhB#=}?Q)N0xv#__H*ZzC zp7JGgMGuyeCC4COF7oxhqe7|!7UE#}6S*gEAiQD=2K)Dr(HxjK?HUl)b9NQbxWM=pdp8JR@Vo6iARfW18P8A;z z!cScW!&`NTAueFptSXz*6Z!b8VcS?$4&q^8OwgXuYE6-!@Y;Ii?ItZ4e=H$ak^4f% z%378R{OF(SKjcYUJ5PeR6621jl~uK?66!R$Utv(v#`0rNv1_}+MTR&3hs4*?$oCpG z=y%0@f?n!>6aNo71v{ba@5jB5lO9wU?A~sQU~n5%oT7w*uQmXF%n13CYlZih2>X0r zq526*euf_|pi%L)W7-=y(ZL;mFXZCF^xR0lt1&Gz;cPdh>qdi8-3$SX6Y-hy`(z_K zt*6F8H-2L;%SY{rQpZ6~hmq4da~j1DvptMRui|)5jXG zqv{7#2_kVtI}R_mU7ug;1iGd#O?&aT7FY@GQQGx2MUb)6qFF~lzoDnVhqJ#6S&0EU zmz8_NMYYzUVPZ%UHC|G6 zI!d|djL)aSWO`FD2%qp?x33ZlJNojW%zE^#ui4(9$d=GF++hLWXhHv!bGX?}^6Sr? zT31U;688M`FOIJL)n#EnA6BP!n!y}ELw*WriT+0@a)qqU3R|^^;`=W{=lG9Z$DlsL z00gi98Zcz=g-03>_K9U1;H;&S+fOTn!|k1^!l2QM*=DxPrB*d=s)X|7kHZm zIY_5ms`{Ttc3`^RReQVNUQcSW_^yzWovC?nI}!bXh;RS`GTI?zc}1YzBdd=N4-2Kr zio!lMCz9Sk6g7lAXvW2s$NCFN%jc;E~HGJ?dpXjIyk~@?0 zsrfp)lEZGdTp=QRK&8%!yhH%OqryYMhC`|=kBGeM$OTK-mmNAar}PK!^{dnG`*kLc z?c&>&t~U!eIeWK?!WorFw#9WHHhtzXS@_B6-(yp9uIe6EA*7XoQgha=LUaauX}2oB@yP$ZxLxc zxov2a`J61z{8Z*j=i|qNVO5CrinJKes^clN{SD`F*26xJzLgR5L3wB2iDMfkv`zd? zhMz{&5+-RE4e{vPI#7zl3D$qVd(E1A@oqkhf>1}C0JC4V&H8s`?WS?b_7^$mF@y8_T2_P}SF} z2PAx@Zd z8M<56>Btd^m#=(mzj*yH3Jwmxk_wgR>O~Lv3-nYqK@pgSxBF!YD5bNi@`B*~p7Q@; zt#eh~Hz8kb>3dzg5_;rL#ol1PzJ-KXZORos_qt0}_;}u<*aAN~=90q!i;!nQ0v695 z@H_;O@_1QGSo8o7mH#?YOSnBLoR#o)bwDw~o-Egu?}L50w{7NP5oaQ(CXMKR#XY+F zJOA1Gy`OO^T=TzHb2L5Q1}5y^%xQ_yj>3YLr8|!~V0m~%{elO_U`SwstoYr>^Il3v zcg-4guTVU3L1m^d7&`jkVv=w?B-Q=yppEcci@3<~#r{6+ODlKZ_u8ws)pEn0e59II z*g`X>X4lXBgoG^=(8rsk_q5vU*VJFQE~xFVM{?#^oOOWL(JV4Ea21`qM=4vY!5caY zwcx=eda-`wdpfo82(?FfFO;^t-IaSidt)yi34b`%&fUwp%PnY@rIe8=NbW%AH{#g| zl3M?t?SSzywP$>yI4LjHcvDSR(-wV6{<^u+F9fuRjArJBCh){rvEnG#CTZ0dov_Oi zTor>BTF>~xXhVeEihk>j4R7bc{e)~RtymDM296|FqyH6==M_EdB5IN3-fP}SK~ViC zak9az+y6@B<>ZZK=o%?gO#)1eIy@1AOa5C2T=W5EO%+%(agZ3<;AG#cf4G3WE4o+o zPKw2y`W5Ob?ln!AGf%rd#tN8=syf`k3YL5VP(lY1$|Hsx@Mzz&-T|2l1cL)$56nA$h#T|;fyL+Ly z6TCPDT4<5t?p|Dq6o(=~3p7Bn61cxSzu#|+{5&JcII{OyYt1ikw6A>6FJzN6r8+t=C)<%#C%r+MaY|m|K?8;R}-QpFWX6PPl&=FAZpSPOR zPA!Ea!FJKV@Eb1uryIyzI)d6I%L+FZ{W~F9N@~0iXj(8@iNxyYyFUmDtRe5#tJ93_ z-mtN+REf@mK2Qe*)R6%Lv@$I6Z+nCfTwWv9x3tb-@|bmAUY$oU#f}M-98hXylQlNz zPU`mg-2>^9!UMxWLV`O&ad+0)Rpgot*IVl2RK_bI;vV*a}+wkYI&L&1v)gdP~1yzMCYHQb?naFPw;#Bw& zB;8F6~wGzkQeE zzTm?Ubtyclg(*IHzb;=gAU_8dt+weC=N%Fr8C`}@${z1#jg|5XsI+kI&Y4sfR! zs*QV+j3ADt7b2{kAqb)S>QHyW1>RNR<8f#@z3a7_AkRdbQqnT%B!?1!v02@T3P7JT zX@RhRC=Jx`IN&9kJc`#qauWqrMX<+Sm)gZ)WsP{g1ED`89VGJbuqJ#rohX`}FBVpo zWebmld14(N*Z=Uw(ml7tdaiqsexNv_TnJ}$QwIW@S=ufhIwPwLo_AEn-rX`&4-GYJ z@~*GG;708ShtvFWvmz44Zn(v#E1pUBIuryC`a-ZUBIl=+wXla~-$fu(oF2I3u0+~5 zWD$(`$MfNtCThZpDjzi>Mf39|#kW)QC$Q4^t!g$zFVsJ2ep+`U?cucI@Mw0+wZRD( zwP_?!^6q3Vo7Zu}+F!lUc7Qhw(xj)rTH3n%+FG-&>16QMxmS!-CXBZm!_Co$#Gd-3 zWvM;?1MGHMGPkbKS?!gSLR5WqJ0`p$aHP($nyfS>U` z2rYHIQ|z&F)Cz7KK|8{|;k@ETdIQ_)sjad%7a&2ATqeO399xLSp7qWhfSW|5c(=NR zI*?XqRP&Q&483J)r!DQJRv^JS^!5(-QfWf|)Z#j3b9z#>BL z$LF4(79^n_{0*>;^UdO12#6gW>1Wqi9ifLHzX^tL9_S)=mLY+UWzuLRV?4vU%Uf~R zJ=WNYK1yT-e)F54`sx+|*VT@Xpb>u0Y5DL8{&`qhZ47%qM!#{z)4l$Z3IScpFA>fF zXf65tFe|hIEaId}RywL$X1eF)*Z?6D%TGeHQRkdQdsnXn+5pYIJ zj?O1NIVEqLW1&A7$g|^oju75^(xlXWkSsqbd{yAt-Y)Sfsg5VJ{PgM%2D)x7)tNlZ zrWr{xdvOe3D5VJFzv|hqA2`q?82+=jeVo!jtG9YCJnCW1ji?B@9!r>ZUQ`+(7pF~= zr){#dsBvLH4KylQ`0U__zC$=@GrRs{u*Z*D+HJx ze8mtSW>m?^eStjNys~>tOHyiSVH3HENwy;AJ$IOi+w9#Ve3CL0O{e{Pqh?yJ3 z0A`q1)rlxcLe>~B&O;_oFF#}yq%D#cjM17Ve=r|4wvXp&iS>u@ybt-tWcg4~9VP(h z?ie?2oz>rev*DF@;5I8TwyM_Jo4=(F6O{LAUsK_pv2>0y6nILm$>RU#u{*!1HE$ku zi+zDQB=8w8sUq-6Ed$$dcQ;FAjvsnlCcHa9AF*3o3Vb0@bgA^9XI!<{X>s|-J^7LA zdfnsNn`|#?-0Iz9x)Sonya=|^=}}jGq5Mq|Za)~-amt}egSB(MHo+(_1+3yyx3+)g zbVL5n=m(Ase~I=sr&pPtxE0|ZCm;Wy=;+e0Ez1O9dUbzSOMABpOTQR8xCnj0mA*A8RKVFgK&9IH&Cz6`xIE#wt&2Ye#(RtF7 zLNL$s-)FZsa6qR(KJOa_(%HjBCbb{AlH4X{In2~LB59%Yg}e#$+z-s~(tXynw#_~i z{Pvde2hTHJLf2J^{?DaehW#m1ejYReUG0jFJlGIGg`d?ra;AY_WAe~)$NiiirjPOG zuCKiT?xft+(c4{6VxU>1!Cj1i?+$M@8OFvG8C@ zV%uM@U!zRqz5<9|&hHGKi+cQXZ0eP+PSvd!9X&iKmZu@9eG4qk1w+Hia?P_dp&+AB zC+tE8bV;dBRhb_N{^+8grceP`tc1~2nJe|{jgFZfnV#rx#?;fUvH zrL$WubYM@|10<_J9c@wPU zz@J7mVa`Ukf-QqCnUwZhSv1t=i1O_ zUKf)D0YToqq5h&WWQ9xeng-mSb~<6rztN-$#3ndUj;YRlbsQ4W^CR}Ce$M4Rmp>Qy z(2KP0*;(t@&>nODh{RMGljDTahx}rHG4eh;4E)@xO{>{iA6QMNL>cWXn5JpoSx~@Y zutc%5{aN==o~({Okg3NrvmotGo4-Tk#|++jP3Z^=@>} z8xz)t`I; z4b*Ny6YxirS09g2ohK9yQjvMsd{~2#iFZ^-{oDg3%d?NdGP;6`o6@vgzv^E0tyzp3<$*vL`SzJxG${FWUg+*~q) zYb6onRa=?!W=K`p7TR!RQ~+eGgJJMqCkC~@>8S&79kE+09E8U*o36)Ut@4=8jLB@xj4_|wKx=jJ zr^-nQ)>#|zt?f~w3M&fCgz_pZ!bpik!pmsm}b_VPtYz8(r z2;*t!N~5K`s;ty8@-F??FInGaaDu?-QIX}~VpR3OQ>#Ypr{FN=Wg(oe%~zfug@5){ zmioETE#j?3bJBg4Iu;)jKlVN?ku4(Jl)Z~zl955^6peN()@^^OFXdf7NdDu#6pv58 zt|E17+@5ocmO00{E^8B!vb6SaIWqFD)*Wt7#j`%PONslN*<0KYoevF5jLz?w@XV-$ z?&n_*GSwirO0K0*ZnUjPPpA(}2`^}nwM$wKwdu()prNrpylz`! z1O5EDtXCK__(6`VDifXuO{?&8DjpqdZ7=H5WvmgQ#$^WO&YQv%=p%$S?m* zC;P4QJ6HYNXvYh4o=z;Jz@DwB_cJzN7Zr;x$Y}OO_W4tU(>!K@|9=2Xgg^)BI3r}1 zyk+{jxXcMxML+7g1C$nW^jwJ`Z#a<2qx;gHKw6jk(LH0xE#S__1DE%5RE2^*r4_%t zQo~m>q+=}Nf&I?~%9Ydb>I-?6nHQmnl@i6Z2jfI~Npj zYY@ctq@CDi@--)@D6c<*{);i6Z*lz!wOzE1w}8k&M`GJ_`JwtZSJ!=(f&Cryl4Us#SLL(a z4X6>tUN6Y{ujJce;z&^-@mAJZ&5cx%z|3^Nh`nc=S!M?~Qh`WC`dUP&E<%67Q}14* zuebH1h>*V7POnCsw>l>1u-}$Xj<)B@>Idbyyry3M2t z9ln}R{Wqv(FcKv!OP|{@q*)w8s(V$qd~cq>+1ug_2Pv}(k;;AKh4P7 zi~0gFgf9R%3Oo>JW_?;aebzbM5wj!9(mMR`3ar89ysm@8nT8^Uk;Gaea?QCvzo~u~ z88ax06=u<}k)wWc?$FU_Vn0b>C&dx1ZP82Lqe49!0h0KW#2fHz`((TfD}1kD&>dP` z(Pe`kk~sra^~y)-L>VK@1yEylEpc)x9*#p$O8r%8hE14U$f9WMyk>mg6@Op`+o&U3 zisd)r#Vw@Fxel-7XxWQF*=JZ57bW5hEevoiuau2HF}*C+rXp=sBbDmaLV1@@X$iu)CDPSBt@Uj4c|dU?mB*Y*YR$r+*?n%Fl1V=h8?$#(fx8e zi!eWSH-aGKA}*||p^1sOes^k`WUSH)SPnyfRv?ZUcbB_{B%d{U<|JkwffH<*HDOWr zEv;GO(%K5e!e#_ zL@Hx$7wLou(Sfc9#=0{f9Gal?Cq)wJi7Pe--Yjpjl3;1M)0JMqy`P9~hD4A0@@Fl`P7C((lRI0t!6ym-s>Yb6*qn&bI5MfV49zkC`8umhE#Tuai~B{F**L zLALLKm3^;8@fwW@wS0O6!yAId3g$ok0ei=w z0*}q}D>5^tSKTnWwiL~=Si5vjA~eq!$#_Q^lhzkBma1n$s=j!TKU3(@{akJBE)<%B zbTvn{<>bkfA@%iP=da#>3L;Rw`62GVg$$Ql-u(mv+S3n~q-gYZa=L$+eC$oUB68=q ze%m-W4@OmmM2Bp-Enf7>hquVP98-40^S0EeX5ko8p%av&r1=h{tNruadmrB-z4Nh( zJ9RCJ!T%4L=hdJ9fk@mCx?hI;UdU0O)m_#@RAt8qoBy|>zKzt`Z{w9F7#o*WBR*j0 z$1fQqe)kEU1G&=?{>)h-nNUin3CL&jnKKA_;wDSR$1;laEb92c_N7k_RZ~j}RE0;z zWdYITg3QXEpROsuK^__{jR1gp)4c0tullF$vmcvN@q6uK`RRe`9vU5h5`f40xDNlS z@T_w<+4AS!wEa+%PdJPmkx+p~yR0=d@vYEfmtBz2=Z1s;YD)$l@%whsnnPl56g2v> z?7^oBr1FKZ;z4;=G(F6GWq(P%JLwgNo{u}(1*6JFjW{@L{md^*+pD@)^hp{yo|iGW z8$i$e?nU#+9usFfBYC@lGA9@}?!Iyim35W0KpUoskK6rdsLI2Y>p|mk5lOE(OiUIn zD_2HDs3kqwFfB{uM)_~$6ZhS>(4YY6jg)Wk1vAal{pJHaL702qeA>ut9i5K8U{BjZ z_CL&>iGQMvSvJ8~NA^~w%;1ZsnRUDgW|x0hyW>NpiN8Q$$~I*u5)NaZ@McqrR=4li z>pRG+k9s#wRTk^t-fm24g9VuyUsWm8XL1qBrkj1`k>fPKB+~wY^kY&hM7Ns&k8<_ha={ z5iO01qrkdOkrc?tG5oj0f5W z_1KNC-rsz4VW7**n|Nf@?EN^%`nvmlAM9U4{6X#&@E3dlAuaV;I9SgoNJ`n78)JNAW*r z(0i)47>%RBQcXJAO5nc-QW5@660*eF*jaXN-ftG7n_qorFBUOD8B^8GqLhm1P6wQ2 zZ=dB|epZ%sbumFdO9*kq@{RN!jr4wZKk=&X-xd>?Ujf8?Nhqu%AntHBYLAjV2mthj z2?ua>X1JpK3larWblW@IywdJ=>K_ZoX6e>Zb* zyv+}Fe(>tVk|llA6twa3rD`47kFzt;l=mPV(fcyvYpyQbk!yIO4#>r@I3cbe5Ov3n z5bx(b<1^VbI~AdrbZg&R<^q%Yo*$Hyz9u6W^@kzOA;I=(hpL%tNoM?s^S>UE9R%-R z{{H9@#0D1#hibg}^RY+jv{I1%2ZN+7SXTHcPKzntO))fTe&=+flMvbciS6ayn|0iLZCu&AVrB0E;uKlP zu??Qop8#CHpFD-%-);GBpVmnc3z+msWj?C=oAF>OQ=_O@9%Ssq_q@GQPB?U1E*Yjs z^Dn4y>cIHIRYkU2FYnPCsr_S>wnhXxO}nNzuS-MMNyYFR`38PFj=x%>N=?z8G2PqR zl9KR|SV3&5J)(r5Q$N>QN4=m!l5? z%k?0RYp5m5kAgt%c)qUAi4vbE?e&5!Fp)WsrxL~3j#kwG)HFD+hi#1eCTl8Nf$yWa zl=AuJL8fu)-m*>erw{Rx11ZcbKE^|S!aa@~3iQ{piNm9v*w{!NCnXvyI@%<-*u&Y9 zzJI0vhx_@?(Y`Ryj<4|zS1cZ}cCiYG6?fooV7mkYawXzXpHPRM3F{)G7Cizt`M2wiCK%TM~{+&whq z&V+R9*W-TVb`0VyY0A?#_I8}c63an`zd@pk6Ny5Zta(W1VS2nIGJ*GM6_lQjmQmY0 zG1UGkgnEQ(w8UhKmdjg!zZaAxEr%xb`fTQRJE(tI&h~oyCJs!F<#{+E6W9625SR>6 z$+*N}8g8kv?qtRuY%bxms-m7#LIF!K*$4PunT}oCZ)?<_y5pfzBUMSNC`zPKfErDv zU=C$m_=JG~;UXH-tN!&jjeE2>*EWv9j?~BzK@14Lf_*ueJbCOv6a|$(846}8=q;4UgYpFdW)%Y zuz{X=G187&`OBiB`5*C#rr=DPsGeryAn-Gmb`9PI-sTv--K%?w|P;16x=(G*)5^6MnzY*i7(XH?Wvc!^nC|} z*+Ewqk?b9s0P7dePYbatR+7$74{rf>fpCwij_>$hp*|5iSkDP*x)_C;?Tfd zyX<>y1gXNVNVRN|ux!%18Nng)=;s)%u8h<(ji?Hndtbq*xVv%chAmkd#OwYA{}}x2 zEoFhDoeevxOmjdGaf!CU@17>(vB{^+aBEFQiAx}3oE+o!>o@@?X9qnj zTq9;Tdz&JbGh*N`Ac2E=fCc0q&I-XgB-a#p$|eq*!c_A@ zg6n!v>-WbaUq@?c`KA7}6=+hv%Q|Hz@W|zS|3j-t!yV$ZM#dQf#(JgDG=vr%ASGVe z|D|@rbo5is*BjX&oDVj51fpSs-lI<0ZCZrn|EA$Ld#kB!e`0soEO@4blKeA0JQqie zHDV*>4sb)mw%0(w)uUgjt*5=x-?m(`l@>IC4M)s}iSKvCHq#1Nm#CxxR8|MpI%KVixaUY;I-hP7zC8NpD;D@f=$1qj+{1{C@v)RPz2Fs|9 zhdjq6n;am$*Q7lIQwi$_A?$vvgaS$2x$W6zuxu9Dh&5_JU+A3itTOjvrQ(d228^8( zjiY-DR3z@(zeVpPqV9?#n!@^t7MWH& zJr14P+n?SpO*@iW(^iPt{d^tWo7N`+U4_k$vhOcT8Pv=JeOY3S{1mXEpWoCp!rvB}wR545|EWTAkv-F~v?*gTg1Jcz+f4=>iOmSErY_U`5jk zkg6`P4}QxOcE#2)>8{Tt&mRYD)5#GgE1!OPF+NeGlO1V`7|-}jeHubKJ{J@>XTjC@beuZf)r_N3J2vb zhJNI?vQ_SuD<{r@0gGWaDwE@o`yqxmr?S`x(p`9!``^vC7BxMK!X}Nl-ypGot5W$cSEZuppO?1GpZ^Eg|CLt4w}g=WY&LN>d?Z-4 zt%^r=UXF_r#Qapw=<8j^(5*Ut+x8?JJ`+y#fU-+RGOxbC*tt^CZsK(tS{0VkMSYh; zn*io>lzkOqt9l@O>rrf2qg!8qWI?OgwxjMoMrKVaJ=*V0Gs3#F9$VPRAtM5bT zK5P7!W&gU@8)#K?+zl`pb3)H1xgK(n=ksp(nT%AtdE7sJ=3Ynh@sW9pRUwZ3 zK-r?%hjW!KomN70n-<0Pht!Dx`h2OY!jayNf{S|YI-ZrWe@BZdwYO-fTkmsVbJOW9 zSq4ydb#lL$c&c%$@K(2e(5l6;-{-u4J=>U z;zsZ9EeX0Z+DA3zDU_Rg3!oY5%}Y7*e;Y;!X@j-*WwLjX7Dn`yS}Dcd0je+~_}sU> z*+5Pc?zwW$e|@pe8om%;uH+xBo)De0lc7hdhUNdyxRkBo7-mXV5@Z&#V|<8e=hb|q zKfxT&TKtVP&F54tW6gYY5oe#Ei6U!byXZoVItnm0WP<0=%wOz{GV3^AInKu+wfLKs zDroG;c@>mngIvp4`xga=<~pMPc5(AKaFWE|T)8Lso3(VcbkM4^YXzV9E%x1Qze-~& z?dh->e9f#t1F9h@BYB(I^$ti_XWN#gz&$!)@A6`zU!8@2`XG5Whn zo!Qlye59yD{GlSV{U$5Yj&SS%O4utlRPVHpv7B*A$&XsQ0x!OF$h2tsU>?W7kCmBS z>>XM<`HSjde5}xOfb%qktUY6rNgHk0K_lkI6B*XZ%pEN^0r0a#L+0lItRDUaT}g>d zd)01oWlKy`963)MXQ`Ug&EQa7BtH&(FTr2--wWcpz!*{VV-zV0GS||jobrzaRiPct z1^@2Ia=Z3Bi0|C!NWQcUm2EB(gdh!nqLR7UZd2YemMW5Y#k=@JX;O;i0!ctusfkH% z+sIjF2Z8k1^v}WL!k;taw(ON@dV_3r!G<#t5?zy25Q0Z)P#X5&6Y$~2U@4rI z*1lw~+|4$#S!MdplW&eTJK9X_Y~9`7esyk#dFAr9$({FdCxrWrEjcy|i4&HO&Al9w z;PY`5QHCiMDwlAKM;hJzt^ zuyyl*1}ZG?0N8^pS4&>utfT!Dt96LUdiSrXzICD>y>2ofb8j2W|D5oD?31vYS1Rzu zwcXJ8jDb-%HZcvL;%&sD*8Ld_()ss(nH{t^c*K08R(=?~EJAR;>nn~C#YfIud>Dh$Dd*HDTDM`buuEE;;r~;M7iDV6s4f3O7g6M!MiANbZ6y| z>}VZ`r(iy8y179z?+@}3UuPYVFaFsA;!`2L*F7RPp`GBn)X^c#fbj$9`2bS4AihcF zDOCrI!(TZ3xvBu0>vqf|^m?+pLE85+JJ0z@;d7nUo@L$VO*6IZb@MYH(-yTwaoh(2 zOeFzKS<5m~s~%I)WOsyFNV#Q7>WhzhYw8CsS1NV@eGr8w&OiTo*`Mj>My_{OEvzGW zK|3baKkZ*BGJr$)%gguVak`&v}1Dd+Hh>rso zv-L=!cAD_mP6JV2hGI8UB)KDZUt`E{%r&gU@8WTUD$6Ws#uwsFTyax+%tIZIB3IVj z;z0%W+`JD)t-Az5qSXUNRGP;rDdP3clgk*X(E(Fx$lOxM$Fa|9gVcs9*^~OR1t4|W z(WwV2>)2?j>Vrrz7H=Oq#Er$arng;UN`ZZ@%HcK#veWJ^wb;&qNd@7WrV8h3zxQR(%5Ib`QnXjOEaa=5SmmeRKqQ?ZDPevbKV6@M5q}&Ff6820T zyK@E<6}61NVGgh+^P3*q5((50M=eOm7@Vx4g zxN4}G^gHdghYeLOrc!o1rNj!%d9GiPkJ?mY?^aK&h6mR4hb?K~!uPSBZEw0s$3)Fl zNK{pZtUerc;-cAspwQ%hc6;|j+PDZY_>2t3kJKLST1TZ)+^h+8cIFxUn5YT!Yn&nK z+2HgG-7DpxftJdsrO|Mf_yd#VVdE7#ej3hHrAreNU1n$#8glwB8-xZ9Xc*+(G}?b1 zW;X!$8huZz*x9%k@E)RFDKFhU8DKj!5S#`OlR|p^>>7mOVYWw0`vvXQY6ztT+WN@K$qL(9#!9`!bk*bY>F zzA6Z+=aZ}g0Pm?Mq*jqFX@GlO+W@I6&5g;M4pWB@d3C&NC?frdL*3Q9U7b0ahN?mT+c+~4+m1&()1*vmYznVChEFMIB1Hn2V$IOr{ zZ4jJ)IT&~H_zJ|ssIi$YeEBBa=);@182f86fG3@=(t%Z_6<*l;%3!Avqg9ED-(&=- zAXX}S!l<6Ei6LeutP(LuNX~t7>mTxyaN)K#d>?#KgC?iM z>j5;AV@n0}%J|<>zrkWj($CJ4xinB#p@UOT0`g7|cL~C+Ys#h3h@;XU2(>H20S}I{ z52`}#eXaPf+QOOJNdRw^p(NLt(7-v7k{C3qmyh9i56p`2)nQG&Ek!Ts5$CL#CUKHY z=vR~A$4WBPfHHKyF~tg^x|QF;P~nB2sg}c-8&oa6=}mfaFtk!`B0{<9kj?3CA-eu zuKN$=ZD6&&oY{<+Tyf$$HA4d_Sm>8vHcvA^g0oMv+XmnDPy4KYjEAkZzT_2p-WBwG z5~QUWNMdvV{MQ|2(^X07*Rza9b&Jn74E4(hJ?>)d z=Z>Bz-Y;o;dy1I`>#-s3-S*jY{4r2b`Iw%IUuXz)xK*^w+)5!!jY^HFWPHrbj*Pj7 zBNmV>Js%h;2lPvREWKNMsN9Q)8NlrIf&6yy`R3ZLclz&5lyad%j)~4!t@B*xc|fF& zKg{S_-cKlx)MB<;m3z5EV-=kr^BOG!QG1jkZk=o%;209jZ5+3r^v8${#X zeth@-90-jT{Biu(?2hrlh#~3lCok{5dWtx2-GzgS$TY|2)I|^53dGE|5uF%o^2;X~ z++f0ycbExY6{cKFA&En|0eqU#a&xPkb2^qGNRP!_rr*d~@d{bEn z>zd9*V-Vs0C5pi!;L41(qd*x$>%Yq*G|^^<<)G< zG(k<-=oHHJ-6WM&KHJ1&XutvfASBYn%k!6WRMB*R3$w|aCL$(rB~BfKv4+rlmH<`OLhDSk0Su`Qx}otYU$N5?&PUbf&oBIL5oF=u;2Jl#Y7hT{0Ctac z?yc|7)#!4{AVDJRUUTES# zEY&?(;2AyN&%dcm!)%xJe|QdB(-=K#Vf<{wl+#$^)}`#sxiF*K>?e%yiH(RMZEP2s z_!=Fz!qR^h-=}LvsbM<1oEK=gN~pKCIDh6(2~%#rF%XnvL{h)D zS-AcL+xkGXeoXej24BFKKE-J<&e(l#)P+T*9O?O%9^BuQPKp5?8btHEKwsC z3X&8czDyEz6AoHhqNpes@&{Ny(sEK7%v^n4OrxDeyB%}tT}6V}%Uw-VV+;Foa<(#? zNBp?+3q^A5e4B+{zv23pI+-y7lf`@)lc8_zxUwH0dwCV6^nhe<6Cw2d4z#HsEdK)- zSYaWAmK*+%Ozj*V!e8>iX8ER^#&%EKusmX0J{7yJZzr0R@;}1JUU1>7@&0t2BbL+) z{ldYLN((}Ccv>l{3;xcOhKq}A9v8L-$$Z$%#8o=ThKLSQV)lPN16cble7!}V`5&{$ zv8j5qP&ehV&@o|1=7x&cciopMl3|$z=QjtC+;&2yXoe#${tm{jaaJtqS$?4({iffs ziA~23FEWnwbC8!-n@SD72Al}hYHCf zdO7`)LzTy#vFVL@C_V(TP9qSIKC?r)DLRZ~8QO93IOD^Ad)vK5uSwq9QzwY>GOTGnW@TJe$bGC z7adrWHdu(5dicKIXEstepV+I$P5*4Cs;~Z*o2f=kn?sIj*ON|J{H|eifZFZelJSbZ zvc}aHO=wk5<1!F6T9sgFXakcxQa@$_ndh0E&#bZl`E|A)5uBAzi`6h84?#?>QXyyf z`*TeIBA0I<-LIQMh9Nv7A-I7TSXfwqUB0>fO1i=#^6uxnSptDYhq?WW&i0)k!rRFD z^HBR5Z(5Ey;m(2f*J6c-Vgk7az_W4It}!JoZ0T{~zsFE6?!N;GSGA1!D&@1pm}?c# zm}20^FIroErC-99tIl`Th?*5!%hmJO^7LDy3BlH&OIBadF=kRyk|>uNAYVl;g4f&V zj1sLMMNEqPusf-ogWPCt3*{H{G&@f@b8$@cH-w_Ej3IzT1-mIOgw~Zn4g+>Woqw@` zN8D-WTI@FsbwbUOOS`UR;^*1pXxAtb2=|D3skvOdr-4CA9AqI01iJ5B>Y%qOhM;2fi1!;>CDH=g}gWMWRy!dIdJ+yqv-7IWO zr81Y&ZW@-0_RU)0YAH)hY&I&CBgL6}3^lbV>uO63LZSxs7#wE_9-;ReKf^jFu69{C z^LSMTpSXL|qAc}3wF1e$0);*mO(Uc=ivw z`e3A1q!e@_@=wV0<7i;B`Sa)fx6qKDnf%O_>sw@LaUk8~G-{5>d-~b5q*^=89m-eXIaqD{qf`WBPI)Y&uJcA{8i( z;Et5{BV`0TX7t~N=n|$QW#SU#7ZFMiHeXMz2#X97~eemU#%qoYXjZ4C#&al zW7+dx@Y$G_7^f#Lt4`bRGW{T3yW`hoj-%IOV^vS3(T5Oc)W4M znFgF>NDwL6-YZ}A?5o=|l=#5YM`&{uK?+4Bst`V$RO%LC5;0igfpp&nef zn)>>d?ML8&7*MHD@_ik>{;!V zu5sm$us63DI#zavWRgxNZ4s4q%ox1CT1I(Nltqw^-?^e#~ z*_YB+B{`4aQhKBvHk3SOcxA<~MVmSqQDvCsJWZq!R+c*YAAqo*f2H>tkDFm%riJ_P z_MfxS>Uq?7v108!Ck2awcX{g8EhHj{d}T9y_C@R`jnfYv?lwtvmqLCCbB+vS4w$ty zK=l1WW(n52)$}{(tM4iCSLiD=?`yqVU;KM?n&T%A|EFp4Tf!TMyd9n%?#GVbA5qK2 zxBPc1*Vm_$)vNe6;u|Dp)iJQ?V$IrL!n55=O8A@c-0UIIkX=fWyaG~_^fVe>;Y639 z_V>?vaIo!@{<09aZ?H|NZn8Q%{cVRbwc{Yw1llT?fRawr5%Kmp1>sh{{p%rRsB^_X zq|&Vuqx*7A-Rm(_RO!zu^_knjw%1Sz*TSXgs{Vp7_E%Mtv?E_wKt6Jsz6x+e;n>Ppl$s}=X2dA5~IVS5}xxh6# z1gqzjI8% zyNi;YoJC0fz^OLSU1)Z}!)fxFJ3w@U5_kNYuTKfq&WT?pbal@OLC)}f2ltBL(_V@P z$lo_i*tEs2{VUq?~L35W4vZSdl^AZ~Zz4!Y1Vt zFZQa=`F>pEC%8-G#bdU2S_s!(f%(bvf%f%7$XP>}x-8V2ym^eswZgtLRg0x<_8VDQJ$NNSjI2$g$~{{R8C(fh?7* zo7YB<-t(thd>QiOvnBPWz|PzqM;64O+65!Q*6pLW>LhG+blAAx1p-W=0SWo!`ZN9v zRPpU(;AaVU_c&RnN|THtUkKjA@uTItL8~@EOBe(L4`w8bSTm47F7YRf;Cq!HVe)mS ztCXlFj%H>L9?h6nByss{?!bep191@C?H}rbtcx~Eu%t@IitqrD@d-sbI8B_VP|T*F zTraS=7?wIn-vtX|ExhtVkm2ni>&=#phZxP}*6Fn!)izG`O&_{EISLhMQL|AA!2Bx} z!v~|At|yKbRZmeyxWiYomlHNBDW~f4L=5Ai`d8Pq9+WV=mw*Tyz^|u`76< zi)xZT5jaLoWt}loi^BYO{sm`tcRoS=N^qov_3CRIP*8zWzT&jywT3n)>W+KC6SPM_ z02yq8jO@H6{2XQjXZg7C;HMHAS|{yZsGe#|TSYQF`I(=?w43*j-fNKW+bS%UxwoJO zYJ~rTX2qr}#k-EAR&4VPq4T_s8e)Ms`KP^n|NqC$~^Azt8WS{k!d)o#%6p=XJkd z*X^1=1+AnPRSz1?UEES3j=BwxRLYk-;=UwJhd+pTK4@?{HCM<_y zv37W2*x%A}@%R3t%KN>;?78)*(XIMg{=ADZedq-rhsfVu!W@_L(!G05pgRh@ux$|= zc4K7R(B2wd8?9!3H`P(#kn=6k0DN$Oyd#1Z$<>OTIk4;=_TbHaum%T4&+rwz29|0G z)tILCU`t|k4O&@v?!>2OHn_)HV`vo!mjp!q{A1Z4AqpI2_5;g6gNBZs+<`;-bTAgNjJYT1b3e>X4M)7AZPw zJCA7Fa&F4tJ7I1j^@1S@>~(scC_qxC#55HeRGk~HU!o~`3R%gzUtw-#KT@{I?dg%{ zvU%Q*;6AnEx_)?6{JK%Vo;Ss8_-OZFl^^jb_xpmHjXQ)u%SNxa?-^OY$U9zNf~J4@DUV1mM7P%L&@ zfP1wv;*EFR$}EQ?xiLFOjNw|$*yI2VXU&aZ_mz@rXt1uPw|p0UznL;x*Axo!-0}lC zlKPEB+S5jCt@e)Yr@#1A$$vlHm4R9GSvGHpR;1>s%O>|al0M|nPKmcH6KVesGU;Z* zjNx5&nh^x}O0^*13x4K#;(cU#<*)T)xc+v3^$k2jD1{bu9%nU+C5>RUD0~Y{eJNHU z9=?7tv4lP~qAt>-VkL%F+8}7vvA{Pj-skd!E@3+{Xb*ve^kA z54ZQpqt_i&G)j#8%wP+mWkc z_L8BE(J~J0!9fSWj#J%`-k_HoV**&(OjF=UPGdJ>R**VG3DrsLlYxtnwrhU!0zGF0 z94_6q@abnM_{c^n@q2rnBtL#R21g#ncKNZF)#AjOI@#ACm9N29ht`@u#u)}6H;SYU z-nLa2&p%JHHGklHd{t*ecSxKU3vNdh7pOyQPPYle4EBfgn%n?g!QuW*K@DoDoCk}A zx%@4B=o^tO5!d&1EvKC)Nm%MVM|PK@!Nr{rI9Ta=(Y^E%y9TLlqnE)qgnXB=`|8nb{M{Nej_Z__x{Nr0RmFB?uIJ(aex>B%V~j)uW*b$VW|DbT5!BuMe} z=Q)YbZ`D(UuQ44$!rZ)sd5Axc^&?Zd0Gf zRID+}@~ucKAQlcQ7?Ni&mNc1=yKJ|6{W|h#r!)#c;tCYV0|CJtG~tdHDPo;>wa6AK znzl5mg153b7pmxZ-)ZpU5G-UpY2o9Ol=8yM&{%kv6OZ%#G^!bW?-`5As0)WiBk zrIw>1@UiT-;jlZ#l=s(o(pJ^+0735bHga76*VH}YYs5qwL&=QW`OooQ=7hGucX!p4 zJ|zWKso@RMiy&uJIkvG~V&b52ty71#^7~Yn71Nha~nqTeKnaE^_Q*dXexxlmb1HHQC zHGyRU%7Y6U?!Nkw#;f08T$cLfsJ6~iy}px(achrO$Mps^G($}+m zx7Du-KaZ8}Kl}0a#M8;$SJbl*FnF4QK9N}PEmJy*&^~{ElOHK`S=>3f_B85mM z=~+<9l2p+!;VFoWgrKhR#&)CA1agYarD{*J0)Z6djF~@R)E(--`_wuTE&#g+%_w*w z+q=D8t}#C76-Z_gkeXSn5SIw)6u>DkYN-SMRO?N&i(GcAH^k{r2DrCsvL6l^n1@iU z=l{9~J=neU6+ZZQtlt;O-TYdX#y0F#ZEaD(#jr4#JK}9DarS&1_CmW#Bzyc|Bjb^k zIERbnyt{QP6A9zftT?T`r`qB~i2bkg_1d4^(I3@A)lcZ@w);VL_qE-ug z_bnbJ@B3#pOo)m{v&(E)YRO^m-jvwWmz4ucwaZ2(mKJT4(nUMktlvL78ev0@F~|7I zM~5;4MYXxlRLYjC85dpaMnfY<`MSXp)Gl2hsug+k=`>s!fKa}1d3aeZTRrd1YxZU8 zUS+`&&t?eY{XMxHG9xo^pI;w>utrA~(qG##k8}mR%#Rs!wDM&RLMa?sx+ppF)DZzJ zwBKI`UcO$LRhzsv3vqr#%$G3W3nIjam#^G|qBd3&j z_ASpvkPkpR3xwv3`Pe=z-+j{5C|PLQ*4mbze2;&0c%dOLqlE<)liG35pelj}Dbuu5 zuL+aX6&)zze-oIZ=$n?N^}Sn~q`4q^i{|8qoA;tNE{08#2jg_n*Uzro*{?)|Z-*l! z#YVpssrV(E%R9N`O3_KgT6%e`NB{CC8Q{w%f7L9l0b?+LihWYIyau% z=q>5Z4>~tZJ_vM@7j0%(m`6H@rLdmF3a@mBINLN!F@H<(gr>X%)3S!Za(WEZsar{D zS{8@|I-v9q?8d_%mS1`sr#~J)G%Wlu&vGBfUFu6N?=wt4Z^XF;@Oj#dZkGuD572*} z{Us_{_R6c_pKG_aR~?0Dml=00S?z!$zS*`P&sT8#zPXWURA zq!DMq0xN_Nj2@@FR*+v_v$e1kw2G5$83=*sv*0ce_MCZS>14`~ z#}`Slfegi4iSrqF(&L8fEmDwq{xn)izq~H@)01;lRd{B$v!sZm84*JvdPSch&kJgg zJUw0{JiIt54h&@n{Yx5&U;8}Ym~OjXkoYMXa$d_Yv}DDeZQKGd^&k-dKP~Jj9TX?5It+~Z5rS}6Jg?0&w)GwrXKltzeqlsy$q zh50>MQu3`eSA=MEkVcb-64KI|J8a(j9LIHIedlwNtF+C~AV;Sjw@4FRde23iUraM< zsh@D3SLg0>(JQ%BFY5YLU8b8(ZDwW_=;v;G1yv)!Quc(V1cp3XAG1FnLu^e>HoBa5 za_=U28DF$?@0XPpH?Rf7|EwdEH_^Urn{U^YJMuX|jZmy%q%m5mmEM=UiM1=O z{{e`DTP!PP79YUm{^n;0hP6OLD&_JDzvlPW%xiGw{|5-!YLu^i0JW%_8!6-RZZdUy zBh~NA(UrlSF-R72Rtfo2Hd9TPbXLMMp(&gj;6K2}9$qQ#i?ZR&<9xkwc1YVDwXz>% zaBPtz%QEi#eY5sw&qelMv9FEjWZu!u1+5R?V<4~rNbs-|xyagR(6_=Pqs1UXiD3L$ zVX_^un2Zrn?c5gHcy!ns!QLgWpj=tLu{3AB=yriJtX&XJcms5Vz7^kayok&^I>=p4 zk|~TUKbrUtpxbik<8b`AGcb~p&~$F7uU}2k>)`p(a=wc>zJ^Y)^PO^ZUyqYd0R_P) z{eQNG1kYCQR1HNc+`2s5K(B9QSP;7Ltyv2uaRE{|cRiVfytPpMx^V3^C&3kHA`&4fURfrZHsNI>FQDj zKz{RncI11#Obx{%9;UFU=qM7t#RbMW3z1DIXFX*zw>O7(%V1-7e1nIGIze>sowk3$ z=}C>$LQMNjt3x}p#nP0;uO4pV)Wp~UM8ZVpSA-{V>ti6N4?KGKuTt?Z)B9E2He@;o)CL205DpW2t%+^U;nrq8bh3gC7u-P ztXjMVy-a|J!PKcG^Y9z0;7FVHY&HxSno{X=&9RB#0r+xW!~` zOtIP*Uwz(0^yqmoMhUwGa@CK%%2q_GifDb53qtT%<-Zal((?P+UU4b3@~Yb7UK!Q+ z9H}v*OzdMB2kS(X8XhA0c0KK?n*Q>W_nk<->?H|ixNT%+8kETRYk{I?hzrkiZJ(63Cxg7>r z0F`}gDzxq!P_ZPJp4weRBE5o$<;%$o=>ZI*=X=|j}>l5fYYR80)8`x1>_uTBvE4&Kt9vT3E}Ha zOOCQ761^gIN@{JCO75Nge|Z^#sV?+0kU;J({e=l5kc8kqq>qWa{g0pO(jLcPe|af{quIWQ%9Hm!pTt`bj@?DojbW<}XPKFO1$#`cBLcBHDi zJId})SZh*+Bx=ZAp?QT&t~R-ZSZ4w;YX$q(Yz!1(Bzp#;u58o}@Ur z{{TS=6&eB3=u4dVf0Pta=thqbs zm#ne_!PG0aIV-_;TeC;C$|{D>Uk)cT=+M3uj_qVR`JhZ^<0~>nh)wctZ{)a;z_qAS z-qNgLjErOcp2lt1F+@^b@~z5dDg>p-^D1Em0nVQB93}g=qUf0EnPW@y4nQQ^ zY`+7@mc2gAl2_B4c#gQnLs4T5kl#Y`{D`}mvH+;z`cU^u_$g}uEMeuTvd{LRCsO#Vp~Q?OoFo>DYfLU2ipnEtx+H7x195gD&cM#n<_MdhFOl zZwOCYuSkKEU)}|}`(=aY@VDDO~UBxDF`x>sQEm*FR6;@5&a@h`-*j>iA&a0EYh^}&a zeYFhT_c(Bf=|@01`>l^&uDm*KFaD^>G4xGlmr~rAKQN?fQO%@c-te%EHV6cuSSGQh ztlmDcbZ0$p7$Xv1M#){Hxnte1O@b?rL_Q{GRMSWxr9ES?9H{atHo&*P`hldok40pDw;+${{FH{LmvgV40Ati3BVwHjmIQ5aD#~Lw$Y2 z*dDWeqw+vY43*v~?vbM8_DLnQ4dMaID1B2wVOnM)K+H)37s0wSb0ea))IIX%PS$tk zUl=6P83I7jV{vK%K=wp6*{RZ$rb$UNx;rl-d*}AMiSNXImF(gp+3cjwXm!{AzS-U? zS4&g+K$PlU7F$iHcLr$`1!Nx`Fc|ivDOtHBnZ0vuICE7S#G}iQ1cU(7c0$(PR<^ox zr}I%P&S@Z}M5Dd}JQwHlM<_|qEdN@1#X8~}X|yi_S(@)jsO>^Atshs^fd|JpqQyL7 zIzzJ1=@-{jU&LSge6ah#_)f@`MAEgHqb&;70trT z2#_mZh>7v~49An^aU!nD&KvW2Z*o*!BUVZ*E}2%nB~&isi~q4)2;C(=pp8@`#D?=M zLI`WVc9J@R<`JumWWUr<7QaWgJzmpr6p_$&U%67--bg4J0Dwcd<1&72Ma`VCOfCm~ zOO*l_H`Y#eJa2tTEvC?GWeJvKuCI!d+N zL{AWM!z8ib*F;;8F0hgdaV~#D(fVEfn>AAYlBWk&fi-*_*B~+c!18 zVambO_!d)Xja-*ap@|h)5dB8l$Az(H;6LA%w6>WHIFU$Uat|%bFf=U!F{fxT$O)XB zxz_sbkf(S5OAcm~*ZaYeg-YH!SLX5u^|Z4;+WV?2XA}MrEIP&W91F%$Uox0Jh?0kL zi^0Zm=p zX(CY$#NZGQiv`}f{2p7;;`a|RGwydJ%=%(H-Rm0n5 z-l|j1z?j0!H8S0<^{I+3e!#r8KbWIw0>T0bvghbiuI{Esf!8}mtK1#t<9Dpbhb49^pK*X4zUGbCtgtOo~)=za| zC}|lwSlbKITEzu>5M$`yLYs8Nw5P*_SV@y_wcoWpQFDPMdEbGAbRLRwKW61ke9aPG zK~L8dvmX!2>gs<0R>}(ka`tn{UGB^|f5~=)Cel-Da;_5fSu5Qe{%&Yg4V)a<q8R2GTNyt^-;DKR45fczFPlDp|Eb#(ZLp$AI+vQQ#Hk=ZMEN^N{!{peVkDO5 z7lqEZLSa?0ak9Z>K&VSW@a=`~a<(5@_@f5}wvyZ9+m=0)g{n1;2-Y0=9O`+>+>MNF zSuiacI^B^V0)zkcoRt*`cXj&SIY3bW&{Y)hAx!XqYOm1?*Su`n*C+=wV-apepDxb$ z<&zL#LEJvwEPv{+v}?$F%<95r3XhcFTrf~^YKwH4DFe-=A@cY0k#~aFFT=^6z&`D? zS+Hs*D=ZNv*{8Mx-y&(&yZLv6tDNgT55Ej^T`o_MRU`6TC;!>VLZYf6@_X)otEc(% zT395$kRfTYu+DPLp*w28yuYZc`qcNPP2B6(ns>@-!CljbX4%rsu5%QM$(^Kx>Sbul zALb*^dOiK#EjU%8z@t&lI|_N#P>i+~AWb58wF`51Dw882yfkF~0vRn2&;!L%ZlsSq z`a@oJ|0-?Uk{tW$sx_s0kq;wJgz0uArB@#WCYWbD?+cQ8&Fac{vngQDFG0SRwGKT4 zKvUitn<%F4?J(zF7CKGVqTe0B5$UMh9!tybNtpI!xGe;qzrLm z+K>SOjm=xL#+SOWlsNd)W+9?CD=+DLG1Z1;XqR@KjoRmryK)n-=;}5Ihq+{$T*U_y z05^ScbSniZ0PxphMZWKoU1zQEtgVi-m5H{=?-PyRmQ0O)IBI`^%dex6OOazyO&e8> zC2oHs%cDHqB1*6H6^;D)bes0I#L|2cmQgBpp@fnO&3{_g%Ew5ZY!#8Zf@7l`KkxI6 zZ^V^y1ObHaSasjg=Wu_BV}2tvJjipJ)2_ZK5auIW|3z67H_V5fU`*;qo%JKoI?V>LwWa|q+y^av0C^$s0u&8YiyjdYj77s z!67~IvCRl%B2yxW)%032sLT2{q=xA1Hz3Ii^||xii0w7W0Jhl4%#<$+f6V3KIGs|& z|8Z<+Y|KQ4AxjH%?DSeMaX=|88NZ8}u5V=I;}IAFpDJYlv)>+3z_;^`e+hi@Av6s~ z7Osj(5jwADP?S<3}J6@+;a{LS| z&-ClI5(GpFfVRNUOGiQse6O3JFe!t>tbclavR&m8w#soQ{*J~-6a%q`^Ko`LPkwcK zlKTeSP%XLZATza^PKdu(xNO?LC00O^9k|1SL)r06u58b=`De0Smrp;XnaN{!;PV(M zxs!;NoA@J(P7a0XuJI_BzWLN9ueLtg`|;u3u75~T05JX$rBYhQk-SCv-k>m+fRL4& zfZ1w(gxcTi`TSalMvmW-TD1i^6$Q#uj2-F43mQ1xk>og1JSM<8)7+x!7u!PHt4Zcy zQZiLXz@)p>Ed7R(I3hUdaewu22S+5w;L&z`&hgxW(uWZb9`+>mWKsz(A;Qu;iG;)N zq(8YWNaf?(r`wYAnhx)KUOunUVo@F|3GWAD)2n<2Id0O=T^gUt>ky{HZFR$(Z&t+7 z8fK8x86jZl_txy)w6hcWlo}dt+hAP;j{q!{@r_bOyNpkuk8KznXRI^Pk$ z6YPRh4n1RyhkLSvdNQX4*%NaVKSKiP7Qe25*f?~VL@W_EebPk=LgJRAt6nkm<345- zbY|ocFw79y%63Sbbz(DUz|T+Z4(sRDE@?y3Nf z8pmowJhGcE9xHvAe7Lc}Yr`>19fOXRp!4#2hvl;@c9f7p6}wuH zMq4$--ig)<%di~6b!{s0frw*ft~@Bmn^Yx{QQHnp8(q;sN&Oq)4Pi5ZUNQ@ZN!3wz z&)~8!e{{T+2JU2~?6rUCbzkB-39`Iw_L*Aa2K24sm($qa zG69pa2+X#-s3c917teoy^tyan$p#P>KYq4;p%7XAUf78*N2}w()m8zYH_?0p2`9O) zWa=-2f*+ghLO<_`eY%%_MiQ8z$CogHD z>jb}tslHl;aKt$OR(U3u)*-ZwSN{RF8(uHCC3q$Qaj|}Vgf=z{uGM@J zon!A8jp>xZIS)OJx^D^IW&ej^I$yMc1HwdF3Lukcj!)1uI)NgRqUtpN!Mk&~h_ zH{#z8*D{|NzT&NKnDkV2Q{|j<8}DQyrdWAuK@A2IP*7?>j?@Su0&XcN`j+N0Y$d4s z-it4auAHEw!#+DIeDQX2NYKYYXtOPE%B>^+Mi0*5-&TQ@)kdJ`m>PF@7xZgFV=s+zprLw&PSVB1X2orwL-xKxEU4WmYR^x_PnM5 zQN9Z`mZTgoPoK|19?0IM3^Dx0JT*L)Bqz>uP|?-^Fyoj#FgOUiu!%rYlAC!^_4(8F(1n&i}HV}96yzZUVkhx~sY zF9>(M-eAUl^A`1sHj6;;)d~n8s@dXnb9-2Q9|SPO6nRTf%nTugt%9=lqzo<6;xF!Y zC=&E;F()V~oTI(%M5&wO4@JM5vDcDs6i|(bG%5%?Zm~l9X(gY{J$Ju3NZn+S`+k_W zOvM3}c0?x<=S#%O;#h>Tw-Y~Mw<`KF!1;n?2J?X^6~rOmE7Uqvcr$Q zYixUajWAkK^X4Ub6zJNj&T?EE7Y+2reOznr8m@aGYPWh4^39(YlzlRCM%f9 zM_@*11zDfI;MmeDW9*o=097#aX-<-ib90>jsgp3Mx+x! z476!Px`*m_W+y)2(GNc^r#J~oBRWLmjD{9MGk%@lyQRdtie?LDd&q@eI_tp_Wu;eeX`j;CMu>O@cF^Nwlu_IdM*y;i1tu-ODFd0ZZo zjZsg&akb2=HN|s1ty#Slq?4*hG?=sGqH`@aG?>9W1evOLch&ca#Ber)wBY0E14)oJ zJ{F~D@p?uvOJ_}-y4Fg1lh2-Dr(NEPi^J$}`&pSKdGOe?X7A!r*e zRX|=xIz7Iv)y6kqe8chr@Lw$j@4x4G2REUxk#T>qr4(DtT{}NOdW0Z3RGsnD3hPMb zWXk8&thaItmFy%04!#{RFE>qA{@h;`V-%p8CqX(`rzsp~q|pJV zF9?|xEdM3na!_g@pLSGZ7(mu~WhX*p(e+)5NT=#^^}^^SRWSaq@{9k0;RzyWX8LL+ zs_TAHqaFH|-}0TQm~Z9Ia6))of#fv8xZo=t^Hq3#60$(MwxJ_LY!2qOk#GAwujwcH zfvAHHxKnt@2n^fI^&?1jWUEr2|t(BV?zp4Q|r= z@)2K~e~5{?q;b4_w!bm7Bc(HEs0(WfBI$O7Zno#bWQ@TI-+~w~l2=B}o(5y02`LGyu|XANe*8U-2t)#E$-U)Xk^psm?_@ z*gY4CEjl^cSx%EMy(K;16X>W6zeA|)Q~Mn$FnKun_~#yrNYZA^r^6*_X|z2(1rTN* zhb8>9s>RV!UFwZo^p}>~1$TeS9MW0a3G0icl>g!yZXI2&l4#jdj`Y^Md3ot@j5j@+ zYUjF)Si8|JJ`UUd_V?^vlZzG_eqS+IF`1;$FyDQTMx>8rE`P-2fpS~SoHb-k_bLhVhkT;secEfzKZ~lqJ3e0s2CVya zjwx&%y1Z9|^(5Y5s1LO4f87C|W5q}XgGo`Z*V!uHFYgNn$i|{%nhe?sZkCcE)@E%Zb2H?|CU=GaJD!J zsd!uu7=$^z13s%q#7fAai6baEU;X*Rse26UpXOw0v|61Ec=|BggiVA9%n&E4^O+BjW+G9ydN*kgtPu4b`LdS<3Mj3%i(Xd$(;7aeHv2qfHxeeKqT^YXZl5Bg zVyf&DHwlZGE?C>DuXMe5&bAX^>Y=DkdE)d;BknX1ynqV9ml{T<`2Vkj*EOaY}-ng5#yg8F=?y7v+vOK18(v#`IBbI4Ndz571-X zH2_A_pHEmD$X6H$jX}G-ar}t>lK2d81xjG3(Os*7tz}@;`ZXT1vyYgjE^bg!X>W>z z6r}@}Sp?pmZ9&F%7AD2X$}n|wcOBS9&(ZOuNKfI7X31_j%HKp#hK$ftb0)os`61;CvI*!uNIAhw&>h=a1ouY5t56-&Dj698qUb>r30C%Kj!@8~ ztwlEdI{~KvbJNuLUfpNxDz7Od2y?Dt^a%<}Ox~%>gJge|F?e9XEx0wQ(ipmAE$HO= zUFjplWKYAUExdZMYaTYcgE}!(Mt!I z+~}aV(d$GD_Dl&Fs{75>`zT%wTTXK$(SZR_cj<=nAcBf~VIS_;3TI{-zWX0wiLo{$ zm4V{-)5xQ_9m6GGa!dPo7$^8=-b>OqPQ8PS`T^7$Hv9KHH{=|tdZ6W`v9wl^PJl!% zIlUKtRMrjcPb8=n@AF};qL;`imz`RGFq(d@0D_{R+kG_49=zz34x8_B^xS3pJl{=> zvWhYD@N01V`Gw}mu%X+&_q!={_CfW%Oh;tFJdE4|R>11E6M|Rb^tU!ic$Z9<{R!%z znLu%H2hf_Vgd$gmK-Y?fW-ik<`+Ua%73}^VfQ7QsRXQM=C@*NOKsieN@`Bx3DC z7i1-NOSaggvF{$y4Zv1e3two>t7GNne^GLUu0npG4>8k)ih{A+C1g9 ziWmFit*<3ZT*%3IoB8_fVN5IqfAkWqij8BD?15fFi{-l{3JuW*#rN2B%4ic1a3|Fu zw@%=uSC;zIDv+Ot8>?u6z9Gp_G0+~RE?nXWb>s+MW7Kjnkh*$|snc533LX$^M)@u* z6H5-vEmDq2-jiE!ZwG`F2N&FXSwJ@nexQp~otLB;sg7mkg9Gxad_&VG{^#BQ|GujG zy=yl`;#2O`mzvw+j{M96Y^~*29@kpl8HN zx0WoyQm~&hMUBZUHDj?D0O0cgS1{9f>f&GYzul?C-MzMwIs;OveJv^-C2~ABBOLx) zTOj2t6ZxF+e*izmIN@f7QliBM)QDum@!<9@dN()e`^GSzs9Wt%Qbs-BEsvD4Qe9x- zh@aJ*X2`Txpl-r5i%sD>i0x?s=#lQ2q|IUap)Cd5W2IHu^dW;9qC|?tXz9Frq+DM@ z0FJ5(>QO%BPY27o0zZnvDruN_uN)CnEdZ87G}rT)aSwuFB7l9~JwB@{U(3ph5z?Lh zS{DG_s9V_Dyw=|O4{*(_-KP+h*iNbYUelv5;>r0E-4}hbQ*uj23E*(Qa_CX;ZAfqG zd4)H!;k3j^O5k&<1NXaH8wmVLXG}`l_L}NO=_b96;`H(aGWwmVw?u=2TZg%cC*rfg zGU)Fa2g+wJiv5;rhvgTf(mQidL^*y_v}hhO4{*r9S-8Rpy-ydiOV;7wsWUw7bLqw@ zI#_n3hX=8zqM5oj2c;6NvNmU7?m6M^JNVQtK0o)+bwatSc;iZTI}gmapCo3yHKKiB4iBAzfm2wW{@5=uqt!9{jB@F9?pd&bMLTqtz)? zY>C#&!H2!!#s6&D-n>AIRoP<(-DNhIDVK)s$DxGABk(!!EwBJLKpnPay<+-9MVw&Ix3P|CgzK941CPkjQ%9O0QKX_30>^I2~nfcAnYD@@COT1Y0#^}@y{k8J?7^z8)^ ze;jbS0({Usi+!$ZrfR*|{{Y#qskMCFJj@k ztMZSCv8iP-1qxe}O7_#6FM1z3gAZOiB59;DZSFHuKwxos>x4I-DP`E2mEk7XL+;vt zI^E!qcbdPu9oc$o-}e<8X2o&o!^AhKur8%zM%mTzEaY8>%m&J?-o+u2kAU| zH7>nx2EeJ2X+;DdEFk@C`Hop2Z|kU)T;JVgWcs4Bt}5eXmWd&!TeK$<-N$tbr?Vwb zEikf!PHN5UaPo@-WS8&(ASq|Ql+VM=tA52MkAay1?yFblCjB_0kuai+H}&VD^ZLS+ zDL1_VDe^Ov7AAPh9>EDgIW}5Gsu5*uM|M6xtp`gtjND?i?NBPU$Q3-TicEl0V|L5L6ap*Ph2zbb5_a}^S^ht|I6G-wu z|G_W-{J2HO|Hv8ms7BMod(n3ECG0WQ1QcDL-_6Hoz(-LE{{i5I^SeFt&+XX59nZrW zbN52ao8R2=@Z_0d7J!f@M!f>4^W~xG@a)M!kSyK@v+NH<`f1H(OI?P&1`JznW{k7I z1M7H_L73&(x6Ug=Gl;4954dsK3*{Oqgz_Fy>t=U)W*h@`0s{Q38?hGLZ>WwpR)^8k zQd0FY(DT?+?1W*gA+U&pS0wBzEaQjQx|NzPo|_)>Ja?{O(f2F-&>(ur!7&O%Z?QSw)RF>87h@n=6s*b{!s>rTr=bo8vKg<=x^Gaqa@O-Q@jXpY?oyJE!rRO|cQ6&R)uV#;WNEU>d} z&qJQ}Mc~g}FRlNnU*@iP6A-6&kJCO0yiih=_#rFez*fn+C&j|bLr#*Bf#=cE9mM}3 zjGg3-nkOq)d!)yc$;&A-nN?Im z#fH`}r0ZYz+fhjz`7_)C7gmndZjocn3o#(jq1@HCW@O)0=#f^vfdlyvub5t64Zuhe zluoBy@~~+Rsl!e`Xs6xoghb1cv~ue30l2>IPlB7N1Mc*`Cj{O#$X8Q6nOJ;#Kp@7l z@&WL=i|p2t@Pt;eJE~d`E!GP2WD?yg5!Z|TB_a>mDhL58UEip7|MR?f=bAeB6;=6^ z{D{I-u}0xw@IOGzE#EResqpAwM`8zK0HkqItLI_G;?PB%K2?Z!?A28h8hTE`p_~@3 zaC%G0aCAbRZOL*>J}JEFjC?%hiHB?$0UXQ1>Fkey*GweK7cY34vJcf0H}?eJxOwrO zg7X;FI=hzX5!(e{joNJ@2W>(1bxo6^4I-AGRvIySA7X&R31o%+|O7iDheWEE4(B)Nk zqf7q7-gH8*qx;{|V#q_O3HRRSW|I^B1lrL=7;Ro$-bTy%)@gSi;izrQzh_dg_~(jI zUvR`E%e+P7e(vx-Hc2eCLIWV7Ac^qeRi)Y?gHnfKH^Wm7Qn@mvC@i2P1M3AUHt2xL z)()B-a~yd#grUcy*HX#)N6<1u>Q@SfJo_5RT8`zV`_qnlP`SE{o&@U)oxp6OSTv4k z03lG$Ay4&YzRQ-owawj9be(CwwXrj0MzP2NBhNgaXAfo6S^q8&+ZZfM;so=kd*HqK zrLIcs+d;PkpSKOh6w`JB9DFLCf7D?+MP85$t-Qcuemk0)lg6}^FZ<)!+mE44Pt`8P zDqK8pLsb}WRDwS1762!S2hSOiU}$v*+b$ngR!B6dc#Q1DU;%^X!x9FbP$WRdhGBeS zE}Z9>GXvG zP*&*(<|5#?4i-DNW82xe!urJ~QY3h4rDim-&rl=pT{J*;!c~>H?O~M>OqVUBJt+Ho zrIRU($5;Siz5RnlXR3Aza`{%6gF*_ES`U?#ML?a`~ZBniD*S0 z@APl9R;H-Xg+Ow4qS#GSSYQ9U71M#-*R;zY@KH~ z+m9RWL(~>En^X`IqgII`_GqnAR4Hojwq|JUnne*IQJbhyqiWXPTWm$`8nvqSs8Z^8 z@_&2IxvspfWmc*bvQ#V6%zAY{`S3Z=- zLa;&xemn)QVYr9;K$DE+duqTzv2KeVfH5?{Zg!KG z`Nge{maXoXido%>Z_$qtGnDpqT!|h~__I~t=529fFBhW`R1~ku9E~VJF#YkKf+iDx zflrIe3S2xpNkSMw`!UB=Hw55@0#@9wFOtIi>02L(;Bk&~5VU(owen^+Ck^kj2e@jD z`8lLRb5Q<_EzUIok^;8)Y>wS4hNw_MZ$1q5#->9~86>;pY8W`mFjb$6M#7w;UnK44 z{sd8vA{mVb5O|lrq=Q#D^hHx}!Vz7c_~K{w`L?3fZ{~h^sY8V4YiYvHvQ#cgdfqc( zc$MqI8^zcqSd~bfKO(;`0kr$?x3K_l!@WN-@OP-j=VBhbDKcol?%m#tuO{!i>0gbh zFb>U--1J_?x4~cg9@dPo#(sLNLjw+lu5G~HGyKmV^^K#r;KY`iO`-Qyyn`x_aLvAG zP77$WTf!9pP#jY%9=Pq7)KS7ZvZ37DPAQ_bi+fo1uYzmCu>-auO>zuYQDpps|G)bd zsRTC?|J`2u3ZoG2Di>3i-8gFT8n&Le2+d*{gYJ#=e)cLTWmO%bfgo&Iq8Ck2RHTVV z3*ozGl-F`8Z>g2oU#Bin6M_6(hRGwyuIh=CffY_mK7VxS%XnT#JSOl<{1DW#K=D}K-vz=@ zo4)4|?2INVcF0x?=R_-Uo`;mpS@GwTymM-5s5LA%H0>V_dw;6b!qmwb3jXKuFTIWH z#k_TVxfGr2y~F26YKQqN_$RcZonMFpTaDY>yKS=P&dQizkvS_>7}LUw38@BJGqvix zVpm|OTIBjE98TGkt=|za8n(JqYR=ET@HPFr!JT)BEdaIRC*l1l*^yvF%jZvihCpoE z+6a6ZoW=$54vB)eW3PVL3FZ~zYWdGh&h>(aNBOz)qxnQt*(sg{k-#{O1)>)a9g(#{ z&qYM^asuz;Fgee?tOg5n2S@cYJDyzVg6YhSq^5x#MZLd8+$>@1rE^}h9mVy`~3i_M4 zGvaB*7p^U(^S~dt|0QA27gOCpykW|=a@B+PPB7GBJEMBL`y;0#WqgFW{pum#arnRA zJYzt>N))GxBGr@LpqhKdOZ~>U4-Z22qLIA#rN>MCz_1hBszepVG5dbMj8W*^eT4WA z@ljH7p%;=wJ(b%Mz%r^Z1osAaW_&9QTWNf7i>Yj4kngo}Q)2O`$`jH%G#s!_e_HV= zSm=E57c2~!OSoHimuUmKaNKSGik;qB4 zI$d9*C}(8D9@COcqEU=vo?eua=F1=jbLVou ze2YVwcc0zv4Rl%DU)@Or*Y+Ic>v*vK8o~@0mvM-F9e0Bmx+pe3*hsg>DrA51GIi^m z_r22%B{XBoNNDK~x2N*X*aM9?t+w#N)ro2Ocb4#k;FWxcIJ1EMt=H$UohY^{x-$E_eKTE z)Va=;eEOR8vAW-_z5DL;}nt``eZwXxDj{i{fkH^Ns(AuD<9w7V^AN6I~NW$%Sq zt$5lm)fWr-Q#6Cz3_(hE;^LIDoSLv}6Ro)HinBL8`*xFBmpX16l>mz@FX=6KB`mKE z@&1!~VzAGvH;Gqk?rT``?3k~fW_~Ejav4fV*t@3uN`sHpLp2*9B#J6*Oc5l62J$mM zW@y4cD5)8=e_Z7&7fMZ(SAplG)?3#oJ6YdQN6Y<6Ql-1kana_|AsR;3X+^!hk)W5U zq7?Bb@J#P;m~{Sdf9)v9-_qpYDS&WC0E##zmKFYDObX5~HDm%Jr$27#Ru8afbQTIl z3nZj+dYR)TF_$L9CHUdqWiyH@*NCrq#KW)7c$LJDk@<2X0)w%}TC_+&|KMW8 zm;$-q)tB?IBfI0R$AQrVQ(dLk<0e75K8f%Afk29IfWQYZ=k>)oi5=vpuddTYpVuqq z7!0=oJLA3lMI*jYjgzBJmlpn!@cAe_{`=(0G!zxf>A z9qwev$?6~X&9k5DEth@;>v^Gu5x+!B|GT#~_aZz7?^jrCA#VCpVKTVgaAws; zbCDh!83EZ}D7%1&*w|IOW@8O)owt^|JIVF~R4{uu8eT>9lXQcY=exNm)^B3`9GF*P z<5|wAn}p$NWt?uQ+n27_Helk7=9|3{hXT^Gt`W3JsDT2IR_`86w2wgVq@JDWxs)!# z7OH4MORWe3{G=(HbmaS`V|QB^k1vG8w<8qWzA{6X=|}dE^h3Z zj~gpODFDq#9Fx&z16^imS7a$W$EXZ?+@AaX`BRmYiJ3hRJRUDCG)kmB8IuJ-={;qk zTXj;WifSV(KD<&7@al`ILLj}#U|D1;Aj6 zEc+sbU!3gHu@JlZ7jH54m-_GF7+9z6iH)benug>gG;M3*^VdA)`>qR4eSPmx#zMhf znt;_Pl8-m-h>+?&&;OC3tVKL#4d?LMNK*nlmoSvjOhWrKX<9uBxvR_>BtV&b1nd!i z)>l8NA1E`x%8{QvjOo~gC6WSr0OzF1+zPyuFupUlu0~=2Vgh^SUm&(GebRw~gSWu* z4T!+LuoX^5)9Tnqn);f}_-}u7&O*d&dV)T6Q`j(*EfD+l_ouBReF$KJ@a3wL)i1^Q zfQJN9;~zXQ7f^zFoU$bnumS{CC`X1iAg&lFux5Sl z`>(_A=c!h0rf23cJYT|<@6yzZND$E9uo~V(;!j1!?rXl<=%I* z{NKw)*Rs5^l3}=T$*irfr^?Ev4YAitY%cQW^g4CoKm85C^#I=sZAD3f&@%R#+jRK_ z|KFu)speSDg7#qzO{3Pqm zM6g>U6>20sLJa&OCJSkLP&>Iu#2PHGNlAU2cc*N+bsoro!r95>SyU+wtrL5u3A!f7X5hEWXj zcLR(FiBP5jSpNrrP`0rhx#zm9s#jy@wF~N-zZGUU;xw~)KSz7OQ3i|%>>Dbn9d3#% z$3Rd8JHjmKaf3uxHJdPtnAX~cflqw{5h(ThF1D~Hr^{Db=IPP*gpAc^Y>NdDjjs)% z+6spez)7j&g89M(PC}Kv>vBurPz;Z@n@W83Tz@G`=Z&iH=*E%YfSq|GU!}XPUl?5I z#)6pWyDREmQk@|ybi-Z9kI#g32Y^T$C%{`U9hA{Pu3fy4SacjtEt!U$L2 z%4nZ14NU_Tt68dqV3)5X2g25V%^Y zVNSSA8}p}6kvDrJoNNZwwtPC9vx>V;;bA!nu1l7~I;^UFoQLqI%;d)7yYimCHY{1r zRHRhMYlc@x8lNXoXGV*mYqun6E`oz1-RV+@jW;9p( zLLVMqxIhz!4SuK$?(Q@sX8QGiP$sxECf=*uH50w63LoeH?M>vU2N<6a*6o2&BmPD2 zwvI6;9O2jMl@Pm+U_xwB5vTV;q@-!!a_$@! zkRuzw2>MqruD7vQ{f8l#*P=q}1NQ!~1z#3`Q=fDtPn3p9F<;eyAu?cQw_?}w$liMD zn$KeX`^(8kZm$b_@0E%9Xu*xSQ4Ae@8pwdt9qYj7%iv89tZy54ZL?oK_FEnSIp;W> zw&>|aHSD)?lx36kx4x(19r8s0sET=nmq^sR&_=t@l7YM^kwr-aN|4K8h~;@$`LFid z@T!KX=#;zjoBRaJB9xQ7KFmJLp7XD_S$nNdL;Y?3sIR(9_P->epG4CettTteR`sE0 zUlS{a<9+rmpBS~byx+|*3#XxfNPFQ5LeHd7$?nU6t~)Q4o=cub^tR6lyUrk&nSgg< z%-~O7%bySj_+mPVA}AnbyUVNp0OyG0KRq6d&-~IoGP?Zw7oJUXmY?v`MOtK)0PG_c z|1qv>?%5uyw^5$&`WX$}%H}KwDiDlZDK#YHd$yii79o-*%YqJ8pRYag&|@APptIm> zDHfx5^Tcj9Xtjc+EfOWOTh?IQ%OPRc8G_>uwng)@{oFj?eWqP+6i;p;-ZG=u-g|XpfaSu4FEyTkYweK;G5F!ftWj zL6T)9*vOw+*tfpXbX#$|uXm{4;`8~oYJtpaOm3gvN+1hXer?uyo#slaIDzrk-HjaN zBb$iZg=Cbforo2ih;!T+LxTK~Mx4I~E0Tz?E2($J-}0s+OQ?S`z7{ULe|OHK$8B}* zjtG4j=hQFf7}`*j+;lbUb!~sZ`@Eydu^8&2CWJ_UY zNUrT8$MF8D0rfN=UHhxIZPbq%Nx-Ipr>ZBR;vFUSS!chm z8oAkrxC)Mu)eaj;a9&|uL%vH_((hap|5Z9IognZBzHYu{?Va6Q}a zcbFbT_#^PJ1_}y#))GK`KI%uwmG#8k7KyvjLE0WL%V%@{lc#Cwd(#eg&@YcAXcc<;g zIAJN&d6JgyF z%-`~cr8mPZ!-MYZ1O6t4jRS9l^^_yXL$}I9igIQroErXRv_W(`-?z3EbtjtIn@@#a zTLhX+PCZsQT3-%R(?O~S4Pv(wwnr?5(Tw)ZCkKzHw?$=cwhAhK_# z-G`H!4Yc;ixldXuP!vZDDKO}zbr3f4^axuIx7;HEaz2?eq?6sq+#q3UYCOf|PFJ2f z7Wg#1zxmlyU1YR5W7#89!f3$e;W4Yt2?l+TacWI<{>&U96T=*1_~xstcLNgJiXzTM z9Q@KyRPLHiy__dF1@Cm@(}wSSM)r)J>=e?!?uJ-ey~pzs+(yUvxPC4AaJzb^3vuyOp?Qg zO$Jk6XpAdaaK;aiQu2zLF7(WH2%OzJjSuo*qp&N@5)v5&E9AWyF2Vk=@Z0^!dPksw z+p3m)<%iIaClF_zj2rI;>F#-HtdJfNT+2Eh>7}WgMJOZXaj*9};yqOonD*b}wMEwC z-){k-IhiFLrQ$K1nTZO+(Q10e$XR(TbtmAEQ6wK5C13oN7?Z85+EQmWI@_VJVMI@m zzy^Y{g|k}@H(G!CIkDp|5+bRkHO{+j*2B>!p8h-I(+(NDrt^azf>ywTA1(-LB*euB zxT1fbo}}4VQ#~FhBjin44CcZn^3m)HGvx&JnEia3h~D;aqO3%+2}gv+$P^0^1r5P_ zk6A5Ph|V?O9VH6a4FL3ww#m>?vX0KRa79(<_l^3T8(&S+@}dkLpM}e8gxU|RoWfrJ z48UBfV@+-A+&+nZ#Q$KM|1_Zxf+R>LW#RfvJlq$i#ha{3HR2+`C!A~FtI+iu1B%28 zKiRd`06^WpQKEG^fG_dwcGSH8yr%X0t5&&VJ^nngKRt1LH7~0nxOwqOUYoUbBK>{f zIJT(F`}SUT?`Cw#vvj)?fg0~S^A`DTj!rZ)0?!q^B&XXm6R=C<=|PsowLN&vvsSg| z^IA5N`oioUqLz?0)7h{NMWBte^vvki>c8))v3d0=^AkU`?7M52_C(V7e4|z*@nr)) zP1p{6thh+vEk{^$tJ^!+b9a_OvdZXSrbgSJB!=Oc)cW$x+Dr4QvrP63S$DCzXP-;) zv)~ux4g}Bdst{6db+F+SiLA5=Yi@KPtS~6BW%JLEar}Nh27kVVjmE1$XK3tc=fz51 z?TBE+;`-qs`NVFpLHD8UBK=>qIfGDPeqKYuAg=7bP^D$}b2u3#HF%zmE8xiT+gYP% zWRHi$r8fR++WpETl%3}ylm#zI(2(6{OqSl*UBCoHaT5Ab4tZRBmg+8bU4{jyJ z{=K_m`FkXzX<3`ITg9Rmtez4iGpM5xfC2e>55TsSDVhCK9M*h0x zBg1~2r+5aXO#b@LG_c$W=L@r@HA~7eN|BYC%ljH2NIpnTeG)aQVTr1(o% zN9M3A*KAH@2<{gN|0_asHYX|^ejF8V1#H2{0gyhVaMQV^bV zt*tI8*wxMYs5>%u3^h1AJ30`nMrV+{gk-5p%7!EVWZGdwi>{U(5mz-fG9DoNx77V; z&6-0O44#j-A{oOTe>5HOiOdKk5WoATkX}THINCfY@UW;5$vYq&m0B?nWFOCLhWK9 zMAuv)o)Lk}ZuZQKR!aY)fTiKK|J8IO>zX-ARDaN=%l;VdzjiBzV~`fYvLUaw|K_tc zYUNc$RmckA%&_w4(#~O&aM`m3xc!g$|FfROUOjJWi&q#j za$;c{ypicAufHVN8rnhJi8w$0GgJLAlKMSf*^fQ~W>YcLjP(w~9BV>WRtJa42f!(^ znRYc3LoNE@AKyc_e8|I^5jME28OsmatTRtgd_j%jlE_bYi70v10pcjlzz_@e+l;P* zgqtRp-6DDECaWl+AKcGPkRv4bSw3r>vd7s zwNqzgaEi{aUE`c}Te1*7oJhiA1OA zRgK+JS!jOPjM9q9%H1ngmwq|xcM6WHtul{NbmGwVXNMc9VwklXG#e%qcxnW5`~8aw zXtl=Uudypzv>jCQBP4L9;`JXCyol}0dN=2&BnWaOJ-B1lfTi=_8)>%GzGJ`vd|}K< z13LvnxTD9P$?Uo1-M@VB@|v%qA@PM?*~{v(4m8iAXYkX}X%WqlpH%Kj8RwIiHs?xf zUANGtzjQ>`j~GQt^G9A;*g&zWYutCO8h>9A4xM}A6z~7&iz|6q-;Cce)f&s_oKX0; zqzW&!ry_g+$^NmPFF#{({=ioyVV+rt3m;^)$#uoeX$??>VbS9=9rQXwX#TEuC+TF) z)LW>94m)(@)(0p#=+PVHOaAjes^=j`$RYEY@9d-eW?@-39@pZ+I>Bqn-8R3+4D^3{ zAKIT?pHtp*5mh?qd&U`&X)R35*tT~Y;sBm_Y0E+&+tclYgL5Ix9&V~Dwe#Gf9WF@I zm$rl<&poH3ht)I|fC3x0Uw%}H913Xbw7<&lo7ys(hxO*eE9nR5>NX9_LT3e(?<#-q z+oVYPCmTF6Z%nHFrM=gSyybuI=ajeuIy9DsR$JhO;unmU@bTnX<+p>HikS22j7@-) zWo)ww;9zuL+X=D0hFz9qQp!8v#LkfX1?ue*E7zWC(g5^G@I zZUh4u_>yJny`J|;I1StU74Ns&khj;M=_^kAGU*b^it>?9`o(mnyN-2FCGzgy4)5PE zo%HcC-KfJxRLLo(CfL-D*V4`I*|ko={lzw4H^*{kzmH*E+AjjCNJ zqtZ*$x6kk9%5mr(0`$bPiqmB|!98^2@aOmc;~6e}%+P^X-&m@m$EZ@?&(@8CBaz0TbZ1&v{NWk*u+ zyXbO^4c@aSE(}iTR^AA6-vY~yO%Ym7{)q?okH>|~^{*C?`B3jkvC&O(AEBlc$4;b9 zYyT&kS?>uM1u-8rdVUOQW>`4e>pv^QdJ}}tACi`~ddryKsMT15ryT7B#Wmc3@jN4H z0Hr7~6J{OxJW_3SUPa@6>OA9c0T-jd0d!?wb^x%lWMKmOvMI0_tX>gwd#JKS>dwUyK+hm-LztmK7_*yJ~yQ2wfQN zY=-)ja^-K*B4jt>xI9%V8c$Q0f|MI|Y&SGSC%J!h0Nl2~bRC?G6;uReBW0&$rk8sw zmO_2UBR9e($L~wnoX97?S%!gyBPj?0Sx2#_dm&HiSxQ;5M>ii39!TgAfv7$m=R_?5 z;8MY1p5k?pi{$rD5Af7a7;~~?LyJN3>kii%Z5di(qI;N-m$>!gx*BKKm&v8l_7#vPwnKm)7H087ol5HzdgF+ZAeW7`I5u&0z_M1 zGJuc@!kH8nlI-*H9|`sk>D0PjN4Qk*QOudb{8!6>oLoK|iNKqc7=-?-?O8P+fgRkd>Y%X4_}&XALqsYO%b%WUrV zB^9-kO^^gp(Nh~?9}!PFrnwQ{tf zot6g9j!XgG>6MtVj>UU zC10Gni8G5@4<)+|dh4a93C9uEji1;hu+LIp*@LQ#DRNRt`=zrd3K}lCRJ~D!<9(qw z<7}88NUk-Hw8s2~t>x09wsLrnlu}=pTD@C4o_X|&(y!-ObjbE=xL}`jR+WJ4m{rZe z7ZLVZT$>7z^2OUgFCXDbMRYTTFT6gWF+NR5qatk{#`UN<8y!xK`VCfKUL;8BRf*KQ z{*;zfZ+@PBzl4fgg2Fx*GBB{+QK8DbAU1~pRcqf$3a71m94+$Uq#YZfumz{Ay!(0j zF(he3r5utv!ewE72N+Hb19U*0sVaY^CYoo`%~<5rbd7SvID+qw(|c;Im8Q;S&Gw><({pOhKbYJp0nh-94C&$WdQ1$!TP7Ph6{Q$L9IIQyA; zTYXL2tr#ftt(w5_U#aY+p}A^%7c@{x5=@LL;}9qn`EfMY8Lcq#8afeD0Dgb3BvB@@ z2sMb+l>NijV_~5RO7~|O{nFu{{;dygvk>m(M+GB%;7+acVqXfBp88zAmY$6R*^AgS zU>MW=Ao4oQNGf>7Zbhz38a(YjT;0ueO{NXX-N$Ky78eIz3m#hO6UmRxx@XTeN}Z2V>$4Nda#PI%i3A{E4~ zRlLWGrXuf(w|@H1)3OrXV~tV)+^b0Xr?Et7;T2qmfQag4;g`En(Jy|Of1LIx#~W+- zef|CpMVdni-Y4D|0Chj4r|HYN!?~B)E20xi&s%D?o5JfitA#lH4##@_@Yivtp#!K+#leU9*LAseC*MW>a?7*ZQjqx6xby0 zCD=~ZT)M<@1cC(`-YxV|*Dkb-4uk8+S11KIkzV4As^-%H=*d@?nF~pN511lT=3RPm z8QNfE)+)C#`)>c^*SD_g5q1-o^C0Gs=zrr!7!6wcRQq_AAfzN?T~CQE^Z!OC(N>#a+z4w zubN^*Wnr(V{n!2nsnoIdfUfM{IkUI2hf*9VL`g*yFw_G3=})%e^a^o^RkOrq6%B0(LF_le-gcrTQz z!y47l?>MT!S5u##>C8FtqdvGqAek|J2A>0DMvcNNuq?2!CwCnwt1XItnye8hdk-@Qwc!!uXBn?2N8^sU-AS>y^+g?eU#3QHcz%^eLxVN{dgS2MXOJi58dhBU z0&O~v{aCoYBz$gMr0wne0$p}xc(_rR?sBh`voBXfrh0J+v1`5V@;EQ_w%1%^MXaR{$R5Vwx7j>qARi;SwH)bMcGp%g57<6pY1*Q&!^FWta2 z`?oMQ1b3U{0;*riKJ2@~#+}XR6Y>~}7kwstVVzXxm6UqQpyn=VTYj6}w$3fADQUVn-o=nlP~W&+uM zSj-m#hivbeXGrDOhTe@qfEPncc`iFJNqC8lf$f8V^NO?d3HS1{ih04S{`dmEw;?h@ zte#$~P$({G1_JRI`42$n7jPj3e~mD)7U{gH$%AuN^p09X&4o+UbE0P!TUQI6&_A71z!+kKvkELV?Y%Xdf_ zbz&D5oRw9F>iqE3zNA28QnSs_OQ%a)5tHr?+TFhhLjroE;U*^d1E0AqGv3$22z?wx zXrMtHGPs_UBH;dpY*Z=Zi{;A<>_y(!98b)4V9(PKS8AqHm-;x;NjTGt**Du_l%Drf2 z7BVY;&7it=X>n}PPXX(j5xw`R7*kM#MPB-T7$sW=X?|z3eenV34(ITZWg;56K7}#M zy>`WGXs0SRxVvX#vmGg$J}$b1uf+MWptH*gn%0+`0vSx)Nrc#b?) zmt$J)GxX)$Gnsk(%W;b!OI^O2O}&I>4SXivWFmv#m`HSyHTXX?A8lI-Fzw z3DDeY5Oi4BsA8hvJEwvu9MYf^u&PutS4h#q4Cz>D@5%!6sM9BjtW|xWN!+M^zg6w3 zH3uS=Bi=~t==JOMFR-T?-t0aS6qN{;@%6;zz>JF&DZF@;l;66u#MLs79RTJI_gK=n z2q0vAyTfJrwfdtG=i9_!J4=o3u$+Co?7UXT%eKi;PG%{b;{#)+&oH@qh`cw(ev=3x zQvrBqeEK6ZQS;|U0pY=-<+p;gRSn=xnt}OPc?WXzS8Jf|2Jhm-5>oa`kRv(m6CRx% z>nYm-*|whe4{*gY>SEf$y?SA}{+KJFHr>d!<1tp=J5=j>8=|PcT&Wn<_ybHY@4jYc z5^S^=N5Q261NH$>9i6h9?fJ@ccHiBC$%B-_^o&I-VhLH&B|+U6Gvh}86TaGO(gaqD z;zQjE`fa1O6V5YCXAU_@llOD{{$1{8=Ezd>=6yl7EI2T}=TFA~R~nVnc_(@BwpY@F zn{6A5Uz?d#sp!HN(WF)rMKSlwYs*SsYWR@Ysh8fvJG&0FnqXL=Dv;JqeyJsw6CpVy zkW9`q+x_R0Mvp=7m$2F}iexB3ZQJkhQ%ftNB|Oes!OoP7S);kYz*D84hfH>>P%osHbivo2kPa_`FDr1m&%cT2b$i_=0MIbHD3wNM)k$Vi z%C2BAYh}Uu{{cERgYFkwJ<8k0s(-9X$1oxyBd*F)e+DouOr2O~;tir3ZkVtHT*A^e35&9G zemNFh``|eS!Vh!+E++f1TqdGXoAhd+q=t-@1t*=uP37X>VodglOYYk-xEPOQ1K$(`WpcD*AGRCf9Y!GShY@>^8*CixJx_Nq;oEuI zPXg2N$lizt>w~P)UE~p?S}R$e)LUUsgvw`AZ}A%})Co~Av3J-Qt(z&m1g3Q@EY%iKMlGG1~SQNk%Y zL=0Av-Llg5+TEl77}TdIzu{rvS=<_))$X)<_&W(KposqIc8}a#hI+#Bhf#_Yrk4k{&RD47 z>348?)&8&Oly%~^<;#&Cy*_<8$lRv!e2>;A!Uom^+dbdTso=ru5)jcEKau%nq7gSh z;~t65s)UIPgf6Z&5hOQ`UwC!9mCTo&I=E`S7x&v=fRd95L{fmz9Y5u!W@sFJS1&V# z1@G>c8&XN?^TR_MMQa|2%T&7cR6!_?CR$ogcitYZTt33bZTqq{zcw=)1q~-6fk^y) zCfovM2D>!Z`!9|~p}kcnchlV%Z16R4mlX<7T_d?Q|B%an+1PoCFYjSLTX?S$dyEuf zC{|qw_aF66-tK)Pyy|za%tT8V{XFm2maeb|%!XZm2>=!E078h{iEq9Tca|A`+dda7 z`=L`~rfc_|RjmrYX1jowP8JdeX=rz?WiduP(<>y%HBQ7mvJ->j=^~_Z=Ih?dQfF#V zf)-`;8rP5ha{8~93H5i+^d0Yvrg+)o&7DsQL@R9~*BDMD6pGjBx$?J$M#Sh`B+<`} zSHdsgFA8v$kguulz4~$e2CBe{qC7LdLW)cH9GzfyNmSt5*A2LAjcG;*u>+Qc3Drgc zW*FDZHoraE-Jy2*R&AEG$jeI~dB3vA%A$$_7}iOm&0Ws9U&*=I)`x0MhkZ;MrsD$U zbIwtr=gku}UC|=}*4?OgUpJq4Q@FSn6DOHh^Xcycq7la`6!lhHQcF8>ipl%g{@yQ2 zzV`uyoMdy*7R$&`{ zF=}>?Cnj#sNex7M)Q$Pqh2Gwor|P`phGsO;?NuKr9UaawzABk zM5q7JFH=`1?m=D59Q^GCw=YsS${w3T5`;;-lfQ2+C4+=W^Ly%xf8{Vd1Yv}+P=QRS zaD;*=HE5`?s-4i{%lkj5LhmhvkXe)^XYZIT%zl3EVCURuAR{);IP5*6D3Qg`STV5t zu8k#5zctw{en{o3)^V5hje1+`1|YE;B}?Mq!`*^5>t$}M_b?-!_ z*#KK7H)5J){HW~YLH7Kb`@F=z%yf29Q}A%;Me|iIhb0qC;e)aS@kz3smWQ3o=}Wpe zKR)uq<^mf9t>SRgkhhwBGUNc#aGBT*WK$T~tcFbWwn;&R%%20nJ5x|WI{?@{`DS2@ z^-%WX#DUtuN+HkT!Jw8bX7RQKZP`&1(cH`X2eT6k@2P_l`Eh3Eo{8kta8GxnQW5ww zNAdS7=fi>hiCG0@))s~7{j(K)$fd)(hhF4gHmX&K6eTM&+c!wZ+5h`v@?&F{%l#}q zI*n2{4raJ3;|7Ku7T^esYU-XDSx6DXkOJbYg}cd(N+sPjcP})t-#cQ;C__0_PFEXu zM(lfq?MXfnRm4hWofxt#NDO&h3icq35;O{;oij0 zHM}w`j}Mha!6||ow&05W3jZ$sqhu|!;a+S8cOos;J;jlX0u+pT5ru@5n>}!*_pnAa zGh5RcAP06ysWdC;pg%6idHi}g&k_PVY4fELjo}cmB|WZTk-xkcA6o;}R|jf#e#i4Z z$L-U}rXV-8QEJ*yXG{QSwmhM49+b-+MVb_S0^@kAKk<&BETDPCKv|C_-&d$#H$v_y z9~y8n+^fK_Pl6npCXQf07+}u8ym1dZt6-k85D5(V^4lNd}C*W29#;FVrpDxVD= zj%;SNk%dS(g`2Bm?~TrRM;aTD85SYzVE}JzLq%kMj2i;K(17UQ|F@Rn)Z%1uO3LIR%MoRYhAKW(Br`eq&ytNSxMO>Ax{;KT`jr^Ml)P%F8gD*C z5e|ST+>!N2|FS%_R&*#`FJh?iQKyNLsAfkG&cc%Q%aUZ|+U=y1nLbPX%lkbOeTe6| z2DeSMY;J-+0!Be}^tP(=TVSX^ZJ#YOQ}XQEFh3s-ryUhNOGx z596W4P~;X60z`A_7xx2Q&v1CoIvkibG@><5m1{dxOZ0lBpJ@GMmZsxA`ss9|ekF(6`+!b`I) zq*#CM&9r`)75OWn!SUs+(p%ieY;DA`nR<^W)2+uOKX!}E8Qw1EM$pUd=kpoukm z|C6FJu4&p=%BADEF?;C<>!sBmk#uLHp*k{yU}MXLP|kle+%YeQNzTKdxM*Hx+(qa< zLToKjB7XKizzZWTFQH*(Ed$46oS1zIjgD4+?r^5$39}~Ha)LZ?a{)QTx7chOy+`&v zZg2qTq@o%ly?+htSW}GtE?ooJTbprJak_v~dfWqfLqzMt>dS$objeo2*Btt7Lw%B+ z&KEyez3p1gpFK-o$mX+xIo8wvquu{(Klqkk-Jk9y>Qo&WYDDa%3j!%2sD1gF`ofQ{ zix9BB&J2ud1i zUoH+5hl=dV>rt1TH!^F(F$L7LBJr#|WE{y!fQZfk>lQhBE;RP?8hYLp`(^3PCx`5H zeq}Ms&*DDSjX(rD5wbT5a@lVWzgBkhcz8^(Md-L!-xFN9X`a=Nl7(@8aNYouw@bCJ zd`S884BNgso7Td9IIPyT3PUuz8}>LH;j;d|+HCVYzwu$aUYYw!K)!`^bBBCePgHRf zTIT6M(5I;Og+OgWROMJxL<=tJ<(+7lTOP3_eBUZagYNeqaUTS=tUp}}E1K6-sv9|h z57hG;5C@A3B9{GxmroCtw*|?3K?CG<;N*)aN>6WsWGE2IEZJE;sg8q1ZLn`UCVymZ zmSZM)Ah$K?DU;n9Nq*-h3M*ldVoE`A(3uNv3MMuH{}ox3H?T;?~1Ecy}NFJ0CzK7G%m{RSL5({LKB?Q14=qt+n;Y9@i~J;|ro|%77xH0LECj*Oylfvl80DrsO9e zfFe3xXsYQ~RBcFcDn6A@&&O(o^HBOTIofc)Y)_cUoUw~0mAEX{GfuC-g2@pbr`9+U4 zTZjPQmg~tF5c`%(Q)XK&lL|BX&)E^ljA^56mc3n{t{U%R#Q#tL>*2@B>DIOEwP=sx zU(@QhwVpn$*9LWU536$aQU)yRYr{z7Z&u` zEUa{b;kO?l%&%Jg-8Z5&Zmzh)$6CU~m8bzB{OPFZ4oiz;cN%I^ z-M?>pbf?7V8lZINXn_F=f~0hVbdQi2jpQi70U{{f9m4365|tD-MoE_l68E#u&)?^7 zc<1Z7&ht1ttAr$nN5w-T_eN?*=M0UbyGFH@$)$q`bN$t@nsM*j@`o6%pZz5w@AJ_rMYK_r|zwi9cidX(VCB2EhyA7zB($ z8xVht3m2vrYQ5Xvry0rBI#AXUi3>d;9Jze>MOp`kYVIx0ts|P4cSnycAK-X^u z>QW8*47fXNO?HnLBfF`X1?Bt5T6pJtGp`{xa>{S%J zqkGFo+kaD@+d2eI$c+!Mk<2!@p8kv?*Z8z<{@V2LuMXM7)w|4hIp|e5wi&t(E*?@6 z{AS@1y8S9o(EIy@R*MTt zRwc-3gfmXW4@AG`2QjCNX)i=bh6^|3?mk!QC}u?zFfFw_5&BT+h=^Hw6#M;e;Zwcf zza7j^pVNQOTV>yl&Rrlk$;Y?L?jYj9!&A;ZQ6WkDM|SO!GmHPS`sO)zwY@POmPdzQ z9OpbEKJDAjbi(~z`d;8$xN`#3HC4TFT;hGXbNm4NT&tcBk$aR=TPL)RH`}E5Y2LYB(ogw5i&x@1d`pY5Hjd$EiC2yHML~klC=U+8 z>!Lfh0MT4*otI=W0sXD*t)NS`XNQ7J1MvJfl@wk01k@=4upa*kVly~8DRp1bK5Pn* zN%WK8poZq_%7g@;gN@c!x~C&c8$aB5W@+8x1sa8sFD`JjCLS)=@3AwSF2XQp(*FUj z^3(es{a$1U`|hg;Dh%uhrf!8#68_qd?CvDc!$s21cx4EBYhLG@{*9e29$dE|y_q5@_>|6VX@{Rc%G_VIvAjEMR@k4)@9i8s zcl0sUTC=ULomw_iix`|r?H4VHoc%Rdo<=&}z&)BNwd%O$&}k~9*Kh_X3iBuaohhK5 zMg8=ZbT;`n>Vw9Z0Z{g&w_jTV4kmr@LzX$vSW%lbtA(j|d{R=7dfYgm6;)K`dj*_G zcb2FdVq)|99Ka(fu_|<^L96aHi7G{}Taknf+QaU64{hc0{Q|T8^Ok+Z{p#4nCRKS0DL&{w(QL zM6-6k2o66$0f9hdXCYA;CLOW*tt}EnfKC@-2A%{V@c}tJISP3ACHt?AxWa*t8+0k> zQw$4YrWB8VHJ)M-pHSQ1)^B!Zg+RI_Ym>=Llp0PltifAw1&+vfJI7vAnpbvB1a{nO z7d|V1H(lUjWp5n}aA3SXRzE4pLM9pi#Ys{$3ryck9$)qsc*`v3?rAZ7TLEW|9RAZ( z;~MQ^>@&^}N{^)&tBX*q)8zefz6Km>88=+lJTLJ+7c&6GTu^KIQ}H8Arb8^6yXIWd zt$$9?Zs&^ccyYm+E}0JHkl>Jpos0)krEnj=v$xO83t2UtCb$4rS^%%wk&s8T{H)=@ z(l@(8Q^MQRUxN*oSKqc4d3koMy|Tn<3oe`B>9k?%bKz`4IRdfAwK!Y4!w8~H^R_Am z2y*z@82KI!=XMKBelK(!9AtmO&VGG{4mssNF`_FCI&EH z49+AmL|M<EEA@^pPw zOeRTXuQj^rPO17$5hgGpG}SjPMs<{s&XuSk;Jd$;rjxCEw!47`-RfP<_|vo<1;%Xh z@a!HJUw@#J2pLW*;?vjj>gM*}^)fxasUcajpXD)lH317`w>q~f*DmILq_)4Oa4UNj zoSt5&xeQTM_%O+hs$I#WwjOlvv`>$&5;vzco;iw#bf2ROJ`hk#W_H$AL-Nika?ZB7h6wT=>jk_~^7dWOi}aluas`X3!}q!1xS zp4YI>z1t3InGDNowT~2*w#AZoUmF33&pftAHPVJ&w-d_1LRsk#Vr(lbbYTmF51PGC zUO!Wpkf~v6lyw%g%8Z{;UDV#YJpa(j{NeJDHs7 z3yG^;aPAOAJ>ZV0bX*=B`@UA`vVF28w4gPuG-ex;2c?EM3HDOGr{Kwb_|1>^S+^(LM<^o0b3kE3i91IhSc;>xD5EfeiG* z5g8*TOZGo5WA)}KJxRq4z_K<^pDBe#uGYG@oIH7blcsY)qsEHx zo51Om#{iWC|H=-wx94}~wg?ggh>R{NyLF8bHK=L>XQD*+TCQx3ZDW*ijXA3aB0r=$ zrWxI;EH)^2N}uHXZzopLT55P|FuMKjV^S^CyCA^pJih+f-3QWvO?TewR;dG5xOBqm zcy1nM$1{&<91tDiuXuDwNrf4HT^2U9BZJ#H%B{K#sKQYNk`~~*;-g&UyLPmW4_|yn zpX0*RQ&!b8%VRT3M|ZZe<~RzAd6UUgo8)aDkFh=*c(U$ z>#Zn#7Vo_)zg&^7*{{HC1kPF>CfcCXt%MoVm@?0sXY9gmzh3H;orhn4RE~OV)QREe zK`ef7$9CtQN>cI3vqQYMh;hfs;R;6+s+5wk>HRO~GQv(7N7EQQdXhf&O zIOxEn3e+TO=(Pkpd`)?jkPQn_%dQyFgf_iZVH)Z3=ei!QG!`J_C!|%AodLO)?)`c+ zDu{lYql3Mi<;DCl&jr5Do6b?+lc4iPclr>@E~LxD-sSF=L5wYJ-q>bEqD#r(zkl>P znO|z%rLq|~?S0J&*)3GWPuVgD8wxdN3c!X50wg!58)7Ol zC|?66CcbWAmd%owW4>adGlI5O=VcR+BkKeo55Y@L8Eus(Gr`5Gn_m*O&r}lISTwWs z&Ok5gCAaIoQOmH(`CHh+zg*mnxI;rm1cR#Tx_%113!Q8l%ohh`(IBczeTO~HBxrSTTxA2}+h_8K!iIRYwn&HMUS;wj26t10RD1ABi+dhbqm6I)N8 zh2tX`&E95bhtxOo@#Msg<1?yAESvV#E!|58zVo@y-`6uT1x02&Xg~7 z%0>|Vhsg7{&^x5M9l`7*p&x=hjNFm_hUHe@>U98g(Og`I<(;<)Psh`&BnrN{n^`Mw zAb>JB1SWB=(m)+XM|*dZ`P{GYLQ*$m1l!B7vSE!!1_W%$}tC%7z9V3=|(U|&M*_{{}cKSngcGkyfw z^}XJOfNkfiZmKywo@0E%K}f=d_99^Zp4>na5^xX%gQMr)m~c- z?vdPmUlHL|qluZNJb0COmDSOd=IPY^KFLW_-m5g0RuZNVQC9o|Wq4g;lD9H?e6_Dv zbzBi@x8c-&{ z85#RBRJ~ua=nj>NaKibrDag^}p75)|wKs1fB9Yri(gW9@5CCS-Ecx;_dn=7;=zU9a-BB2;_?6E2gRtfQQt~FnMl+1JUY)`W-9RMo+aLfY1 z|HGy)I4)e*H^rAoaJ1hxyYh-;ICjbcMsf!M zLjnM?#H^J!?K84c%45BIOSZ(l;SH}_M(n-3B#+|iS93X>p5YSZk;rXdTvUSDwWn>V zB7a4(sJPD(Mp&Nqy*>R8FuE>v${)u#hB&*;)U{>~hqV>vhJN<3Kx>eHzJ&<&aT$*52u$ryTwTt-re(I&81K zYHliI?1B-yh)vGS7c2*S`$C2?8$2P2aE|ZAJ98Xjj!L~FaqO|k*E%D22^X|*oR9=z z+|{)-#5p6@c0r4nhNA{l#`0UV%8})1`@)s*&(fZ=UnS|Dd_V8xQBxCOHPn9qa+~+7 zZgrdO{TJ+9k{k+xZ!P`zc!;3tBOLz>@AIX*#zr|9p*}_h^oLUKHS9qFJkOe@i}pUy zO_q|20e$u58os>`5g-%()@tZw^wn6vo72&Uobb3D6O4-V+BRc^xgvldUeI@BNWQ(T;dTJasO!bRD$B_)StmDc^)r znYElf8&?95cmQvFJ74w9mg8YxXb<{%TX*}?!(+E6Qj;tmF+qGIH|d1RCgY+D-%}$~ zu>|V>v)qfM8wnL^p51+-%4@|05@gO)dja9WiNw6;F#)r$pw^^fJLT4w!# zpk7iD2mg6EQ95w6_)&W-HL7P3d=pKOMr;(F+WapDxkZEcXJ&DV{+zAv&X-SGc`YP? zEXLWoDE61fr!4a5{eIHhQ;B{wlVCplnI19<7-cgjM?^=7bWJ-?L}npl)}HTho&QJ~ zUyZa+^&5rUB<~g@NcS###*5cCrL`R@1P0Xca`&nHW|wEg8R}P0VHAnYpbIQOqT5f4RBaGEHz1nOS|8EhsDJStCA~ zTE*i#V7i*MC~pxwc)&!f&Lq4j-UyA$=+7MfgTl6Vp50Z;RnFI+6gjx)YvAkXfTMs) zVG(O3Ih1mOqRY#&$Inx0$D-gylDEk6i&=s$B)`g_gx~i&mAuV`u|8V(_{V9{B(9`J z)8IEVB#*^M)!}0Rbm&gMO_ZA@jY#h4Ngx^T_;;QQCxNeZw~di!d(d&PtE;W;_({sy zm=ETc&5HE%em5M9??>YaR%&G{e`TvE!ho#KH#E0mzq@&NYU+fhdIIf+r*Sj!WQg%o z;lwK8*`29b3v-bQ*E~88YuL9+o`i@<{cynqSL8kR$Leyt6&|`ddB2sH{0nLDIufK+cbFxK~ac&ct50_ zhu^nRvKXzfizx?W5MMIE{AKAWRGU^yZD>bb6A%(Y{r<)`IwWyB1jKX2oR+S=vaD!c}jFI3LX# zmGAD1M8-EHw7Cc7$r?(iX0~v;<&;GeZhrVjvqpZzMiG&XNyFvs%=ONm$`pt5IRRZ< zOt^H|Z?BQ4Xt@!+kJpBUL*c760%F;IiR>=NS_@34SNy}OfluAf<+LcdX`%)ETU z;Amt{AVj>Y*v%fwUM3DD9bkW0R!_o4G|kn^Alf{CJC)kc<-kGpW>-lIN2dS2{V^Yg ztM~bgEBhk7vjavN#tG%38<~<|4_j~f67CCzpPDpmXiFag{@MHo z(vDI+uQRVdgz1pNP0r|}3o$&_M$Rpq=un;y|1ySqesK)1x`zB{I7DZBE#fP&Ne|St z6}IY^$e-2Mf(<;-29)o&pqn)NW(u!AbmxU`k@(QcduLU;a6w#L?PQKTefw8z z=^{i!*iMq8(A*uchds;ssdqk?<2o8Gljmzm>`Hxh&MIQGw6Y8V2kQ(!Q9tTyy`%-- zzYlledt+wa*7V%y+=$wT>(x_{;KZzS+f=qPAp3M31v`!FXQ=n}>lLL&kNEEvcegbK zWD}q?(aBD)uiG&!nOk1^WhFuD*7$y~v%3W;uGLE91U@UBjhq}mT+S?%X50w;$cJBO z+KEn!(Gg-yRYawjL=Gk5Y17zxL^pG><5J|DzAiUm#?_v`q-s62ufyUzqcd&U(%s)e z#{21R4g$;-%w~S#NQ_2AN*@T|joD9$3 zX`Qwv4l{trvV1sJgfNDr)%KQCz%`k4owfC@QIEeGdOz-3drI=5o z=!rI12YSc-0pf3ER7P-YwZHeF&MM2Q`;M&r4H38oq4e~$?K0Cs-x9Pj7 zv#4S+yIf}dwy6;7xkf5pQLi1&d3u+S0uAWV$75Px2cyLBj*Jzeo)~!;=2)>Py&^6t zAm#rbpyA@J23hy#IWe3W0O~YcSAOqxacTGyx1aL#*?eSqls4uQNFF;S=r|95_Rr3v zr=e%LzRpW^)EenKSFhi$74d|Sm;%WtI<7)EwvEb;QVAVC^gM;+yb@#iaQa8(qoJOJ4uPt79+f=FP zvE8XxD3|jpQD&*vqmX2YkDkt}U6%I9i5rsy^f=zP3UPa9v5y4~29jTeJM84t>q&Ts zD2fWeyXk^w@2`q}9M*zEHzDZ=o??#z`>r1Q6;pUbZ)`%lioli2b5AGobnB`lGw(Q&TG-!oLM@T7fbL1+WXzNL}by> zUl$<&M_I5Mx{miqRO-x?V!iarPzmWoAx50m#dMUz1!40Mn(m)99_@#j^oGb9>N#)!FHM;uPm)#;Qgx4> z!NJ2n6)*fGRQP;kcz)Hroxt>0s$ng=#|e-m7e5fQSUlP;bZ1d+F4y{lGtPR%JsWp) z{LI_#12qwsFH2TxadEF}MkMzVZ&UhDGC52N7h7}RwT;mdFa509>MUnQ4qRLJ?&^Dl zx>tljt@WDDlcvsGQ}enB|3@(JD2ie7$FyWPDTW}W3lsj)+cYHI67kAuEa^`jit~gAd zNFEUIcC$#QUN%YN^Uf2gi;*^S8iWWAe#FquKK5q*(Q{hy6wk0L<7Dj{LQZP|8pX%=cep=8AC3y5aiVS%#MP>m|IefpA6E%Qq? z4uY&?*ZM$;tGhi!P91hiG814UUh%qF>G-{rq1Bp>)YSIJCVV=;-7o^{9{{nklACSV z64&p}A9LrPv>v%rq}Ba+C@Wo8E_L->Q0)+`7$23JT(i6>w%R8#hRYc8;AHP|v{sB{ z;OW%5b!#U_$bUF!cF#`>XKQ=Nrbo33XM)T(w$lnotSYCd!*R90Dhpo!ML)M3`m0RS zbvhaogbsaXR6@Sbtl7H4(rN_CoDyyyqI3+jVBAIq5y{I}d8@b|>2K2$Ob>^6;0}?7 z##_8|8Z{T6nX3T!MQceAK9{|(?0p$7jChsT_6FJ=mfMVa3*rP0~IhVKT;4QPLh2#2$Vv=86m4-1AZt?7^9nxRt5+-9a`DuD^)BdS{%xMF0I zZZg^G-C^~BcH1-d3UQ5;{U zUF(Y048JlhT)Jx4A3*gv(hgE^t$X`Aa%{9Qfde$ge;E}C(iz&uxP#9% zeKSYdo+67H8g(IHa%$og@jrin^y3~ON3XezFIfFUmF?A8{G$U9h}cmTb^*Q~*{i%w zt+iK@thKQroRany*ifCn86xB$_Slxf0diPiZLOzEf~!nw# zJ+cnJ6}a{pw2^E+y(-y+{!zh>glvu5zt?|ig$?N!D!zaFoA#-^#Z%MTCPwm@f)Jkg zft!P?@%wgV?mc#~Q_+F`<(Z#?{T$GI{idJNEE7U?e`+c>UZn9gH^QEnl$o3p7jGI# zFqjW^+ZXooV6}U&gvg)Dg!i?rvoR{IRMB9;in}Lg^^JXu`7eD)e(iM>8i$-tu?8%? zJ`hhp6AWi+O-UJ1w~#~Pm~YCirtfp^p4`g3rHIl#TTK6Rat--&P{8oU_62P9+1wA( z=d2>MyzXp2ip+!}&2?6b&Gx9S`TiyaDp?Li(L~7lZSrQ1o#AV|$^Y*5)w?a#!wjL9Z_9#YU+m55z~MW*rKiRy>e4 zlzuMy4?wK-VIFZaQ`-coPAucWRxo1_tbsf{(l>8VqD0Hr#ctf)Fjc-Bz&^O$XI&7l zEs;M{b$kmE+tqTS%y$1i@F?=%zl9?+Qx|g2uhk$Vz}wRoiig-r-$E>0ZY;l2GBf=y zwNP!Nd1YZND1^ZW=-5e)%56QGV|5DnR24avAN;d}IVY@WaDX{ih2!K4*{)KPv zH$xe=7=9}ofp@xhT~~hJxxQbrtg3IM1K&~Fz3wv1MwF=b| zwU^%J*)dDtd*!@PQpNl3O);YxNqOg*2D&b37~mZCx8c@e5Cer3)LCo9P_uk(|-z5Cb~AaGtypJal3DTqKsD;;1$hC=y&-bsQPtLc68 zK^MW@sZ~sd2v%~h8Hta5KKC_XMd|cpbWPH+BlJUDdEB_U6TAL=`kwO3xtMYM!t0Hp z_7*E>qE-iu4qZm2rS1oBTFh759BK&ue*gwwNhD8}?fhiM)nLVH>DbQ!oVfa7xkMcIuOq)iF-zw>B6AJLcEt$;wnzOsfS?fM!KLzpY{Lkh zGIKimb4zEaGy`QLgl#FoM4ntSW|bqEev6&IJ8p#ZLuay8B5lnPk|5HF2@B%Rj)iL( zNdL`03_|n%@LJy|UM`r7PxqX(UV;G|kB2y2v#`G3$n5r5*K+7<3u#TKbG@=*ac%$} zMb9{!27u&XoGtY3=(@WQ{4eKRb>CPv?=89ITWa5EQNURb;-Zz^FXhLn{=59b7fv)t z8Hud^ufo|y14+A_sWdULFthkO^XByLx(V7Y$q2l(8Hu5Kh|&yEsY)Uo`pVoc6OwPq zF0+(g#$USkMp>0a&S+^DpL8oyWamGCK5TEs2cI?*o|axsS85gVz#u;hIxVmF*nzTY zE4~9hzF=1C-lZXTf<;s1<46`qQ~5q)4B%P;Pq5*|CGLna9~*OoWOpKPr|;(^{Dw6x zNW1&KYUVDXTG+OAgi9RLzI5+ahV^jBJ7o(#UVo8k3^y+NKrI<F)`m2E^~AuY7PPBB-T0gsdhDNM)&dvIdyIyJw@2hVNw4 zx_V@{=JQ!O%FfTbiz>*h5TvwxQCT; z539KS2e{#WkiLQKDB^UbGZq<*+ugF4q(u?+pPI38b7Axp=k)Z1M43s}yu5uwTq#Pd z%jCR?rSJCd%)hs>m`lA;_>t7|J>qu|39|;7nA!6t5&8~t8Hmt_Lp69jd=_1e?45?i?z#DiHwFfz1WAmJO!QQErE{!mAc&vkQg``PQ7uAhD}Js7+WBP%#n|O5cl_Nvjyr5x4(q(C(KH zMil4zFQ8K(Ovm08SwpT9#V>slU(f+C6fqN|VkGtlDa-Sbz}E~f$HMYkq@2^a^TfGI z+{qI`-usj!obhZ#(rKaP2eK-3foadT5;lQ%vO(TVS0lc%&jEnSE!=8=FwFlA4mdFx z%)cqDu0o$CV(;bux8+7$h$-eghVF2=Xy)lVYrBfz3A|4N>o1KS562)ZM zq~Ye>vM(mPTBM^{E1P*_z8U8#P0Vb{D~1Jk&nrZqL#kGF$$1 zgz~j-JFRmIGPgfUbT>|FeSUVbGF+WXuv(JCO8%!_^Tr`zvFhOHG}5Dtr(-NWG;n-gs@C0zhjUUy%|o78a#^ z$5X!Fo}r+-ux#~&-Rh!-w?^cUJmJO+Y|M{d$lTOvkH$?A=*Z#fn;poBvOnf9v(!C?>bB3$$ zTWa;0x$@UE#~^!nG~iJmE{qNzIi`#HbAoG4rlg>$#?zV-(FYuZcX1KD>=Xkbf>3q6U4n|kO%pnz{NDHvn`DwR$v-M1HWzx3lK24$_)${dE?7^f2gK#yR4SR%{s z4GMR59y~pmMp9|ddCtvSA-%R{-Od-3TH$^@{nA%av8`lNZ!13*(1yEl4ST#E6*#sXmhY-63F}^P&P_ZT5*CX%Dc8Ko#);GsaLxS1^(2?)A_Zl>2Yd!k@ zWdQ%K8OWIZ`%tt;k*t1C>o;^8+y!!kl6cLtX%KaeSbh6xg}wP0`PwN;~gTqWJw zoT-~*M+n?XAW|~0eOH1Vfv-wJend#08STigLq|*9ng>t1o=x@SXmOHXM5~R-9}`5F z1q6qj=F*yaT7SB> z=TDOXL7_c+&)N#UwI}%JWVG1*3QeXqD>+uPvQQqr8mP`CXpzbJ))RU)Mp(QYT z6FFRvFxWsEOO=qI)>k0k+Fk81L=(jxmTtk>#&{XD6xECZ27YH37o3bq|B;P#ZY!J@ zVW3O<5saI-iMKGOy`JCn92kx#I_5ixTXTIxtmFan@ zHPa*zhn$yfJxU}(0OY8!z<>-DXO$IxwCq?_K?ik zG*ee+UmtcumQTwq@bR%>)gl>Wjok zdVYnDkf9!(LV79K1z7I3m9D``CK(?jRFykBtkTpQDR#Yht3PoTt99yKfKo{;e4hKe ztNrxotvfrtYiIkdR4_HbPcSoL!U+W5ll7W>e4ltGT$E72TYf-JJptaQm@tsX0pT+G zG0kF6aj8MSZ&a}02;S3~_nXrkgQl}@oIe5o1c_Fy)3%=_;KR)QKPCJaN`+yHe_W^> z-rlM}gO4W%QK0;KX9+!-0M>GqE+Q3){{a6Q1@~+EVXstRGfkV?;mP(XYb}F~B)~>1 zK%75Behi2N;jE5;@dDgy4mvtsxHG4E1--fQ^8x$diYULJbFA?dll?y;&5@$8 zeF*xv_S#)ae0WDpR)S_UbO6bO+4(&#eIBxp?Gsco^0#@xxZvDIl`5Q=|$N;hihAB4?i@U za)6?c*0e?M4`ZjvtwRUsjFzGuC8F@|KfwJbgG5hd{%fcuw*iYS+acFvnKuBAgJcaF zV+ljuEjh}J$6Wl6g7z)2XkF+@|Ms$EOY+qVYWwaK_ZMg5vH{8X76ze_<(czX6 zq!Sw0zCvBxly^hQp}Y79v{vXqebmSU#W&MQl6MVLaoIaB zVZX3AI-J!pxp5Tcvg}Ia^r6W8rx!c`6#wP|*E+@$*P$==#s2-Qr_=AtwlT>~^S~kgp-rzzXFLAqgU!?yLE^ zwj*u*g)-WkCQ&k$vB%^SgZZ9z8Qp+i3*G^1(Ek7#fBb5-eLumh#vdG534o$`SVqz1 z7)zp&Z$vc~XFT106~MPQkio0Ar@uMI1RUVUhApJ|Q|>qmZ4>F4KKCR|-M-t-e1;qc zqB~d-|1SPQ$EIur*DOCycsDoQs)6E+jPKGCjFx7MYfi-^V&} z)!q-UG&ocJsqC4gg#?t%c=S< zK1Lq&WJQkYp`su4K9Ue-5cluR%4DCTC0Sy8IibTBJbHP#DO?gz#Cq@Ia(6nc1qy$> zm3*F0;Gcp{T5;)rz z8(eC59ZJxK-CffKp`d3PRjQ)G4+~vK$HsCLMMy8ZLngZ5}PBW5=YCO7PIvKv%%--`BpX z{C_G?vxgn%dy%ncKMs!ww)f&+&FtJyZ*Phmm#UhWvZ#7he`>~2su@@Dpo(Sgh?hJ?8r^M29~X7!(pw8FRnQ zu7hqRm#pHKxyl47EG5cPYvN4f_*#WSuwaJ1EX{`*f?C z@u~R$ufLN3Wb}ts#GF?R-4Uw7V(8j5`Z+i93UBkq~CjBzOPfJ*@$z$GjRo` zxV&Vpx#?ty7=3x31)DmU^QZJ!1S{QY+{ykt5%zRA6UmmG_OGmjmuEkUH$OFo2Ozd6 zsl0s^mrv?GpN%Bv&v09lzJPNxz2gukJy9f@>>q}Z`%(s^f&k;)DK*}rVFTM@pxR(m zbu`iy7Wtdi>yqjB|}cO|{%o@eIMnx9l1`G-M@ zrCc!?fKv=Ggey>n;H2yq;tMRt($>VK%|)bE>P+_e<1kH(0Y@!A(JW1pFqD>dsM`t> zUhm)q;I$>7)8+mg3jE0J%?kCW2Bb|+30BJN6WM-=URGJ(jY;@zmeR^w#_w2a@_f$; zz>ym;2*=?;uq&qQ289=x#6ftRB}izsqeN33?TGML-eZdjSuxQb1fskoZjLnZnqpvx zYG+mkug(OQo@06^6Y_|A!=~2K=Es(Rsb*l50*F+VS_Zt; zb{^3ci?hQ;!2ANT2H96W1Bjih;m)z+q|{QqA>qOL$h}@I zBOSzVX1?ik%NQGJP<&ubmk{&SMsG;p4BeVSy?FY2p-)qIlRt4*SD8F(8h&~=oijsn zG7dJ|>1CK(*I$1vJ=J;yYAk=u_Hr&3aW~AG?w2kh$TRxyO?!!F{J2l6ZYGijZ?YT# zBgTNq5f9vrfhAOy8kPI`W)kw+b0|x5KGmBLiJs=vvw2+@6qJPs*s#5hxnvUn+7+W6 z!=*EXlA0{-P15H8gMXQ30t)MDJ!BR7l0Qv(RhBW4cF*ij2*tlk>s&1sUxJANc<3)0 z-u@ANT(wI;@s}^vY$_O~Wufjr{XEllT*-rXNu*Vtx!#>f#el(c3O^g6#_Mc5Ba1)I zk{u^6r;-dNkI+d(Y-CPVOrCZayl;^N`|I*Q>Iw3Cf(YicB!mpBYt!|Eqr;rUz=0D= z(E17tMe7P*e9d(MkNAG=vp7wW31n(B=taVWgrYd&`-@=Ez1;;9i@s zE^+Zw0iJXM4Zxdf?omC0H1*0gOB}U{QI9#sm)E^sGam~V5FObdckk*Qde7LIP;vts zCBJDug}=#tg0IuS=dWpr9Wo)`q`MyIUogF84|_Bt-qcUY{EZ`7mRkC2_f|Um8Lt*K z?r^&~PA+y=iJ->DH2kG*OOi6L^Cmu>vF=^So0?-((Z{p_DzOkBr<@fD@%k3Xyk{5p7tGstfeiey~rNLnOSSsz!kTxvc)$wcbU4ecq|;!A#;{;nYApKse)}_!(vR$%@Bjew_EOb@Mr0 zk#!=1gh=07e^$z(3?;Sc$mRZ=Qm3fL5MJe{!;DFe$6_<8H>%`sk}p5Hi_yA&l9hK> z6ysyx%Dm*W~$phL_`bK6|2|1G!~^^Y&A6ml;|In!VQlhZ|KbXGG zNaWl9Uv4!DeDO7MR&t!l5$|;~j8JU?^ha(cihi>8O%+7VtRv+SKrJUF&SfJzTzWe-?5Ji%j>(X{7Q5eANvZu5@ungI`e zB^R3Z1&1P~??g^zN0n?uNucWsw+6bcd2F65n*PGuI%U3<_xYOFFALiTASoFVNnhP^5OWkYz67>?{)+DBbrIG*uW<;OE&8W~D_}4Fy{{m01J%$uy z67kPF^1VL)He4F5ia{jh;AF~yVFoY!N??7W4_`N0#!?^nZ6b`%5{HgBjL(XuTTNHu zxBlArZ)gL=wa!=b#Cyu!D%o<=v9cl3OAh>fW|#Lg^I)Zl->;MlUVmI67CJKe##uR( zYr>+hx|Qn4PZXOMVfZt!$3u`YZ)e$+xvf{rN2)x&yh!X3Yjz%MF#l@Cl+X3!{-O}n zk&Gqud}AdOj)p-FM!#mDZ(?p#XUs3AHE#voe+t@rw!i!}O`fGqPV|CZzf^(UfB$`^ z1ig!jI1sOk%=V))+v&4cxtE#y039Dmp?xRo&dE$wt0NZuyCszhHE|T&c5zM z{e^Eqy;?fp@<{P9P<*y_V<~yx{ZTx=#AJ=@HYwId~ehFRr@|UCpH^Cf5O~?t5 z-=ZT;;X_E!d$p?TlV^`fWUuDvirCC)2PE|M{c`06%GhQo1uuQBj84}~n+_!2yA^JW zPRbUD=3xDtqjOMHvEqGzP2!ouv^3SDy*)~2n5jr(R@{uLi<}&gzrsda`YiE?|D(=* zk^K{Ufx00v*b}(Smnug=pW%=I28V-(ojsyBkZ_A=D&uNDV@!k-PoE!J*4Jo&AaXvpL zQ56R@!O=-}p={BI5(<9Bg2R#Ag_Z|=iGk)Ow1DyJp(+>f{o2tkg8l@-Mq%&T`$i!= zPwtkya%>X+1o;M=XT1qUa)cAz*SQcgo%-9C#>eE&L`&dC>8fAoR9 z47>B02@k99Qd(~auTdla=r+}n!<)vN)+}~?IUz!*NV$aB>1VlqWEuOF-8jud2w=qr zNYUK*A~F2`*m~=)sJ{Pwe+cOoaFB+fyK5+s0YpK%rH1a15JW;shXDpjNfGIkF6op8 zi6I7tkQh28o}YQG?{Dw*UF-Y_=j^lhW8e36*+kn=Fkb(h^_AV%rO;_aX;CE@X&NqW z3quZY-@Sd-j-qBf4#jKZfal4ws~Tv- zM#j<$W4g6?YI`0~Hm@8IeFD1J*Sj-qv*Mmc>%fp9P?Zb7AKSgFsWS?>cpXw4{T!Aov%9Vsrk-zvwk zZd|(&{a2@NtLo6pCp4>;7HjI4rkFF5|Zv;TD#2 zE$lZ8+T?1R>SfV%eW z9TaQt?vTK?#acEM4%+A!b7$%~Gq!RNl#XF&d!U_w^+*pa+Quv~vYtrPO%VKwKDrj@ zI3V2+Vi^)MD~jJDW|=dHeYqLphc$&z$W?bO&W~l_ii3Yih))2akGesJK%OlI$DUI^ zxNBQsEE!dL^zZ4k3{hWGrff1{2!-Yw9Q0PXE6x|~r;iy4dT-)(wxR4=KvrQ^S#;@U zij_DRPhdTJ>rRGXr#r>wg?D1@9eXE;NGzG)(W zVJ{^Hx}w-N;kVv85|KfbiAx6S{fY5+idE*8E`N{JpQJfH7j8?n00Kv)4_8ztn6MM2 zjeA^O%KgB1mg4o5kNPGAl@}kLxB9#B;)#dr>n71FN;|Q>2_skfr@QilN>F2DwSdW^ zOYiKhEM!P_fBunXyFYmV2w}h!NPY73BTQ^r)i#$v?oD_~WDrAHx;doSo=nC7iG@}{ z4djPDB7Si1uy-2t`f4(zL{iSP))sfQ^Xh>_B9|uWuFI4c&yiDx9wYF_hbPGs>&eJ}s@ft%OF`xgZ^=0(&A; zIiXNKSI-)yOz!Fa(!M9_`Mwu$u}KGF>`vL1Ivp5-@K( zB^mGAC^jh7-s?FT6_MJ_9z$zm|HCboMWV6p`ov)!c=)gq)=7%BuYfqW%_6rZc^Q-s zBb8~$?@2crQ*FNmA@;T(Mo2U6wEc=#Ak)BJ;I?I+s4wt8KyaPX@lu%0d#|26TCj4N z%b(goKc=`EMua}^s;ERll@?({y;J@o44#U4!}6!{$Ufm)P<-kKe^g{LMlXDMXGazY zAQSe9vYN^?H|;4E`t4oelboa+i-nF3dn(vR4bwKUKs_rTYh}`C(Q^PSsdm6sK8atm zDKf@i?nZ02r=0=CT&w_DJVrpSFQ=9{q6dzHRu}fBi+1cEN7+fbkK{d8^>wsdyTQIUed@r8AYEp zrqflSlaFtR+GY={g-LhCT#^RPBuDukX?tfdQfxd)(&Q{QM}sv^%GEzm+?TDQew(v% z)M=K3!};6nJ5j`nlsfYBISXNv0Z9{uf3X@B$(D}>_niuDaQa?m+74C;PrLaP}>2MpGROjE3rn+nn5krb902md{et5`H%)8a}(mi>Y7k;1# z9;Sg=}A4_tX^J=q&qt$0Lz|9M~;XBa7+U6nE&laZFMSK-=dHS zPZ@8ukpWt%Ts+Q?zDTQ4VPz$`THWKp<8JdGoPMzcY4?#bn!T}5_2yP`u zDOMchVWOU$xt>2Me;%um)%#lYtp|6h&^KxCw$FA}-7R_x?qGZHu^Y;Z=1%MQQ_yD( z=ZD`L!;73gb#KH2erSPneQ{&~-hNsCID7vCFe-q<0#5m1 z@xx-`#-p@?{2ZW#&=OLoP&c>#dBkjzmczvBfK7N#ZStGaTeW?X+$YU5zn^P+1a6WB zd&2fU^U^>)L5ZCZV%Z66-QUB94a_fsL$^icmvQYidwveK#4W$G!3me!k?ZQNF70IA zB@HPaXa6`HHdUheL$=;D$50N16HHMqZZOqSI|+>w+? zl&002y+8d&o>>Y3Ef;j{Ktq;h3H{lC6Keh@D4XF^#`KY;Z20$zH*qE z>c9U#{YYAqGY8hV{9iMfBWPy<#(2`;3USSGhz0{;wd|nzSspMbMLOKUa7bn0MLCUO z&RFs+^bCf2&)}!TF@m*wZF}{PuDDqy z3riy7g?)iQTf1V?NL?le(;7e$#ResqlH@ox;bQE`K$cEQdGO5A8jW^pQa$=dkX?u< zAYf;;Gx4M&{W2k;sJH5G!lnsP1p}8yRlYo|W|@F+Y#FX8Tb=OBQa>MdfIgvoHU(aL z5~S*2Z2F_IY4Hkj@mf0O=4bbyS|oAzg!R1g;zXD60Mf`AJZO3tktimh&`4yn?gz8+ z>FVBlWp-VP$`ra&FS4|VVAS?DS08swjsV(p#9as_emR*?20l!`v#X9xe#!>Yo)9t> zANt)MI?5fy__g3+cU(j2Sd!i^?}_ssr|Q?{aB`X-6!x|;gM@-a_?wTEij}MKC_=$Y zVV^xpGPdnOdk4@Fej324sJG^@T-SQrj?|7a%lTi=1~)!bq98X3kBbb|6KA_(IUexI z0@LmF*S{4`jX0|)NT*%9D~HpPs3@U6!8@9FVazX)Xe%KoyQ5JmN$ZzoUmOyg^?dR3SquIWn!Bx~)XS-h#&}qc4%$;kI@sQ}8`&YwXuznu0x> z=uII_IUg2=a4OqHSnPS>w?P<%$(0l8BT+Nod~p)NPgdL2wS(yLB&_ldmfDie#chQ1 z7A2{(W-NlZUtko%IZJswiQcsT^XUyjuUF<4x^qa6QU&lm?HpoPi{@R}^I2n-zx|^e zq4e17=mrzjjPvEt$e{KguHT`&|5#|kt=2Vtulk80w43UawhNAzP`E)SCrnsNK^2U> zF+7vGdwkT>S~Ljj~JlD2C^B&XCX1z1G*& zO(eF~{Cd>9iGG{W`Qp_xj^qPxBd37ZwA65K(zlH9fODnblXO%btlf#O|F?lUbM6FL1PLgy-vzJfwStMydFnjS=Pup+ULHC0DqUn0fzsLnCk(t7P$-_b&$&7u#!J@YF1 zwMMhf8;FKgUw%SlPMLJB+uT7X7f-C@XKRvubGk3{jaSb?-m72rN{*~?Zzh`xaC4&E zK{5>Z80G2@IAMaJFRu4dul@&5!xUkuR{q_zp6&-(z3MeYfM5{^yVF-}gucZY-fDDl zEG8G_>pvouSpF)}9H$nYX}J~k(#2=^x1=q66Wq-gbkBfTn1fx4?3F9 zzqa2(v5!}V`6^-K$^Yd42VK>^OnALU0Cq0Y#$!$#DSi|;dl1JkG@$$Lf%-oHsy4tx z?7FSD$wy38kcPR9Ky|l4%ci?SRBqy#g!RWT{g`AhtvD|ml z@yUJGaj|*=FCl4WC^jl(6?at=wsiYakox^N*NIlm|4NGWF^kAe;*d6MWr zt1iKJ@#}Q8`n*v%{Vc~@KKDYuv?a)YfcC;kBCfJXUv# zkum$T{Ryf5b53gCLat%gRv^PeZ&`9PG(7HelFCtkNM657W$r{j{V;2;O_K|_nvc1V zixxNg9E_gXow>=oE-lq~iyreeD6agTWUWo}b1@ZHD$Eo?JS;cx9_N8Y!oLkkEy?HO z;MGI9ss%9m3Id4Av0Z?ZWEH!V;)P4|bEJ8>rVT_mDr#@c27$u^#J$km9GszDvnSX; z+^1EuIFpwM;xH$@rzpHHw|z`BD$Hj|8k|}8U+=^3#EP%o*4>}>r)8vQhmNs3e>(+t z{o=l`ZcDBa8x+*yk-EXUg&vWdfV0y3&ujBA)SWr5FM1UShy|mAiI(}PGT2hNR2cNX zwNG3sHh5^D2ctQmlxc`SvZ4%rbcsN6cQ>$WT!G}F3?unfdxChW*T;+V`DDLLx}d{| z=zu5=+D%x;+gFFsz_?vueT;vm=akWzgk!H-e`9>8#*>a%Tam>9IG9}gDMrZdEAIiVR>pYCl zQpmtC@LnJ(Ygf9MtpHFk6$D*!A%yNLyzBNO#Z>CtUG1QK%4+a6HifVcW97d&~<5{8iZ|E28t7y2<}U` z<0EL%f@W}82AN^G6jp8Xg4ZZ46b&r zB&OD6Fm@s-3lf;q*$86VNf{S7!$wkA+v>GHcf01foh@gwF(RJdWLjmPv*C(jdqb`_ zu>*OJMGi#R>N}Hq!7{dF;yn*qMmS;i5tBB@a$Oe{BCyt+>bQ2s(pOAVFV2w9Drr13 z+4+e;*=edd?PMr~?7lUD)nK_)QnYcf5U2g=cOG^%KoM?|79RNVoW`4o)-pHa>hIe8 z?S9|XFEvCp_wppDG?e{meEXmQJRHqdUV81F9Zs2<3%0OTVIbDOi+L1)8dx_Mn7D-?9w5?nHT;TEqmtkYY=Mke#B8F+5oFemS|D=4a!sj4T+ZYl&zRjq~noa7p>`1@jZj zA#>3hxx^# znqgRj2TNG>aeB`vvYOv8ZOhndueRT_AG8d?6feV0MKySGE9dTTC%7B@Jw1C}E{~}B z+wjY1nWX<*cH_ZvbIOOL)|7;Vfj`U;V&Wynp+7Y6qgPFf}{K|nTj@`Th>Xkhw_`F0_{l4qIHtzUBOF~R62$M+*owuezE z;SvKuUDdyHj5kgd9c*Jz4|M+3qlr4j5gNkltGxe2$2Um~jZH%Fyg9Rl+ z$B}6E<^h#1PDOFoxvG>ZSNVi&eOEH#G&Rp}^ru#JM0yJdywKI={k28+ho{%Mw>|8} z8#j%tLinbca}nbkI$E2JfjEOrqi>8*6S1v*VbU}HNF?!=QARv7r{iLCIAnF%#s-d_ zm%0~z_^nJPD5*>6V*b@d%gcA_tF1y0>5Hu=E+!z<4tZDiTGyTcBRaOXZMPwZVpd%B zyS5lS*ujOocVue>%^tBVPGau^MgXd_!4}8ylEXW#^^L7a&Vg@qE1udVpp2m*(uS5U zImJZt^E}*Z*HLr@z*#TtmUgKJ&h!(pCW;w4{=Qv5~=C4>7KXzgq# zq3g`3xAFE`KX-6+LqW8?i$mc1MNjMx%LX?$ANuJ=`GHvR$MTynr^XVp( zjdqC~QuRZ~Oj9a=eb=C8u-wBj29$o!3grhk16)4Uf0J=w^0Ew<*zX?R$%0r7gG|I> zLndMCTSS8^_ySbkeUDHSK#C4N-Y9XixK#qGOd4sECb*@X%BL=>J`4~W+SF8Z?f6Z9 zns!DYYzk2u$W`wjg)+mnZcNcQaM>L^I^(?=$Cl%5br}kd>%9Ctd5GEE=heXuRS=Af zLW46ZVNvSpe=_3#`e1H_iJFAIz1UB&jQzx(wxiYwQ{jP`Z^+K2{#eCP)api& z`9xB>&v&h|AK#z38dxrYw4bEWRUW3=xOrtiJ_D%wq_H4dO%!d9r&s?2=*1ePzp#i0 znefu`QbqdqVVea>-m>GO8ewjOY46ff6;tbwzXikQahqYpoUdUP1?XfLY7>oDWN=^b zz|xEU^%2{G{KnkG#}sXhg(^^BMxFp=?TB_-q}D&+Dv_E6xsLpyrajRnbA{7=velHO z>|zfhWICoCwSHEWBb-+*vv{F`#`CLQ{MXwaK-ybx@kJ`SM>{n_7?btiKrI#}j` zb^gx(hGnwhZN2V@@ugJ5l3ymC7Oj2Wn5}k@Pwmp2cYW2-)4Z%4Tz``L@%Ayyo^<(6 zEYT{xA9r7`S<4QNCs++~SRoaU6jy{0D@Pm|{c;tde6_(!us7@$FpO`k|22}Gregh@ zUw9@87sAK@@Qau~)$PqCYx&&2M#=K`XL_CS$Y675o2+FBW`B1keC}WE@rM^y@*e88 z9tn!4J$hg2tAI=Z!@#a?HtK!YT=i$;+V^ehn%U2{pCJVMCD`8>vdF*x(6RgJTKh6` zT7)9rr^)qW3opq*(hISaaPMH?UtJ!ye_^4+HYY*z&rP4l-g6VMJ=2$yZuf{7SWir6 zdh2*uy{H?z6w29~7Alr3;h*bA&|vxP5Qm5qb4CNveM253GO&Pd>#U985$~m4b(PiI z8cQ3WmFrqky}fnJnRj>iFj!gvE(f~ci8#;ecGEquBI_3D^&$}!;T&*u+yOC(c*?R- z#|&?GDD*!4XSw&JN#5$ZEod9T;OL?)e1PZ$(B#{~eRX+q34*N|?#$q;1N#^%)~08- z7KEWXv}yJT3IcIt1T&y}yJd~=&gA$Z|0^>p0oLgTSs;Gm(}YKc#aOsioJbeuuew}4 zu?q?Mh(%p+0%|dv$$Ra!LYM)ce%;uAtKpR#$Q8&T=dzh)-24`qMrcZ;9O$m)q8j$g z%_8WnHLdf&+?N|oef78}6vW1AxjqTS1+sDj@~r7cZ#^`+-aP&z94Zs+K~U-@nzZKf z$--NXWavdTo{K@-qZcx^SxQu9)^5f%ZYC0fDVAgG8RPw$g1%i)dO1+?xNfLZqSlE? z^p6y+tkpU5<(o=BkS1=VLYl!T>gZ@(YbW=Ee7nK7ZY;|hS*}ypEC0T-SZp*?+x9m; zgrq<{A8J_Vq_3HvsO)Bf{?HZr_{h4S@{aDP z_p+QI;Vme-n%<0#D=^UAL5t1rbW3AIR54ce!CR_DsoSOGH`KI02X-c)6UG08ta9W) z`7MBuS#<*2ygBx4*jTaelF>JRGa6V?xzC*`bf7tZ_RN7oMuI%oarvVx-nKp^Lp9&8 zjz1LNC#9={eKv@a<7dA$KWUnL2{NWGRX@#06c?Q;1>pdJgj@eC`c}m|j??mrEX^ee z`y^V`?P45GJ(fR8Sf%nV5+~78b;qj=GKu{Cbue|y9<+wOiWchR-g^+7t-OG?B3{?gFQ3A!z`x@%1TC&n=xI( zck)Ie6c3}Fv{@V6U)36YIFmR|KL+`=;mkpNbtvTkO`Z+=^Q?8O;a(gnOCYg|(yi!_ z01{RorifI<#NY3nlH5N3QMRQd8T&z3M_#Iq<%qR2|I!kL*?~R1qsO-16Bc$g&@)9a*QeT2PhLIY zaHQdT{h?is(}n4M@Kft!T`wZi{{RW}2E%0dW{Wo?Z(hd}kr27tgi``w{{aH&?jg=K zEt8XAlCoM-=l1p|M1bWoTt9>gYf$nelO9FJmAN1(zNngqkH1JEq?ww4E%sHjC4mBD zJ#W2xz*|v4x2Y|rf6lOmaWtR!G503_B7_ih&U2p}l^s$1eSj0O%27_E3uJ8-E{g@S zQM|}LCDu!#3^m~_2?`q#0Vaeg2n0L47xUomppgu+=cI}9)auq>xfU3#j&$vOG$Yj_ zWziM|dZy^Pt)-^v6s|BF87KXLN)MimHBd8LT4U2WFKcS3HE19S__p9%f6Xm-3~))T z88<&7iInVEOXPpq6eWV$E>48w*dB0-&PleI{=s} z4rp5(3~xl`p@HMNujQYaLPk5)1mZ!@I(-t^qLPNY6;=0$yRNwKpJN1fKYkvIQMrAY zqh)E&b^*XO49DS-qZt?}b978nDKm6*I1`3U7iHwEKzxIkoIK>7$LPuqa#$3o&^G%g zsDew!A@6qJg|c9y5Ey>x=CJ^vJ@XH)rx zKB@ZM@VO<37IqPvI)$N=tt`I+j9%Y<=a7v{O-zNcJoc1D-G@ZX9S8$XpW7~J0US0z z5|WVA?0`ZSIpOc@A{+zi;YDPsbxz7{SPjhMl(|_?8{HE9plh#<*pD7OClnnO6K;4k z2_SJ%5)+|lIL%--cAB%J=m*P7c$*{Kb9(6}L91ZA(m2#s#pRxK!{ccvw{qsKYCqt% zA(E&}G*Cp|{IfBkD5rBe9h%S`4BC7PmJXx?L1B)aFXzvTk5e1w+Ha3A&*P#ns)ZlZ zumAx7^_9slZ~)u_i`8H0W)bo~zj@4S1Rdmm_g0P#r)xmN&j@T1yslk-FFs~p`=NFT z6p1Q3G9vROppA%B0la^=(dl-g^Ywe@4^We{`3h9ImETy}YAYNRNwmZM;+(KpEh5+*mKKH>qPikULq2a5JT+aFHhgPjI_x0Ji3zer2rM2|@*p5S#4{E|^5hEIucb4+0`5+tnY)ig(8;o&Lj3 z`j0y(%FwAc80N?k6}Wt|A?kiCj8Yek^ z{394+Nj`Ca{$b{NnNDbLswDh$)drR%JGuQtZ^q&<>(5@Msgo= z?NzK@=sZ6ney z>J9vo%Uv`fv}wt&9`PcL&7-?pc89R9-Dh3XU8ImIb7`6g#1GH-9ZX8<0XPt9NcVjV zyV|!rFt?P+dR`+`H?(RBy3reLw&BHrqd&?jG_(2TR=&Y`TfD%y$VOk{slQd|2mT=L z-OUirz#hK0xS6=V`_tAI5Q%=7HL#}7FH@`iCHQM{IH0==-~@lTsr<#_%u4wdyYRQ> zBz`*gZ&Z5^y7E>jzl=HE3P=n|9ni#=#`Bkx+phV5%I(Ct=5srl?~!kcK7S?f^5ju& zTzcBEg>p`q(FWES3Mkl2na@VNGdZuOt==Nq=?dCN&Oe*2?-c~N3uBY_($UPigkUqb z#Cny}7OqVrW4Pt_SK+?Fgm^%A++h3jGP_mI(xpA_^+Vu-RxzV)qkBEK23%Jv#VgGW zTyNyaL-Jc8`%l)oZJN#DCw6@Cl?duQAigMrB{@1G`(JKZ$})1SB8ZS?aA)vDO(nr_ z06g`ON3*Wmifek(&A=>hB#*7P{NJYA7yD@rJJ zD$*}k1-UWyIAs@V5}@K;)Ys(#w)R%u!n2t zB^ul+9LH=2PN5s)ZrpsFYcrc7c+o!&Y-(+Y#vxi4)nwPnWtJ|#m_k|UzVQc7)&!ld zYAVd9y%Ak`7x*T`1o=AXlc|5Xy_f;dB8ejbJ1}O!SCt2u9e}RnaN~RH#Fy%^NtkMa z(xd>gh)q(dqD%JIwk!QCri3meJiuDK&C8$|b?S8FxZzu&B;R+T-+hwYzD%{7*?$mi zopFk&)DNtK^LlDEk|Z`v8y%<-DBjB{f{_FBjr*0A?J2|uUc$I>Q=c_iy#u;{Oy~z( zb<^v_jlXxwDCGX<7@9%yR!M46Gnvh@oe#zsxZlu`Q5db;X!Y);Obiq8#ws%vLt+7E z6jrw=mYj8AQBvQAjJJ~ya~z>Z1kKTl|5gS0n))GBcUaRu1r2s(d2FU6KmI=cU@AQg ze4WsjP!bIC*a2>y4UdJEZ>-_&n?tVzioxk=*t)a6jW@x@_pLg^9UkThHA}9}YV>~q z!qv9o==HXo5!@c92BB=Kb{I6T`uJj_L#8j6Q-@<{-ev2_LS4p5ZQYv8Ea_PZIzX`qr4DmF*Spi-*(b8WwMji}v zYSln~dUpTy*1T=cOJ`vDXtI(A5HaYJ9uj&PD7xaogArpmE#~T0S+LB-gC64u44eP+ z?d^W*nCRo@nFL9j@oXjl8ONJ7rocq-1fR@TPj@okSA=R8go;ja|9P{debw9wpA$ma zM11c2BL{X+lYpjON%e$EKGppsd9VC>MlZDG^>RPZn}l$16@>IOL_ z?~Vn>4!m`-O>?fua!U|DbD#Q6%eOqzSDp={q3{+bVo5#Sf&0(5AIG$nEOAIB!`goi zhL=&BHj=Kj?k1SrlfUt^&ce?3zOg zNZN;Y)ERATTWxT42qciXnfF399dpROv^5Xo(?S~)3c4Z%$c~LH9+N+sFj03e@lqz$ z@jmMT_@W@(O;IBT=$>G&N65KHc}i&tshQYQ0=+yTY$M!y{XJa=kY|?oeET;^J;D^yRFl*1=F9m4+|HRv|I4Y_L)( z6{Sq8?J2S`gIOi6^a{Ms8@2d@m=6NQn3=f#%+8ke*z;w)vPYRds%eElvHEc`m4^_)S&qg-ppkjs6Q?%7=!?1{G_JB*a&GVb) zJ=ek5P->jc=;BC8Q#(T!pkUEu>Yyst`|C50P=B{{t^cGkK5dC;X-&xzx{kJu>E47B zft(UYKL>O^j@gjgwq-iAqD=^g2?JJ|`3}9mXJ3qahxo}4MjsyB@xAvd(#1FE>5dPL z2QYpfsPI-}vaj`AsNN~R>^uIsugp;4S(PidiQsC?{7fKdv>>|b9cJA}mfM2=KH(N{ zr!*xP>Q(YGjiw@PGD>kLyU6jjD*mZ>WJMd)4jB(76aFJ~J7fR7$HQY4qz~CpuO%TfPNKO~LH0A*pGG>`L&o%jzNPWm zYo0TTl_u2txH!7vTb^lii>aq4 zV(!Px!RiC=k_)(G@sE^!1BHy3N zoX`*(BE;!a%wEu4OB8>v7Y(tB`mny75gV@W$}_aj{vdEK2Mv!0} z9le%i?J}8L6JbuTbN3)nZVO)bTo~>9=hPin(vF6v7X$#pSTi=2y?wC9G1=>$Z%ET* z7LMopTVvcaJHs<>Xy)eeH8r@m?x=AZwR9m@*|$f&;F+ffnG!JWbGF=erVH@-O^Y&2 ziD_p27;Qb$=qE1GtYne-JnpG9qqx|L$e&AE%IF+oyw| zjb|A|z(_;p1+I9!@V-ZzPxI%O>dR?5&O6@`ERrI=`4S0AH28!YI%p9xQAfJAo5+8~ zn6zX-HcK^^q-=)hYD|F35C{bkTS`y%a#Q21Q?>>J;%}xl|6t^;II$r3ClZt$aVS5x zM$z!+>w7YBJ}gy^fjKHzrvlRR(LqDsZ!*_sh}Hhub6*GHruSCx8xbZAqW&77_`2Lz z{;sn{X@LceTCwQO`T+MQ%@lSF|M3;1Z~i5y64c8lJhe%)d6E**&1CXdH!6(n+UHS^ ztS+~#uOmY9_d#1NEG7BjX92(m6V)A5_a8tt^@2|YF1{}`OMYoO<1HRKg6G5&Zh@CF z(-AsW;<^O=IRJg0@TmJVORbLV6vub~Ko(}_D@uHB|JR!AqMQ_X7?aE13J(UCc200e zif&mTG)H+s@Ed%8DT{s<=Db(o*PoUQW8@l~0vqDdD?ogD?|1O;TW}o$Iug)FhT0^N6RCy&({rJIs;nRI=;`zzNo@E>VmNz~!k zBI+O;j11~}Cv%-sw3q&b%2EqQ_b`wh-1dt?1QW8s5c2c8 zYcbrf_ypU)f=+jj&KEXiWLVuz9wWa7EJ_9$ z;cfAY-MxxR0$iX%7pt!kuk>Bm+X7zc4zsxXz5oTkL{R4WC1x|X#oLiORdcj?k?#ID zdl3@<+(we&#zK1kEYMCBxf})04mWSV(!17>iOZjBAl3Hq<7%Iv9pEzK8W3erVX;9D z3o72u_x+0Od(eMq?E;a^ZPxfq11&BZ4^P+JIOI;HFIxzF>b|Fr3M?dNo%C3r(Z37i)>?L%^v2^2~E&LMqTc-~ADjZNgB(^Ea=w(_L`*bOCnpT)f{!UxjSe{t%0j`dfv2OPrpG;P8gW-` zuHFenD!1QjFf%g@)stoa_lSo*^i`uJOlLjD^WFtQes!8a&!lhi>rg0!sLK8%?t20B zFV(7LcX%%{^piTP4&@8Yf9_h+U zve-5Jz%>%CNb%kcEfW7vZNcqHdNs(mo9X4{NV1@xd9AyML6RIZL6Fk*jUV>ruOnFG z)j6XF(jYT=T_J5#;MXcAJ{3gNS5yIJWW}?A|L+Rk{%ZXeLvX9pFvSyn-eHWnLo%xc zajQg#(sBd(K8gwVd3JNmV@ONPO@r7U{!9%uy&gy&*QBvLZKE(DX-C;y?r^t>ERM`$ zR#|6Q$8+c~R|D&*QR}0)D+Hv}x!*(1t3yak`dU-l+O+Yt$#8j><;BKjhFaLDqqlT? z4ty*JKMB(buNV#i2deD7zv)H3t{G+k{L9YMAqa(^K1lt_C7yjaF?;?Px1c8p`4yaf z&WQ-xo!wbt7Dt;zlExJ#K;N2CACKqT*yH2mY7Kg$>_RH8gO&U^BAvJyYgsWHmV> zYq}3s2^%r59356{=KL=#uh=XTh5g|4YB=d5;PO!6Ah{lY6l{Jc9rHVfw+cydPB9(>)>{C02r|8PGH(7LrSF_2DctqLOmlEWR?fbS6C7GOv~TqutL|wC zPa4DzRL?Ot`vcJFrVX>-w6WobAvC*oYDxv4=r_fqxivEjhZ0zA2{{7{FS|fajf#)_ znwkP%J9OKvx+Fl?4I+tdwB&Ad#C3v(u(*dr?4l5Ar5rCg;}H-w*3hi3mgH+FHj26e z+siVB*pS?t&))G)uUeT;#M!yo?`Ul$m1y4RGH~LjbphFOql(diceE)zGfP1fJaD5n zZHxLZLsK#OW+R8T@F*XisAV*RRPik+$kE~m;2h|<;*@zXTiazPlk{Q}N{-Y^w=(DI>UlN~1G-pcFA*_Z_P{F>~T4M6;s71(5L@u!iLZxo;$VjXp z#o2CAme2(dF|1pqXx$%%`*b@hGzO2XE=ByN%U!o4mvA&WQqAApFWcwrdETQ7Qsw9e zj>Z^<_S7fQGhEc8+MJOi3cNO0Ryf@4q+0WMIh}>Kvxfg?Q4SK)>nKidtkAQ=S%8Pf z~)YTC{u`UVpUK!`|*S9u3 z!U#L5N6^wG;CYt=7l#>GMcyb~5>V!i<<~D+;uNg#DWA@McLuh`P|hSrA(eRnd2QB} zziK*DJnj?86SfoigVV7*2!M44FJu%~bu)S9w*6%2-n!wKV`W)m3)vpS8>L>4`!U8# zFE?|~TlL@kxz;V0c|-ca+41(=mqInS5=SVs)^8Wze3w3FyADQ@{#%wJG^6lVp!l>RQTaW)~ z`>s~Kd-`|&hCXnTsES19$YMve*8`vF#-r;^$VsoDzmU?rdgBx=$8POH!%yz#HR1@P z&p659OovO&4B&Z%;!wHcu?$UU!{b5xF|fHmEG=z%xS3U2?Se~~qrT*y)n6zGCfjY^V*wr6 zfk&r1gKP9||I{1qn_|Jk-_or4w*?%Q{;by(TqbuB{$dSTnBUMHAl)Cc-Vn}ctnlGmeNGKzkERrpg!x#DjMT zTnbCMy;tJPf9~_q1kOh-kD~WLSHJWie5BdEU14rIu?ezs5*t_3d|fre210xk#M(K412v@Ah z*|rOxcXQ)s{TMe;SeP)Y(zl{|3;G;1)a~xwSGtoF%&fW5QdqcZIV@=6Vb2#*>hMXD zo1t(Cnf~sSh<}-7P|4 z^OuSiZmQ%?>K`6oq@xRuUW#Cdj0hXTFXy}H!_K=xKWD0+TEu$WV0ZX)csLCyliz8? zo}454lXi%v9l2nY>F90AyibyNXk|mdp^YkbR7RHf1v+;Rt-?tU^6rW}Kkp)6+Yfq<||z0Mj4krR^-^Pe607EiyzYw{%Y}dk|g? z!?^Fele}~#iCx#L>4v^4+n1?W#<=$h4KZ-DQPX}+Sw?N(1Jn60WdV`EF&l9_$|twIuPD(9DyW|vLTr_Ud#KR72yYHy zD*>vrD7TH{@_t9-cQoOCHzkqK>39<}{W6gOACC7#AqI$roCM0D+3Y!t>s{!;vo@KJ zIR@h5+QP|!tkRRvq?0x-0yPR(E>h5EhA*DR_S-MMy&7w00?2p{kp=9KO?2;fOwjU4 zKrCsd)|=FUhIYiZIeTS>;gFfc^_?Vt^;WjV^ob>5+aBd5Rm3xp$MsF7j%DanQgAmj z1fwWt-_rcCq7vlN0upPD>`#y_Tmf?{@l=h$yX|z zCu%QQ73E$Qj^0i}5x8R>gp2c;u9QHH(~?J&;G|b{zfHtmR1LFpMf60Sp5t*wEB7L^ zZVJuh-HnHiux)fsZfnI<5+=NCvHt*WkAlYqc-H6R>#s$ssjDgrn(B1xh4Z%K?obqm z30E0Zy7-rvKNEeFal<8ly^7;GY7>ej;D`#?HRssEi(;Q_-}kyw8xH69YI+E5+=?bT!-}!oRRT;Xw zCpbELuccgmSh$W#{jT-`Cj}?PZ{XLev>+3|L=wm;nzFphn`I?e^9dp8 zycUK$XwyJc{)+2R5Q6V~Zj~RVS;VognMv6E+Rw{|^?MHTCn$&2Oh1%%+oPntrpBKd zb+?$>pLAbtrqwvUEEPaWe0_B#PS$$XsKF-1*AuGOuiiTqhC*f~`3~AeLdq=rot%o_ z_(RU*h%~V~qHdA^AM2!5CFO?1gMvWUUyqe!J~(5^L;fda>iK_J>9DK`*LO?;LoKsO z8@$u{nsD*KG4{qn{+8-#W!Q)M^nPV5@uIG}7ZcKp`S9(|_j>KS>Gg+K&Dxr)x|Cx+ z_Oz{4|BtP+e2cORyZ+E1-8J+mN=Qq04oHYn(hMOYHAr_#3_}UhAqdjlNHar72uR1k z&93c1xIs*b*s+{!WB_bRt(oU zn0`gJAfxNu+B>=H#q#w6M!)$ZhK%h00H2yV!3na;!4d;isaF1(*_(gHTgL@nuv^yk zIJrl&)J6scpRQj8&4h3{uTv|q@3S*0aAW?)Rwak_%l#$s1+oWs1?IgOZIrQ><+(5L zaAcDBh3(Fhzhm~@SYI~pj~r*@a7^EDHiQVcy%lSgvJn>Us%Mts!N(d%Y>8=@sZXq_3yRInvg1I`<*_*;e@yAAgvioMxC36b-z=HAV|hvJA`k?<(tG( z%@F15KQlmK8&H`affd5wV)>9xpU-hdn||OytxjX5H)6PAQ&c!O04W2hN#@o{(f8IA zYGzLQ2?{Kl8YXIRvC4i9Dg0F2Ee1~7K2+j*;q3o5h`zG!*DKmIUu;U~-8Mo$Z}WGpaIV zdp}^EpXVz3W!jt_S$BhCnFGauN5|4kLs;G^(Pr7vp4-X#paR`#TnwZ0bGxK|7K!_c z%!a{&C%Cs#hwLN^I>aw7K8$-3P72z8*obvQIT7);@_zGkI&zVS$=Tqy7BWtC zX4t2%QsyhNe~JSt4^1uxCU{VJ-O91d=9#y7d5e2lk|+J zkmiKHK)2V5o~lhDeU8gp&ScGSV_;1-QLH|=P`{(_#7`|s+ZV1HJ3F`f@Xe>)vo>Zm z$F3t!OQ5%sFE)|`Xj3NHCVCPsse<^+^K_3m8zXfdzsl6g!uhQA^LjZYOs2L+)jFrc zv9{zu>$j+W3NdAo0tiJ21z;h`Q9`Oos91?XK3E!V0LDxYm{hM z*6l(-z^hZ+;mj*gJzuD>$PDk+B=zW3w>0LfrHX5mNy-3IdRGGuXVBOLg}=gp^r3ao z^{2NlvI+7!b%F0%Fic*N&@b1knP>;YgH_!h&~UI_s!k8 zS<6nONv+`|#FvUf2>`^E`FLn0S#$T8VaEwRBI-)j; zx+PKD9O-cY&Jd=+0PVm3!8yuxVxHi?@Ver{Jo4k#fC~=lK7E%hS29Q&d46>8C`|I> zo^D7JIsLAF6Ak@KLA>Yvc25J`q?QJOw8#1%Ot$Cm=v?|kGcN6Ie!`Y8KcUtO^xuhhOQ=}r_&IF@%RLMH8=z|;VclQxe%qJ(8 zLUGNk?)CdENx^KnC+_uyhHsL|Om}bF_q6sG0P2ByIjBlfj)bhz-*KH!{damTuhOM67!ZvalZe*lg-wci@lGN zMC(hX1CE@jA8otJl%P1sS&DW!AFS*3-Mz-jP^n;tF8QeCKti#P(lz37Co+-okDp*3Yn}CE);JelveTQ?dC@^hM zFN0GrC@dfVKtdFMAA*6ovJ7O<@N34tN&~=l!}ND^FM$`Ux8H6>>q5gHh-`?-vcm!2 zRTMW}gAqg=Ng>TA*ySVrW@wZ7=W8*vBxzfPDbR-FCT`Iy63G_&=mD!gQT6k*wXi!u z;^%_eI-Io67vcaB`B}DSTfndt;FifoH|ZADBl>rf6WVRV z_S874TU)^MJu&^jDNRNa5%X5s$}ZE%-^zcs_gNSBQpjobC@*B z-g8DFlKw*dI1S?ceWACKuW{9j>9LQ9fJc{o+DIRAO%BI$kc0H@1xdoK%$k`Qga2bb zuII?~UVs<;?s8Y&rF^EF<{de1A#5old7S+ZzKikqP?A7h zvbJW1X|fm+-@6w($nhW&JK!MUQEzFRk-&42u}~KrhD1hk(03v4eQ?HXS!2T^aEyLA9 zEK@Hv4t}VUBmOpcl2=N)cgsG|cqC@g^~erElnKOtT%5!gnvmFa+-D1e1#|hfK5f~5 z@dg1}Yy zCA$u@mR`F03696NI>OVIo;6fw!~;bq zDe8{@>$SCJ#DH!+e3bYvQh=(zs$zs|5$z0O9+8sufy-ts)!&26XZ6U7b{L$1NWE}ov5B^d|!v)$u(<@(Q= zI6i?2N_*^ul1vJkdH-yD^ZT^9ljGoU>OP=?9$2RuZ*Eu|c|2aO=rsEhkkoizg9EH} z6HegQtLXFzKQF+3tgP;QH;!NGe}F6BYm*I~^>`WIxavFQ+Le8F_GWhR-vXP?1S>5K zAIQ$y&$7}j&1OY6;s6gqK}`2WAA3G|__da&4{S2*(ZJo|&D zC&uYbPyW`>*KuaEMYH(W-(P_CJ|_!X5Wzd1*f|BNgJ0I8gs{P(=L@cz))J8Aro6;d z4Phc)9%s}pJOtg#=;Kv-_yipD>aCWlG@u4Y&L##wWu^epc+$;grOp%8z&R{UIQz`T z+ynoDw^W&VSRqo}9)qZ*Rhu!luoV3Mj3jUMsHG~4m_CMhwex9L&_iisb(P!0{CC9# z?l5MnP`)+MdNnTF9^3C082T?MAH+L7$c4aKEpPl|yoI_3cEa zf)?beLb$qSgixkjK7Q3BsUXY7XQ)C>?49`791rLfe`!s0eXzOdl$Aa>)4li;_VXJR zRS9qxkj{*MiO0sjI)fOYNTevBA50x0P8aO^EVfanV5gX{!^<0aZSv*1(<(+%y@e2L zN6rK0PkQlD^?+n!noG5Mzjt`}hGK94pP~<#X~n z-jdPKyeYV0Rkm=Y)X+pA(sRUt0L$JvpNZeCev-kowELlEk};dEVn4(sP@j>s^q?8-Vhp)V}4(z((sUpPYO8uhvZr-jAwK_Q2g)_A+^S zmqQ`a_sNln|V|&UFUd_KIG1RraWcd9%3)l8U1?`xD#;^0hp5Dpp zC%Z?^r;5Fy^zQ!w-dQI+2z=SpDBcVdq6%V}>hj$ToTSRbeQJDi)F0e1MxLe(YK=3| zzu~^65m7R?*{fDWB>KmRK_2g|*vRY}m}E+&S(kNn^>>>CwLWGwgv z(ss9dOI}*ecod3~62BMS{5SNRZ0R#*<>r{^^FSalOxdm^G9B=jyQgL>5Y*P3=(cIz z3>Qy*@^1e95zs@JP(zwSay;T0Xh!^vevV$V%4rHmx?|BQ+~<2x(1OE$1Qf{&i$zU; z9CF}rYRpiN;_}<%8VL2VDnt=($0DYbd275Ua%?|{u>I(iX_Gqh)h?6nwb5tQVJDO% z+nvsxduw}z6Cwc22r22l+R62J1<@bbYdeQ}ZOP-(ei6ivz}yk_ zZG405Wf3b6>3@0}df;7PH<-7Oh+wuutC>9o4|Lswc7-OmO`)xJ5AQ1ERIls`H;G@J zf0;ut(mxgPv)!^6%>}k%jLg3J4}fcV(4hzux8yaRmtceH1Zu|We;2^Lb=yE}DOr9= z)gfPhnSC4Z?id801~umx#M>{+#h^fZZ9J6Bijp>>ICzSZ+IIk~iv7|9zX)BXykdKo zP0BAZ&kf$15@aFgJMa%ucW99|@sy3OOUC`9@$wU1{QcwW5p*pXcHZH2%82Y}M&x`5 z;@=?6QztC*$PR|3$(eJSJx)o-6+dEOfFQIc-`)}3hXs+APky`8I?W!{rCwW>fjNq^->9ePGu@&cxL?Vr>PNmbz^nuP*jMD(26!RP8O9Cd| z>vpNym{6BVxbima$417WNDD{by|br}Z>JW4iQLb#t&0k0&c~ zyK94+$m4PR7Nnk4^VDa;<>FNcx8HM}y;}Qu0brFU6Hr@Ws)S**lr>{NHylAYM#ZcfJM&_;mxwxE|3$p#TG7f?mG`;9wjhVOkV`9^1;W?rC z;r!Je%S1Y{PI~^T162jTN=fBin-T8}4|A`yn`d8bf#Um6Y75gl&?(jQ^Hm2K`$T55 zY{uApsA*bQVbYiUA4&8#;9HS{09d0l!}%HllSIp7&f0Q582WtIvIJw9#CCJ1c`O-e zpMUE13#ffS%{@X}NnVKEk*BnR*b6Vwgl@! zEe|wucDD$1xzoi*p5e=IYEBIm<@9Oy>Q?RCy^HNTOv+*Z58xFtsleOTn7`Oc3gICn zr)WX+QlGdEG^m&7U8Y(lFTQ75 zDt3R=`m!Jviuia_O$ce@JoZ`TbeIqo)?mbmLx}9TY~J27cK*(?i;!~5z{4G073%`l z?@2MsQD3eQcvv$(zoevi4F4vF+zN-!3b;jNB*t;5Nb%Mmu60rp1{uvF`;Xjut+fch zISGg)FZ+=22<(Zu1a*vaZP+$Rtpb55kWNTvCHYbdRvaq(s zo02+FM`MP&J&GPa^4Kh@Drg{TLPN1k>Tm5A1^K0ttBjv1{lx)W5j9>vSe=2%y|fY1 z7xLvj6yn!4O$lap3+0bTXrFyHXP-Qa3dE z@lX-|BcKQhsnPHQmy3D*mPEm$ZSeFGSSu`*n0UDzEvu3;qfktLn{X>qt{>h_V9b^D z}q*+K_s#lX3ngV?_6cjAKV$ltey!NF$89 zN(tGC!#Iw+K5jU`zkQ|`;+ZNo$vh&y*B_LVzoz`qz)k$TDE?@PMAie^#zy>Vp8E&K zhGX)-+QcS5TE|m`T`311UTO7_zR?H|e@@z?dx3`$c3}GIF*9{4Qvb}@aB$0>CJKno zS0z9aF%JbxRyglBAy2w?xwfb_l1X8g3&U}T{Cv%1`>v*6OL;d&Z# z_Y45jw$>v6pNvz=?EE+9jxN#roKcIXqsc$tno*9H*qkD!M4_I!b{(}c&RxUB)Nm!P z1U}@9&l~Dw%C^4AYS;a09@Ehw?a^|f)H?m`6SQnZpo>P#J{d-0kfBY)xIha|A#uiQ|%pNbQ4_Uz|4BTf1 zc@^!o(CAi~FD(xRR;qs+;%7^#N?ynKrjzn1YY@TrHZg<8#PtTqqUNEPKYLH`n}JYycismDSv$I2^VOx_dk69>#z zO(z52Da-(E`^Vj>Qa@)s0p&hME5XgO9r&ee8Iz`FOCEoG#qKnZ;PaJyS!HUs#G+ zifNY@fGcK6L8r+QBZd^vuEzn0rXLJ4jMf~71!O41)C_=TG99w#tQ$WqY;Uga6m8Kg zGTpZIM~J}-0`gcU8pR%WsQ&<39bXs& zHu4&J+g3EoiKGs*>z7?#B0yo{p1rtCTY}Gm`$ita32}Ns)cH|1v~&BylkRRbn=}YI zQNmP%(?%K(TvzujEx=KqJcW#jExWzx-Hd>!O03-Q+4s(HU@4)m?PvS{0Mxvt&eKCO z4O$?lH>#YbaXtjvM`QLV+%YV(-%EAyToaUxg~L%GTJ`g{#311*3w8ZTFSD~qkw8PTd9q789!p61f?hz%vZfHNp&od(aE+AUKm-Z9VE?|x~cI)h8 zqRE(PTgd|J43g|tRcZ+T>ihP`>SfXk9`zgZ$>3PUy7&L3C@x ziPQCKjJo7|Nna|n!+eEPfdujV*B>-95Q`cnoE%RraohQR3af|M`PC|4BX8C2968t( zK>Zlg#rGZuuHT<$XH&!l)Dyh8V);N30j4)AS%(f`^}rY(`Y0(fpQ8ZWIj5F_oqKik zk8dMAu$Y`gpbg?%IOkm(L1r%Hw_tUDha%@CpTd87arDRE3p$(OjxR<&ZYX(7e;9>D z;Jkw2%rh(KzDO)uc`qh7kwo7WmQ}+pIw6?An~6mTa;)bXQt4+P4xHYZZQ@Fx%Zlg5QQR{%XE4{=B<=i^RkKjtIuyGa1!bTyOWI zH1)RBz&DB9pC)MB#<($rbH@r6p5ep0^BcAFi_1v=ir}!X1HeB~>P?+tD|vkwCWLUc`^b^(GU%iB|J>H0%t*FL}Ja4LpN$sSAKlfphGMx%Rnm4O~>i|zuh`1NXq!fi~#%1 zg-`h!EzzrgUT!r#g6(M9TWo}UNTmaKjZ`q!{jBujPCwg$Rg&O%@lmk)Y>Kw^0fUer zo8O`2dk6d9=@U!SQGDShJ4&KTQqnwSL3sJ?6-(Bi+$KJi%Z(ZYR~I|@Wp*ip`E))q z_j0Hrt<1jny}$D49HpP5H=LIIvV*0c%bRmjWGbvCNjzRMUy>;|1HLrX6P^ywSdQ@D zLgfSYC*NMUe|kIA>0;$D1?Kjfhr+fGO_tfBNRsNbKlO*50qEvI5_?r8*~Nrn6_H!({^9t zS`ixw{+0B>rwF@xcsk2H<9!%7KDirQr)PRswB^7dhD;hxLo!KKk4qv0ikF7*mMkid z6AjhQVW3bdg8+LBhc7QD%;rqNd!qW|ya`cYAD5cQGI7|=7&oegk|))ih)Mo*I7qi4 zuz>7<+H%Zsy=@t%Ei23jTb8sj;M71dkSY^mc&B#ClrzxrJ29_o(0QK5xzdxguEje6 zT4(pk{intYbTS1aCwe&4j`ZF{`@ZCk-?^j{De%{0u|YgaDd(yY!c3mhcDogTz3AR{ zD5cx9W(2tz*=sRy$AVX3$zV>}S^FC7(iviJ?A5@P+Aa_~SY>lJxS^-`{6|OfBIj9D z0F{iTizY&8Y7)`(2^KK@6Vis%VPc&X>=d=OZQz=b`$lh=NFZ2y|+Wz2d%@p$NTJ&Uyg)vf& ze3QSDUzgJ0#ZMks4(sn-YFSu0fL_|F*F@PHB{lZQ@oHz%vRD{9)wd~ie7}Aa1AwlbYcHvXKn2ypPC|Sg8m$WCSQDv@y z0Y65m5A?|6poZ9ZTT5Ev=JeJjh^y&(9y5bjCqDLe$s=4JoWrOSmgwg_&+{Z0G%@~T zhtewAz%S<%Uc;Fn#!xPPLM68LbHsGBUwb-zT#CPb%j2w2D`y|vp_x*W3SkG}EOZ|I z!9{u3mU!QqyWCuCFYlBm4|wv_exU{DwZo`KmQ!-QYbTSI(Y-E21ErnQbJW4WeTlY( zUs*WvGB}8#Kf(b%$PK~7^(65;CHaOO!|J|TGI-~65lqL%orU*ksik8hgdbJ+8cO5h~B`T6E?TrwU!EV+y0OW{z+ z3qS3D$PN0k7`r()$0UOsBbUE+(fF$4OFv{>vHPnDzwr=wkl=mA9T&gG^r25Z!cm3( z6c1NxfI%KS#(q~ryoGo1(0QwMCp-J`_Qfab85Zyp%Rh|{R}qEX!kR=y)+aa?jByHr zeuQskw=I2!)?Dn>U;Fe3lZKJnKjVkNQ0KFb-O{J6@Vmzq*JT4OEggxKjh3(-b%Ren zW=Z3bxfEi#;eGqo9?mTEO*)Y8OGws)@0>oFS_%#~kr9PqqF(dAq2vLIv93)=jCzef zqE`)s{kysi_5Awl?PPZsAWynZOino#Q|Hv47^hq{$wv5lhLMo3GZEE7*6Ak?yTzM+ zOgpx&vN9wFHN2-qZ;V-$jC09=J4GIyuI4xG$vbk|Y^E7208ZbDU?SkwWlav+bu+ZT^OP>I74c87mmmy~#_Hj@ zg7qaVpo?nxueEwyuDuG|Z#5jIxy}-#gd8sYFZfUCtOtO$Se4#DvA_y zamOA%UAT#R>fie(ATax;-z8DvgcfR!{1|&0BYcMTVVz00>2k{VTINs)nQAo_+lM!r zBgI`=@wjcZ0foo>^W-pZG*9Gs5V{cCK@*c@>qfI=l1%2R*x8E!^UfFOt;FBRZmgVI z1gXqr;&Y+gMPK0a+bQXfr*_d!olap~4u6=@OoD$k#2OtH2UitHj|@E5=M2xaapDYw zARol`$6TEsk`r;4+$d_FbropfXWuklv{c+^lNu+hLF}Bm-w;Nj=Esr*-eMcqv zp!ewM>_>#(zICT!BWdv+DTWo9mq>p5T!Zp1+P!D;Qr=~4?`u3iBJ`b_nF8hYkXhCn zq`hek81UZM{$jWF{ezGqsy^TYjh~BJ2UX>0cD+a^Zi#Cj06u^hIh8g-M1ME8!awK$ z!(B5>9r~xxJ8KGievKY;LoaV63Nq3If4u%iPVgLt77f zn3fL@A0rXgPzUu`)wF)!Q$7Up*_1x^dcm+=(i&Z2Vu?h{W`Ij7^Pq|{{Z#-;# zW`Xzqi#aBWmptYcxy_%qfZ7E=K5x`~l=uFeN<~T5ZbQ9$zLal>e292{fNvAh z{sYkFs8*HCs2B?xg56wgQgEBpd3fKuN=d6*P)~TKO|My5E-!Km5U#$-u%Q=3%p~rH z;oO7~MR*kYj9X57v!)4lk+W!u^79F+@bGC!in%TS(juSP-t1uY%W~|=)-zQex_CP5GEzG%rCTQno&At-3>3Oyh{O6ao56jP$|9Z4b_+^zb_PpY** zrYWZZkkPXK3Gpyj_g{7!AlxIkqA7U{I1c3y;wSv9R^X6>A9MB@K(yK?hnMOPvR{ug zGB#2U7Zy-TFMR__C#ydiqmCXE3fZkTPG@&Ag4?OKX8yYQ3B{!j)86g&${$#&St=1# zgTPJu6g$rZ7k}~=0+PFq1$=Jn(UEV2#9NZbZLHof{*rH+_-ZiLMrE3;AzDSm9$D%U z4~TzHO#mrnawL?(6(r9r1*lpijUKi631u=4TyV>D?j z_w6h9=bPjegj0GeXStA~leHgTcQ-2sn!nAuGT8kRhid;CITLr1vXL!62!Q%cxG)TC z(sv%bEiL-4>9%C?WrTFJ=&Crg-RQ&diuM+4cZ+nk)5peR(9-1uKm9&>t=GcN1;z>pjWNyG#|& zQ|M2wYDa<_Q;8e9qr>?d5V` z_av@p@YPCkgUrn`s}Dv`Lz!8=Z_9W8m~lxXi9JqqMKAxoc|(64hoCtHiE9}kUxwnF z7E=MTOy=drt(Ap%Vw-8{NQJ7MG#AcxXdO zImnd)$Dvn%sa61hf61ma3A}g3)L`>NmNxt7SJ59FSsBMwP`e%qUD3n5L;!St*<~XN z8P%m2>{`}&Km}G@R7JXtbO$eAwM^^S0LD^r`tX4Bdm1Slq@;Nq!y>E;Y0#CXmRj;A zJ!&&E`wN6fYf|QUc)Yp1ss%WX2nj23S`;}zbCZ=L-*rb2dfmC-u>dr^X(uY=_r#V+YX1>mU z6aq}TV_Ar3R-L#b*Isf!Jn_`1m6A$CHQy04{-49SZZphU8Kmq^p{=34{XE;%5dAvO z&5b$VbyCCthaeU|S>eM|LrQ$e{C@z*I>ozeZ2p4mVCfC@0E_jIC#R!tYfAc;$J+PP z%tjueD7lXh*_(oN;BKQRH-f*?sY(+#wkvMK$gwaSHZg;V3WM<$N7!IF_kBsrUM5u+ zb=t_mq7=taE^&zglLEW6=j$^wb3(2tQDyOe>|184%YMXfu+Wh?#3iU` zhrNnBoC+EX^Yye2xYjXjX@&DJ%u;Opk|fjW@g<#*9?kccmXi0phzYOaR(JU@{g(gd z(bY#oQ54O9k1&{-39o21#d0U{>$n#>_|g5fJ!}NTc@v>x>d|`zBD)wyXWvs!#V?vE zjp3HR+Ia?R`IWl`zeeQ(f^TP+V)l+so)~G}H9OZ$Z1-;2(DpI&NFx=nu>$!Jv6s)A z@s)v|D@d`~Ug3axj= z2Sh>Kh+a>=f|tzqa*!T{aJMe(gyJJB%s*&#^+9&xUcY1F+=Ai-dVp)eb02RD1QErU zX82x9mrLn3RyPbDi zpq0HKqTvy{01S>>!1=#uv^?Pi`SasZXTj>^UJQQnm$<)N{Rk+NWEezuyAl|AbP_B+h<9Md;0=F2=d`=2VMel z(cNF-Lm{D5&c_Md!SyYela-Fk zUqt$VE^P*e@z9VuvBLQeK>P{Tq#H6S+rAA}SSn?vPdfH#*u@v&m9~ZFMm*YzzaPYy z#G311G9sNSWSJEkHZ(KdE%~ldd!D6g4NKjHKI%EOM*Pdde5~I14L?4ZqkOSOG;zl0 zf-@oPA@dPggYmGoAr4(Hs#tP`Fx_PWgU7!2qMHTdf+fk=K{sc-( znG!zSU+S?9;-%>$kC&pbgJrZsMR@G4Bi5}E8O;9py!LgV!j zRapku79n(5NLvjLDsf;O^H(KY4aCNce?KcN6xQ|zg@Uw}l@CGJscV*|Nx&&zMpv0z zXzZjZ{E{_??S!#bvd;7C9LwLO@CPTj>C!ZakMab6?g_gzV-jmPAd0^;OnB8_ ziU~=-g+=Rpvqe{HXepDhjHRb&qvE_GM8T{L0lQMjm-GA91EGXvLj=F7vi=6Aitwbr z>Uf;A`+>uv0xkm$=}GGrIaQ2Rc=|A#FV#KeO|IfjbghR4NRl~E1?LS_52gR;ZBa3@ zEdDu<>puV;LCdr9wB1&(33$&{=@m+iS(y-X3iAVs2L??TY+kFrX^DXA*c5z z_bDUpi|CCJ*P-so@5e%a;~o}fMP2s(VH4x0JxfFdQ3^t=={P!^W*q=;e&Im)dUPmO zD_~6YDb>FRiO1afAR1@CrVGO{on0+7#RbDQDw}%$e>(~1AUZh z*DpUlqO)n|tZZ;e-0%4=Yy}d6WA~y(hVXD^x;=^3 zZ0vh|Yy7%r{u^f{xQ<6r0LK>q&8SfTUdldF{p;HwZ4u(Huj*iyG>S6DTC;?Bxd7?a zWRfkLbE|~1FIjP^YqtUYxH4f${I0e=KGJwtw<*(A>0yVNjD4f7a~cILjaq{YhKWjS zeuwveyr$z`*;RtJs9?hl+r%kzS)~eJ`cWz!bmTm5GS)|LJw88F8_N>%<&@DX-X z>q+S?cV(0DuZ=vj1sa)J15IQ0((bGKqz93=7VloEdxioHvxryflg-^!BR z_+d2dhD=^aW)ynC_tY=lK8BipP;KN5VtD(+l2McuTDn2ceH}{`OjGNnu6%hmn zpH2e@=En3iC8A#HL*fEH+3q{M$YszkRkoih{JI)oKcy9Wb3XWGi` zIs?tGH>v%x%S zxNOH7Gw&)Wk*0Rkhr|+Jjotxz4=t9X4nwvxSMjgv9lp%+CF%-~`$?TVlo!{R#I#2; zf|pncyI|z(@=baUiq+wCq+u{D_;}18f%5?>s# zAFV*2nbusrD`|VT)*wtAina|ol)Bqk3S_nS1EM9as%cTi`&sF7`@mp2&z`R6fyjRN_up(1V!vk)+ zWg8ouoA_GkT}~RWzxA;B?ScfJe586;SJUU541tG_KSc|kqR7ZF#5bBu3JW)kuTBdR zYQE)@cuP2#$+d7<5V&vbMkasvM<1W=`Bw^2U1vS7{c8Ev_uLKqnZ^#bg_Dbdl<$@) zi7eMO%*$ETe=OeCW^LECXIyC&(~RmUT%E75 zm7FPl%14ng9Oei9Ae@|FXq~9nR&!?pbj7Sk-^38&c@X-)UZ+q0Zndfi`;Q2$}7H)Dy5biqi z(LF<+eA4qg?jbE{>!KNdq!SFp*<}x4a(FkjC5oye^JCQn)Obzs)%>W)lw;g1CtmHo zUe*9FOVkPg!}L)aVEMjD4q_K}p$y-5(`Gy(e6h)Hp9hr)wB+#mw(RjvEb8aI3CO;0 z)5r3&Mq-CkywYqQQ8piua%9VmzfUe++mr)EZU2%lx4uEJzW*Ic^Ki zl%O%HSIx)ue*i=Jw)6FYw)$h(=ku{3>r#Z!EnLP>EXoSb$-6DP%<97hcw>Bw6crQ+&(GySgQE`VZ zRcB~!i$8YPR+%#51`QzFkdr9BkJOr_Q3?7RZl%trUPa(FQYguaP_rfV7_C2bDemYk zNfpQJngw#2pgT>*0R`mRb-%ivM9aJMQ=;z0^k!m&>8{aMMj8OPyaFh4RMA%SF`#c zxNEPWwbg(z_e8ET^~3YF6Is}{onps{ml_%YZmPi2mBh#$Hj+O|2jnuWBY)mb+|d4+ zr!Ht23YPEC=1#Ya_3WaT;?u(S?38A8d2+Vtm@=5y;S5@rI~&{4GWQY@dNN&|de@?C z10|6&(&=~TzzAUH&cfGu8$+Hf3a6ZNuBN%JOn4qVa^CXi)?UB<5BU|EE;LXOrU06A zN6CCk+|C5y{|8VLW~PM^B4787NP#$hAY3lK^mE`hE0UQlubJzM|I`Ta)S=1nCT z3|&S(g$~17)vhHiW(sxuytguzNAoP0O`j%Wfxb2y4KkNI-TwiuLv1(4?MMTsuV8ht z*^3U=;+zv;(v--7AS@Kk)2bFysUc_S&%EpzdtMKUM$S(Nu3Hk*KUrBS$In8`ui_bvqtFO$foANFGM?TYZohr$fK zV7Puj2&UAJayW*&>R<{qan_*I#iLjg%Hn!ZgAf*2@V2V&hA-{u}qWd%6-wp9QI-jwx}46UwoNWr=uy zf^a6;g=Js^8Ci2|(~+Z5|GCK)BKPgw zP>bP1&71*{8X*ILJ=-7hQylmYKo}&2S&w_GOZ2k7p(jc4y^CK-jR5jzK`|LoK zCF(20EH5m5cw!wI#5-Nw(PD5_YNT%T*qnxDLl_F+;mpV3WlId?h`%FyQrFnRoltqP-y~l zCKQ=H&}QS4#Hmj!W_0-#qv%*!|KsScGFzH4b`;86uJ+VJYcJT-%su1KVEk|S&Yk<_G{G*+0OCmk^wrXnnU8<*V-B9CB{Z!{Isbsf7Cp6 z&BMe4$8WADq?)ZZ%YtSG8e?#ZKNNc4i$7jV*k@$?1F7>GQETUHHKAjNN>T1pM~_|& z3VGrQ&%S?lJqA@mLeF z&xTHRI+L)97MuVHAo-tq0FTb~7p;*pPH_)3*NzVp+si*2lw~z=RFU{Llq$qyp74OV zB!sJ5zYEE$w?e{CE~U>IY;YT?|6OkFGSyCyo15pkxdV}O6&3al5sTDjUiZHZr1{&D zWw!FclLOYxwS)4$%9xm9|E~jd9Tnzy&LojX&hMEDQJ+i^{g3Jx#}vBtts+KGXmMF>=7Hn-)8=}T!>{U(95mM%uA)Lmokn@zTAKzn zok5cS21LeuDx@5Tmt?32L)^X{MAH}Bf#M(l zl4OvRJAMWd00~nb2E@prFHIgu`o1n71Yj*reOkY@61G^O%NlRU3&T3WeQa@{lJ zRv+2>s!Xrhj&8()QvnyK`GuYaSO{^<6wgYPXOxPml>p7qGbe!; zjrQb)5FRXOTjC#8Yd#=a{O0TLQe}T%Ix2r?b6={lEWI^ly0Pq=P8+iOWB&_XQAKi# z6|5PTq|J4zZ`;JOGmpoziOqr$lA^*fg1IJxikOA{mQ}q7< zCqdZ0?@)41GmHU@k3tFD3kvf~w^X>DTYGtKBLw+kIZ64kxNr)BFseHo9zd&_J>H@7 zG;c7Gqb4cS0pc9yC)#=3RP-4DbsXcYw7+|4Lc8mzaWn8kkBX>}_QUN%}7~){j<)Q`!%6!qv!P#<041LH^#{e3X zyuNZ0^OG#CAV}eVvq2bQtViDJ22TWJo_IAhQh_e#ELmOF7jYs%Hb?HtlGwrLgTdN! zj)z9hMv%!Qiz+HE$9q;_7#7CPzjqnQ1D;1i&R(e`@(~L(jKJ(I4Z(~lW4j~)j0}t% zcK~`GCs-09?lHQmPN9nq2q3QqX~&0*ru2 zIc(q#K(A4X=NekiGsv^5gkVsW5u5{;BzG&o`t~Bc%UISTQ*xyo~aA@6ZkhTKS3(hS0RrGeJB+{K2GG4C5ek&=6N6Jkh26HnzRhFKwZo zR+=UV`{p~_9S1*6zPxdsm9eOJHcLpB7l!n>ZM&il%@)$U@^Rb%ImQM@0=TQs2rS{- z&ANr-d>EyPkRiyx!5j~+bGzT3FH`V@G0r1Xa^g6PlFEFr0}xJoXC3c{YQUJpThdx(XlT4~fY=u#^M<+doc^Irz z)91XnD6j@luFC8lC4NWD2sp4BayYfnVbuWbaAq$Hm_!c0IRIqD2~;3!dv2XK0^ zz`w0&*Pmf>!NjX0t1G6&CnI{O{u7adyBNv#HOfJ!G*?#UOv+Bj1TM+nVv-0rBWUNL z9=OH@eIxLzR613q{m+?qY3D_fyJdfOCxSPhc=`BvMWp{I`}Q zK(aESDnJ23WGNXV1EK4a#!YW%J{Hw=>*Hl@ZF25}yoDEW1GwvuflQ-Uj~+3hBl$=W-WS!G6W@LR>L;_Vq=({%`? zhW05XxLaZxEwUyUWC5I(`H60)fD{4!ar`^hH4Pu($AmPiyGyINtn}5>F6PTjVt+4m zZ6kt0vg|orgVWTC=roN==KI6CYpvAGEj4)wSfFH;*@*>rXKJ#BVS&r-7|9quMezqy zNc={!E5_1(qNWF@3I z$KK!^ao8M#UpDx4Dn5S@HI@cc*x-M4!vN zj%Y3J?VSRfrXFgc8xGvy4CH60wS4E|n+yK{6=+vYr@SqHqiU}6n}^)s7^MNQazF>2 zy?J4Pc(2+o*fZglgW;`j!J3%3yIp2&7TWTAcHY(#e8BxLMU&zL-@QeNmlcH-;$8qsfRPimGR{+m_Vev~| zw_DN(-6(<5j&1|qm0g+K67585l?PPg%Uz`ich<@k-Qcyq+kMfQ&o&#CLb z*b+fB*0bCFqBmK5nG67+b^x?;6$_RX^f!h-;H2tZ?+{+c<+N833DMN-BPe#9V1tp8 z4nQQITIy{j-7?7Oz8oMNUiy+uX>Io z*pj;{ZOLH7xGZ*@2PdvQPkwR5Mo*qXqXtLkX~+e6QOb}{AaZ}b?O7t)DQ;vjq(zi2 zO0kX3K*rO@Q?z#E_RUK)EFF=60E|x>$&fiEM_lv(@t)s~D?stxfT-#fiH=Vy;03JXM4+skZVFdz&Kxf#bCj^~El z+ZDH%hf}mt086qg0?fxH((Vvv#2dKt-=v!_=m!_de)9@ZtN|LTTF5Z0VOk#K`H?m z9f-#RkU6iA{Bipxd^7Q`wQCl&;5|0v7zmeFFvi6nb_^__0#($JxO}bC9Dzxw{>L5y z(0nJVX+9IsbZsK`=GB_QYn?VL^t6<&5VAG{07{al8TA>>MP>Uncp?n~3w=*T(gw36 zYq~XsEquv93g$fE_3R1bA6oDai9fT4iDJC9UkY47rP-uptak_}Nm-6TZNnoRV{hKc z8D58#)4yk%i~9w)@dj?SSlQltyL(}3mjTIO6-QJ9yBpTw83(zHE)$LV7#=$~fs4y9=~op(L= z1s)Uf6hH{>2`Df@APuh!_#*e>PMvM3Xd3Kxo+8kJ(e-~2MXpJ6sEf-Hb02=zA&3r)RS6|Ei^VaEe@4?DoFnTylDAl$&lm*!32UZE3EKs)R9BH z+dAA_p((w#1o`koGVn2-+yZcLdz07rf<12X($*lb31O9FNv^jTblTXw9DW_kQp4qh}n5s-!_))m9&j1#{&s=b8-9KYFH2dELX|rj1gJ4=m zACkaC>P|L}xxqa0ae<8Hzd@sd>O_*(>iq@8ajwZ0Ga9f3m5izh8NofdBRzPmJDW{n z+E_PV+uU6)E#i$~Z<$p$8-n@3&Oq8SalD)WH*#JnO?L8C{{Tym$VmA>;w9USxX(a( zo(@JkWLK2S9-QtVf)BYT+%^3&-c1VPIn&HOK#zHS z&RMx2k;?Qu^*JNl{#X9cT61ZKM7$R2(Lt^x$|O6WR}QRp5=jS!&O7??UtatHy_a9V zvNxKho2El^XBZJ&xpReFZb7u*f)4DEaCrCo`^5e^@PEVY0NmNy#ea1TrcKOY6`g{D zGax-VAa~Dh_3~D$`(N9>n+?NQ+AKE_%AQF1XHvd^kPZeqbpw&dJT9yIUi=~OR9YUT z;_W&OI`3M(7Ez>j;^JmNjOIhM22~|;OJ}JZ*XZxVAB_G5@xO;O%~M6Yvboc5EyU40 zb4I3Q+zHMUWR1NJG40m8-}bHW?t^jQ%a0Ukc9zj=Xwapc?+N=&!Bz)jHbEHepHcH1 zeV+1**`QoAb{K>4Hc`GrB`oDA|< z00{Nsxj5}%YukAUhUw*jWL7D;qgLc8>A~%e-MP(0e71J5%RFkZytf3$4qIt;+#6{< z0R(*9j=l10>d$~0tOyn)hA}Eg%JHe%#10jlkO2d5$lzoHUtMYXv;P2U+s19?wJp`X-@-2%TU)Y9@1ac$aW>e;)q4+=c zI=a?$--Lb|u!!7SLkvPmt^DRvpt~_Efs@EQ4B#G}kJVbvm3yvP&a%UH1=F3(VR5|% zGGikHJY#6%lga5=UIzV`^&Mtgxh7O=KP{!U^TsEQPUE&jIBaBoSnFRNe$;=k?}@Lh zFRyf4sPBcUG_hHj9wtI?aFQq_=V&K6=bub`1>l_z!T$gN?YvE@d{FRAx{OJt%X_m_ zKVyOj;f>{XhH|?P`n6C2-gC|Y+#RVzCHN);@ewK23mNp$4}rN4&TjTCXOVVP4Fj&TITWJF~bzwF5Qu$mE?8vgS?U8 zphs`l{{Z+T@5iqld^`BTp!_-2warUb@HdGklT1OVUZn78QnXC=^G2&IsT#A!(8#Fl zGRVY+Q;+Ct#*;yL?H0EN2gS$NS>5TKn4}5j5Q&-b%C)VIC8nh6|q2(ZX zqa^Ujo>wCSIXrd9uh@s0lg1(COryceRhhCm?IR%G7fnE`MCI2h`CCoWtXjsaO zNbFq3NMrI7!m%Kel-#5dgMw6T9dY{?{{RHaw^<(U6t-=~bSCWEhv-xlQWvRQE;;~5 z7y}>E?}O}Mhe)uB);VQlQ6iG1RAobqXM#t}Hjcb<4l~xxwM#=BD6G%4xISZ{#zTC= zc+bs}c>s6EILl{p@;f{#ZOdUDWZnYgC{|#2CvO-y$jZS3 zt|JM-btGe<0qc*Hek}Y^@O8I^{9EDK^=n&QLI~uth+Qqgj_P+sQ5-A~iKM|l zBxQ&S{D7^Ge=P6yKoLk&M@6t{6qMxB05@ln_Rh);!urlF64hS4=e@Q zfS|7p_lFyf3uM=4qI_)l{i8({y|0TrN9GvXRFdmbmhNa&91*>N;2rqSAPf_cUfbZ0 z+MD){w!E@f^{dThaS%p^@6I!~-73m5o3XWsz$$sjB;vn&zu=mG9{xA{VY%@nUlDve zd8KH&JP5XWh1@M|XLBmH(ul+Y{2Y>;U;@WD75cB@y;$kG4ei;EK_#8Dv4S#Hr*Nb( z8GNZzgN`$dV+3ygdj24P!A`y-cxU2QhTam{vC{{Zk-z{Vo}57x()m<=S}WRi3%k$^{Wk-*$e)*}_{zYM?N zs5(!JHJv+2pTU~MQeWLgY$i~$?+(fVXz`3?xW?W(_OIAID^og_nWgFzz~5)Qwn^fS zM)M>az{tQV82#a%fD8`x@=xt=`%Tz>&7K#J#1|R`?y|SH3v4ZI3}GOU79cZ$xGvMc zJGy6+n*6=9{{Vu(t=6G4x5K?u31urBkz9FZC0(Qw!5grkXBh)MFe|K|{tC8^kfpD~ z-w;V4Lm!yTLm}K5fKYIHjCJ8pasklOzu>64&FcXd!!32#3@4P%9eE{q!6a_y861J_ zjDHdT0KriHAlgjBO88-ODwg?&+U61_?sov7_B?UGLNGlRjYbl(ic1GdCyVgCSG7%XFSQ;o6=;{fHl za&kH1w0vE9nih!`Z*1%`S{Nj{oh^>>g(NvV76jw(V;xE4{A=S4b6=8qWwmFX%H>sG0BemEZz30x#g{V1vq3vnS< z-V|+Y9!WXqc;}o7^KTG*HuCRoMDa!~Vo|;pxKy~6N|34-f=_-y#^0Mc&3HG9yc#Ul zav*})QrzH3KYlR4f*SGPJ;fD_oH`y8OU1p3b$GNtV^C<+5IKd!{4EODxIxh=qvqyD%3^z8HP~BL0 zjRY{xlGznbrOJc_cJfuSP6#9dN1hutz3|V9Bi>$rv^#9L%c|{c_9Fyj9G-q(eAhAI z&xUc`=;Ktmw|%TP%;AEdZU}HQ^KQ-kd1Q59Jcf;=k>YgZA-(W5*ZD*V*VVtYFB4lzi*SP#f{fjOB zGk(&av-Y9!3&)Fl;v3xy;ts9h_&iA+n%l`dD`91KGB=kHh_n-2NfO`&RZs~#K|I%n zY;U|H@gK)JKD8d9HH=nIJeIIrn|6$EafECW&Ie2!w_H5EjJP)T>5jDN9#IFrpwx{PrC7xle zS^n)K##u<+x$p-A1o2;>^if`O@oOLOue?E!NdEvt$OmqJ)2+ML!aAj}Hj>VfN4Z!? zjP5|)lag`C#^8S(eSZS~0N|KE0{$r3d}IBq{9p0M!q>WHtKu(;*X?53y_-dCeFxjG zZp_wf#P5O4+1l!GR2(tEHL3pq1$wmbKf=;?*y7ojGnNw3JV# zOjwWN+Y}cJ6dlK505QU!*YAYhDbRdx@aMtaFYu-M>fRgi7l*Ai%^Laq`*yv8>J^$9 z6&)5u+^mOdg>lf2yF zZak+)krdCohIdsje=(MCa(F>Tx25aHJ&86a|a2R`TNRiwC(?~NHl z7YsLy%2ecq03L*s#yzkrem9WtSZ^pIm6y%7GDsQn0g;=P z01^WC>`BKxaq42coX41*_eRHikm{r!**N0_FCN{CRr7vgn?OL)DU5T2lY{IE>H`$V5K%*`YGbtQP`IPG0LR@X7x?3P!NvsL*V`dH*gXSRzoa1)`Jbb|a04k?r;r{^a_%6J(fI}qhE2^Ernm|tTk&~Pp zpQi&g@L$E7^tJKso2E~DYo)c#_;~G$`75Y62N*zkCkNk-!>84M540;wEiX1u!D}tp z^X8fb+V0!3z>qV$=I5N8dh&jZ(P4OW<&6>AGah{68H~LY@Odgj5=!>>0N2W&6f_%s zM(W~LSt7f3Dok=aGZj05EzduPIUQ@xJQHTtas86?#?Z$xXgu~V$k{Fq;eb~?x$1L{ zwbSalnG;7zYf5^k7H;aly}1k@#o-00l_a;Fn$SuAGdLNUYO389#WZ z7|R|<@gBdPF`qg8mj3{0_4s{jWu#tOq>x+47E-+=W$FkAoB}XG8B^EO^e<2Sw>%*w z^2>DMETWf^LS>2!Ha=C(?wK5n93JMoct30(hj-U@v#tDS(v9;wIB5_NesVbLk4{Jx ztlzXp!r5+&^6P-_07^`oLzWA;<2;b-Q^dNtKZ#l(Ldo z@HcVCvE$#G`jcJOifDR@Tii(ucZ#O=+7@vg>L~>boczH~F`k7%#(A&B&)Y}Fw;Fbz zVHJeiPxh$frsjx)kWVD_a@ho)IL}js@OR^V^WJIDS~QR%TE@2V-dzdql~k?+%CSed zsmCgc4n`DL+TJhtkn(&yy}Q4-Y0Q@7#suu<++bxx5(WS#11G-+zsmZ*i1eBK7Bx45 zHl8gxip(1iou_VC=Wzt&<0Sg=Uz)!V{8auRzlE+f2_;A-Z?lKw78`b{`GG}YoU-Kb zK2efK?mz4u;w@5Ng?cP2Z)+N&18Z?`S(-dQMpMf2I3SKsBZ4dLkBA;3yVW!|gI2t0 zAdN|7B)VsnVn=hF5re@!`+V(hr&?NBCFO>oZAz=eE;c3PXtJR~iyVr}hDUJ0l#Dmh zxsMTP7HQ$xe4Du1OPIuPF=mW9j0}uml1V*4A2&|*^Nq!w(9KcUY!KSh4dUj;PnFT+|)4-{&aw(D;ac^gE9 zK+f&~D)~}=yb)h&TKFeMSy2syYGDAY3>1U?oQ1~(4!Au>y=X3#VQTV49iWPGjI!q& zq{i-mf3&>^Jo|Cwemd|xTK1QzTdolr0}~W)F9ExjInDv>I+4JykUlwn#NHYBzwjSl z@JyBo{kN(3b*${}E|^?N6~kmM`F3X{sRe*J-JBZ!e!pms*k0rIO87V6Q+>DlTH{~1 z8mm~`G>VNg?o=}DMqn`*$=V4#a7BCf{1b=Az90KPX+4Qfxgpjt+f}oh=VAR5_q

    UVZb9FE_3K|4@_6;Y?_Cd zw$e-#$Yb3jM&>a14bX$T<}IK23H3Gm3Ht>y9|`!iVk}}orL1A3GUMgH&&)~h`eVI) z^+gm>UOVyo{z)f`zW)FTWKWjcT#xN5JoEhhvtP%@{1ziXx}V{NrlW4Vp4(Je=aw}r zh#36D`X0dWeq;2n<>|{Z$&x`5Zo7<1-fW;aRWclGW(1MAXC?ASQ&qN?;Xwox&eOF= z&VZI;Z~@6DJadjS!2`&W92pT^N(V_ryQwa5h9G00`@xis`5TYx_xuwxT3cJYyLN@# z{i-Dl7b%V53lMM#ECxmh;eZ4TpXwXJ+KtYirnB8m1D(IQD8fC+6yQ8#jNqKMc{m>R z(M7G=edU%Z499e+82r2fxdf7W9QDU=dCt|H#7zTBjw|ks?9hf5u0-?jq`<*bYzAHa9|J26z76K$Q8kO zsn;oSa#dwX1a7{3f++CBE0D(r=Gp^tK^Xe{QTtA7dN+gq8F-RQt8FIMPq9l1NgC#8 z_bU=ZJ_>?eixJl+1m|^sCB8WE18Y7g)^8=6DTLS0E_{@US~1X&H~;_vVmhx7@?ZiPm$79jwhBBFB1%?AmB2bmjv=~fE=3p*WmYrybgbK zqLA{3+*o5IvmS7B!94)4qwYt+j|{}=4~D!o9m8*uZ}fPcSkB^wgM}q`5P*dM@=i`p zcuf=HAH%2dWKdga8e*f!V-X}##*$&M2N=f(zas$Tb6>N6vp-`2*mS9gPiQ!#sFpo`h|1GFf^@yWd8t!;wVu(J*M16016CC z5%V1LgB~~ppisbL1bf#{2kf8lomvSc@Ya_!r3acm$bt~Tn>)sH@`IMa#&e8vD{2qf z3*h5jMn{G%XDH=h#ge-fa2q`f0;HVp=V%#TF zT0|s;!s0!kf^(eo`G_R&P6yf1i&!lY;`=<2MF4}yEF?xjw-^I}Nj(X{9dpvWbK<|l zzYTm!(B{&7NvFrDT7q*N(E%h*`%13zI4iV)>_ zqXx+gNF6~WcQx-G4ESr|PX;L){x8{lJkUR9zZb)ycv^Yy2gHke zUlhyWYuniy$u=@edaBY(Zi<&GZPWlvs>NGk*XA$A{{Vx(v|sF7;m-tk!^9ptv5Uoi zA^3r5ZKGUxcg45fA=K6EqHDR$!I~J*rpWd-3oCh`W2rx_80mFrD=0Fc3OFW4cymwk`=%Q%lc1ZSq^-nom0&CQMD0rG59sCvW7sRXW zKHE?K0ED-}cAg@-(uUG&1jv zfehJfWrBqmAhFxmfnPHC)5N;8wiv01}| zgPr4@+4S`THI-$rTxuzI4q6ttjf_$m9e!q3+T5NncAu1-o`CcoOX5V;?d&FwS*KBN zH}0k1<+Oi41P-H)dh`R-qOxSLD8o+Nhi z#haiv+lbjXD7_YCaJWs4W)M;ll&L)^#Y;dHY z10*mU4us%xeTW48b?~=Q)o&rRxSCll;(0=pLFDaaVB1IxNc*gDoPm*oIbYH(7f!U+ zyfYNm^00Fn$AX3srAoOdSYZJw*c|cHcCVKHEPM~qzBha;_>J(FTfdsePWXYM-gr+? zztEq{)GQ*rQj*IXFh4NglfRFf7#xxLe!uWQPlnbOkTZVLo+^w*Z@Hqm@K&35=d^o{ z8_SUhA1L5uhIrs+zEQdToa{ade%-$Szh*CmzYwJHX0vO5qXrZx~FP4{{X={{wV2_U)x(RjC@pG( z7s$l7K4efdU=O@z91f%NTlOmd0D_@>8U2@kW{-#83cNeuPa1gY<4(EM_1}oM0xJ&= z*gmhS-cNlpM)w9uoJNyF8pvXgA^@O}D=)%-wD-fW+E?SRj(l<8j}Bb;PSXDXM*hv8 zLDzhVO|0YRW{AawbdVGC1x`z4dS~rF*&k1u*Y=U{ME31%6{|`e;B;nG!P_RtmnQ%a z0na1@gVMjJb(&R3mNgz=+OvgUINNU87YDC#fOj8Wn5jdocIGG@g2HgyqX9!PVB3y2 zAkG}_QIf+x^Z^Dp60)OjSb-{6%OQaPZ5RWG0G_x#y5V@5+FeS-TCAI6y((ylb05O@{gjl$i0P4L8WTRg8Yw^6QId6_3Xf-*NAFmr=n zr1Vi^3gf339scjW2VC=1?ewcV zHlA2*qK;_~m|8g3dmQ8p_UXq?y=%{YEBqMvb@8vmPvIYlo)FM{XW{uSBfB~;h;-Y1 zPQ|VxZSl%tnM#L4xT|A1BLrugIv<5}Uj=A(ng)ey4xgs!P%V{>lt`i*NaGt-5Do|m z0KnBt!4J-ho;q-ggNv#G`;L&iZ?&T>vO)9_F@>LySW zGKNtiXEH2d05}JdK?A2JwnrT)rFN)GaK~^CQAWo`Ab>&7L$q*t$@&AHbp6sWWnAtI zBv@5P8THOjAaU=Wyl3hW$SsLc$hbRODytH3LF?!V&VNjS$c;)Qm+ax6c`D4CL0KC( zIqrBpIOu&rI+5yEE*O}U#9X%#DzabzF@eZ9=XXQJWervfi>YCTbaz>HOSWG=;uC;y z*y)S{Gmf7^d)+o=kxqQvFx$FE+OZLw1s!wGP&3KqopfE~Qt~uJC}@nC34zHt=ab0B zeK{3@tIFvn7`$>iobJKiGC?ou00aPdz~tvR=A^k<=1(b;dP}n|3nZmM9RcTnP6-DC zf;)7Ump3xmsJV;@T|kv!f0`me&fi1x1AaZwFgD%vGJi@KFd>A2^kbZ7}w{gHc*KaKAePolxB2DMUmrzKHy{1eq z3Y?Nvvbe|hxZ@QAJFH)1lzDKAVdYNvY_W5=9F9I*_wS5xn)BUrR9jU0BTFLeV$tLs zIjd7Ia8azN#V3k=|N!2D|p<5m;Q@ib08ZO z6O69Va6svR2Lm{&NG>m;Hqw6Q%mz*|5iOtMUgIDfbJM8p=^7r9G}aMYOa$AaBXN&u zW0nlVamg*$oOZy)e9`0I*~i2FDDlRb;tfwvSuS)-p?6^^eXSGZjnST=hDiDo*NXRD zGs2ddMU+<`Su^#_r_IlwvT&qF4)rCY>oW4a4?v4b)*sKL)tnaIyY zZpW{!d~@*%{z$3o42fIbu4R{X_V9 z@Mq!o#eG&i15J`RFGY&aw6Ir~ErfA`Jqq;CAa$$WEd7tK{41^5*uxd%>2R2h;CXg7 z)6uXGTmnHOr@l{`_{ZQLr{SAJVI637`|O|C=bNF-;Biu1pOJ~Oki)GXn;5yJ0?L;1TD zW93HZNIc^p^*xEe`+vp15o{ab?ZvUXiDEEq8|2>m`!E~0APu=5y-zsty=TR?ukhT$ zlg1fr+ss0Lc@YVQUB@`bAeJDGI#>)Or7s34PM%?ku~$oX^706$!g4+MRS;oFqIwO6}n z;F;qRKIw^5B8(^nMpOttxEO_d6gU29##OdGgQXdg$o)B1UZS8dpUJX2Xw=>L2ESU%yhJIoR zCxSW-c*ywg<45gFTImm1tFgednppRPqj$rU*?e(6YCVafWpd_bhV!tUw9RUEZUbsB; z&+FIh8>QUoJ{j?yz0{8*hSJb)7-a!3&N15?v5wgMPv10AMHS?K9fKc*UMdNVK0kJ8+G@B6-6F8Neq8Dsl-PyH8QUU=DIZzT%~du>v#! zl|dwK!TFb`1m}QFew+UQ!8>m!Zx<^hmgyP3M3UY{a|?jVp%*7P8+(olo^lAU>KDSX z_=s6*m%5em-$5i%jW)?(^4`e=VK(Q0#hG_!89z2a#zC&2d~NXs z*V+xm&DF}VWcg*;nHVw1B%G+o$l#sB41Q|oBKVQ5+iEYU>Gu+((Pc{;qKd?Ukjai% z7F_Ko?w;Al>yPX!`(86`@Sc;ZT`Zc65y-N6FFIYuzFTK# zRvV8w5);k=BOL}kUqJo1ye%u+hSy>+A}c&*?Igo|!I8=Na86D@IV5-Hy&@0WC&8;X zm^Fx_idJChCCWnCCjb+Ic>n{SmpJ3@=ct4B!0pX70aLlGTm4CcY z5rQ`M`@m!7$3AJ|&)Uw#pm^GP76ajT#LtOe7Jp)|4R}{i)$e>eaq%KceOltec`km*b$5TFh}u;r z=2-0^y=)Ae9tK8h_j6N<8w();V;pftB5X(`hS-KG6|sN-3Oxt}an1+h=lm4w;TP>g z@tauvnYL*u>B1cw!af>ui(8JNt)Js z_#uikFf>AGX30CEL>Xdu&KC#f0~~`~9*6r_cw@s}AiuY}hWf&2Wj1#~!dOX1 z5=L-Umn^KU$ZY2r#dNwy?Q`H$;|*I>mS(qyQH}#63DhKpHY0NJ@(?$FdpIW}w`H&X z)!z)Jz=v0fZOm*Xf)lwrMVP6qqqPKJpqSl!1Ii8DsBM~K55oR$OB?l=RX9feuYJZk#hpRCN6CF3^F z8I@%NcTi3-hEvypj42rzuSfWItF)dP8$M$pA?EX6%ZQ_Z0`w!X&OZ}bUOU#Uu9n@S zFvQ!wc_VVNF93&g({pDTJ+af8@;xubcGgo)(lP{=L&%sgJd=a+j)Sgpc^xtIj$&bc2@Hwj8%ad5)YLhCuqxb#z6-@o|U!X%ZT;6 z?M_CK+*__zAfIKKNx|$$TsC?hgkuEOzlSurg|@dT#JlA4{MdZQ3>X%0PSMCXRs#p- z0Ayv)vv>k4S^P6^1`)(@v@zk@MgyznOz^)m0gQFdJw2ns*D0er8yI3nBnYGmtQbj* z=0U~)5BIs2zb3y#ul-CnIRKegqJJlr^@?=8IA{1cG>j}6)R!dT*oT2+ysF-^39yN5=}AYpQTZ(vUMgyW9p`s&U(V%l8G zFox5;QbqRY?^j8eNru`u7>PG#UEqYZD)H~Yj}qTrX*v&#?V{8z?jS21z8=(UzCckC>0A#NQ>N`$k%v(+``Jtx!hCcz{_L591oOs zSGHKonN}#w&Y$Xbl>`=0#ZE~)@&`Ew83YQ>c;C)OhFNXo0ikG;LeaW_&4d7e2Md5O zGT5t8M;xdnb!9$pmlv2_GRuLE0X+yHjPO49u0FRFj9R~e%(BGoHk|etIaMET(M5Uh#ZkM!TJYS;f6;c8ZLAO5ZSl`;am{>RCSm09-@S|DT*w95-dZtm4N|48S>q;CIG{7a@}_fA5NJyD!5sj z`Tq=YlcJ3Mlz-JQ#xR~$E?$9m_rso{z_6)s4d zcw$+$DaKDE91eEp10DKTkxQto^7&{zVR*1}2 zOtC~#tI1M6?f}kkG3)5~Ah(iWV^~8>Q_OUebdzARf=IzUbBuO9GtZ>y$s1e1@w&6D zLF0ZGZr-bccn29HjAN&If=@kf(PRvKz#@^1n*#BX$>TXEocG5y%y^|>u8ydN0e4s zRoi0cgV5(3@&^E9{V;q@1-+biHzwe4xnu+wX(lLjV{i=4AcdxMY;NE`ci zlIBn}wz!>(GoUIal&sOV4hbW!I_IxB#~81ad~M=+;PFkamcnUdx<6=*OOW^@oDs># z86*0fbarVp@OjEYX>P&YE$nvTjw1>?c=jGkN{sWwh067Dfw%3tHUWYC6`l4UE#IzuKX-w+uY#BwVQj3%4Yk76%6v=o%%o>0ubuW|A9$Y#uVa zZX;@y88``8L#E<;%2EPv*X_t zU%aU(lTnZ)h4ADDJBB@TlY&V*k9=1NXL&ZCe-+T&Q7#o^D#fByQly=`M+^xpNx<2R zk^x0~Lk_CNLr2hcHOZ5xC5!y+w z==PH7up+j0v&;*B4hY-y%k}88B3_A?qpMEjw zGhdxLSH*2Y*Tr_a;atNV`p$oaAyF#s+}#G>yU7{n(AVg%$A6E_FTnjdY%X(msKXR+ zTr+NOp9Qx7N&YRo@-fe9{G-=(>)#OGCEetvLlP~xW4+|cl?6vV099T%7$ATYgOP8l zUg`I?mpg{#e6sn3#>%X$#2vea7ila?6m0#F0injJW*NgM z>cNX}!-0Z9u4Z2wYSQRUrwL{9?i`{kHe{KIP{1e{WzG*HlDIX>LvwIsk)74yjlX#) zLo8?KQ0y3U(6jd#=(xZitv|4r#--6TdHgSPGm~#I`!?6w95BvC2HXHwla9RSgI{O- zZ}^Q4kKl`)ThHfDesxC|PFfzDY9FFG%aK4zYj&J;1WIRTW%>-q#t{y}u z<>W6y4g!pY<0l#KT&IjYUvA5LwsNg25~zoCZgN85hfa3jlfYrr5niMFD0s>z@%Ec+ z?75oYd2PEUQp^l$aJf5x9-!mX82$5U#jS;m?U-YD)xcm@D}?|Kicao?Y-54J&sy^j z9bCtIqTbxJ#wew+X7V9Xxtov}WMhy(4bI$-E6e^K{BWDYP*}lrdo*%efFhb!Di>~5 zenNT4#{)eEIRGE9{2}{crk^Bm>a#&TtN!qWVA3%JXXYayk~z;#+*jIv4?Z{eQ^)rC z(XZl`>_3$>GfE7w58y3@>OgD~dB>pR+gnnxnNnXh)X0K3<_);N-35r}oRu8%F_V&U zTrY`yN2cj^(zV6mfE04u=LKDm4dWTdVt5<4&j*A2sQ&=LRlYUH<4=gXXM{AZYH96s zMQQa5OM9?jcit5MBOs8ioRN@5dspS3hT}3#Z5zr~H-0w7f`iN;jol9*oDN2Nj0*2{ zWwz6-ZlQ(zl5O%v;G=T@TLV9L1DyW=bmUfEm#zssGckk zM=Ck!GxW#m*ZdQIN{3(Z4xKDCR9BiViPwLXbM2;H$tQ8=% zzPdhR`D8Vc%v^*7Ga0mlzUlW)x^rH@r0^~nGX;0`$LnSm8l2hHsb7-gXsJ zvkJ#D9J^qEdC3aS`#k%gnDCxSc#E)=k(iVsMGRR>Y;qBsb^tvH%(0LTWKhWE%BX)P zWy20amB{J|W(OtP9f+`FUnodPU)|+YznIKJg=WA|6?q^6bCJ~7S>Vf^X2)OCrSSZh z7W%V9@Tx~Al{3Cn5V+cK8IBo_PQnNnue5$8d}jEI;m?HL8SpLMsdHk%8P^3ys@ zU{Hq)`$HYYljb=9cF$jjq`AJkCFRs-^D=iQo8-J@pE0OAL$2UhWQ>x-0fz=l9b;65 zl_AwHWQ;CEt8gO{Fe|tBd~LuEar{6r0Du71i^V$Zb2Hp)+PpSV2NO+eDW2o+5~&z% ziVKsmh-TV1XPoYlJa6Llg-P)SrM5`WlN8R;#7RI9#h$pAAc6@W!^b^mguXHSNAQ-b zWvl4kC)A?5u$g6eX1XFaEAtGdH*Isf?-e-b9V_}H_*wgC>wY%)3*o;JTElm9t;2H_ zzO4@FH$qe8kcM2b{{WVR3=jd%4_f@{{jNW5j}-X7UbyhDgRZ24%EX9u8|RtJ2LK09 z2_Ox%zL+nQ_AijF#vp|ah`B`=LQ>}k3SPFRJU{wetO^vcutj{7cvKG}9>3<=}DNhjBnSaW#4#FBy^ zTfT4J?ko0(DByB2lhdzUa6t91MEGCv)5pIIyi=xY`c|`hAhx+lCW2XuETe$j4mla^ z#~9~1{fJ3fHz{%qykJ5jKF=}7% zjA=jGOk~t0v{7*kR|&b9A^?%eCpkGMuHZN|(@hLhTtL?r@Z1QUJd2x{)nti=Il;<< z@^IrA&s=d_r-)_0n&e3vN)hc?+_TC1lEz$Nm|%cLSe`)i2PAL}HOlXOk{J^% zmrw{Kk^-C`!1d{0GJJiovy;R6l1@|2O*PBJNO+?T!vOvzdGyaCkza@(61+7&qo8V* zFk9Q%%M(fDNQ#q4pzdZK%6}Y%1aXS|hVd7Id`}*^bp-7jnXVn4=0q!3qXcBE$iJgF83YRUBpP2Fi-I8{WX(PVWV_)7&G=WPQ5*Ysg zc**jx8;RSHNE~m;1E~bma!+?SCTUD10p8>X0dTB9B;$bYrLaNTdUUT$_+5A{{6-<0 z=eL&J9f;~oVbm}Ot{eN&unYnDlboNZd%1kvx+t$@3uzAt+amn30tnm0lOA`n%yR>fGvDyR?YWE#CPa zK(X4arOw19gJh5~^AU`W=Dqt=h9|UmriGwXB3F$D(*FP|?O?|vcgjIxc{m)BD}t9z zx0)11w`evoF$8s2jRKs6B%JU-#sDO9&H(aFU&9V{d9NiB?LtmtQ6x?<0d0x_By9>* zwg%EiO7WkKa#?9Q6{_C7q$cL%Y1Xnw8u_wGBy1E$6!mTi2WTANbQSn#aVYTL?P;Sm z)XQ%L&Yd(7%N#^X_$eR*Kf}Q|UgNF+uh&o6`^FZUr^U|+TG_jc5@WEEReTeLec@Gd zS9aAd0LZ`?;{*3b!Z{Y+Il*R-gcmbyb^Ab7*uNta-9g+ss`ecn1MGFTS3wf*ksD!U zQq0P@RpbGc7$lYe5%Y6Wgb32I+sq5d(5&MSvSmRE7X-F&a&j<9$25xww}=qFWL{P> zcWpp$Se5F>jQrR>*y6Z<5Zarc5PU83)x=T!MDX>+xHApF$FAw@3CYF=F@Q7Iy?ysZ z73ZH7v;P1H4!?j2#jXMG{+Vz3*T!)eqj?;$4kYswOhGEjSP||qfOF3r_N$2_JIFu^ zjN6p?g}~Zzj(QJF{*_jF1f(Kh9GpmivND6WoSb7kWq-VRJb}q;1Tb){j55mGm`Q>M zKPVYEImZMXj+v)hye8duB!|je6o_pjCnV!OgR#j9PtxtAP&ZeQvam@!#R%+o0ssf5 zP6+FqW7ir=(E%Y$f#sM`VGG7i0NT9)0|$>@dy`!39%cyL8;4mk7Z_8^9>*B((x#X! zu{@z2Pbsm!WAk!A$p<9kf$BSo^Dh=#->eceHsVE00UF7@VqEUpK_Gez_Q>?F2e;LH ztF|&jBFE;RGFO9Y+V#o7_ZS($`MYP2Qn9yt%{$G7Re{92P6A7?;N%cUZhiXtVANL6 zB3(n|q;DAq%nG>?ZU6>cee94%afRw}jE_>&NLyc%V$Qsk3Z_E5?tEZyc=rHxtBDfJ zBD9Yhx%&=cyzd4srqK(zx##3skh3Oo3exwt2}JJ5-WzKsfz6SIc_M>}je- zkMrhyDL{k(2?|IV$iY0X02avSHSS&;U^M90IeB+5AdRhp$7_Ib)B}z=>_An*E=@Zu=QGFaecAG7-)X*Mrj|j%(2L4HQEKyt~7@@R$V*zz_yb-Z=xm z7#ZV=_P-BWtX7b#01`$muno?b2atHd<&Qk^-lvk%+B=fR`1dOvg{8M2#L5Ojl25Sh z$0n-D9ipkXV;cm0pv8hmToz&cSlh<~2N|YEVPs=wP)vv$ZsHIeE&w3)IL-*;>Bz4F z@$ZE6ySu}wT*GNS+OG0sRoM^&0P+v;{{Rm>9^6;V-YB`Vww+^(YAksUA(vt~?m;;? z9r6glIP5FoZ`xbLmiE31*Dfb@jD40^^CXHygmeKgI6r$mM%@1Z7AyIe)vjW=)pbeZ zkTNywvXatnWK!(Iar$>S$Qi7af+Ku|zA;5CS6 zY{!Y(NMy^Z90p+01O?X}Rht|f5WHh<8ImHLT&>O^L`|&arIH}bti%(N2~xj!5MotY&BU{NHeAFx*e7T}4Gsp8NZGZxI9moM6cOc;LigvJD>^t)3aR4>C z#?Y}oSqw=kPIi#2NgYCxd2+9o^1J!39MiNw6cV{{CRxE!2;w#*fCwQtY-C*XBvTr^ z)3P!r7--_(y9LUhkTU~=oG=3eB#QOVf?g<>!(KSBF*{qwdg~48jS3?_$oOr!$smrT z{q8qlrj@Il3 zK)~bgeJi#2SNl<4_!q=UcV(){Z$3&~LdHbkF&L0A*j0es3bDZlap(`)`tSS|9_L2U zVi9<9&gSyo*X-)cs5P*YpacR4CnMAjIUF2*bbN0A0D_+UR`JYlrD#y;`URwb!7IZz z+UAHh;#&g;p*(|-a7J^A{J+=yL#X(ZP`TH&+uMunO788R>S_6!e6}(GEwp{m0SE7W z<^u~`P1U2a0^f09N-N0l$8+-|la!Ex(f#nQ69vf`Q-QhH`qbCbTtp_BgM|(x3bP{N zag1?+o^o6sI0WLeqqunBHti#%Qk7{_ayv#_3zAL?a0(0&xZ@=AU#MU3PEU!J-W~Dv zrj>N=vRvJuMj#B9VUlt{*^qf040H!L{=9x2-N&fub~9VTlS<=z+#vH6cY*^mMQhP_F!1WpNoolc`snBA|uOOeY5}oCyu9|?;855iYTJIpW}!v@Uz81MoCLB z6m>uGFty-&*YhR+00l~eT7Q6kD34B2=CnD?N&CbAx4%4wVmlr)p1;O!xuw)Qsv0Ay8~ zTZtcKv=NhrEJ;!FkN_tIcJ8c?gxY+OX_|(qG1)%9es1QEJHos#hK*Z*Rd+f7yeh9w zx%yk-EK_*9;?ICQJ8aRxX=SR~M{_hFL$*0@ZRWU^KnP|Ei5n338IL2jKe_(^2l%VQ z(0E@+zWZb`y{(#gQ!rG7mQ@N=?fF|9MsfUY$2Hwq{8jK=VHRCaPHA8Te7PrIGTFJ$ zM&(8c$tnhOk4)R|jXnpA7|yq+GP}mo$tBQDfwIJ45rxA8xw5&*?rPPi#a|3x&kT`k zx<}i${gY&T=cC!KVXK35+RrNoMUJ27-lIHtg(*>+x8SW;yju?;5K_v;o zu))C@$YOnumiYVQH^bZeD8Se3uVZx*tS0F}cWzrPxj;WAaCyq^#~B~bxBL{MFAR9H z%S-VFmwRs(scCXzhD#|HNy5l?6)d?Yk;>qYanipPOEMfZa-uSfk%f$_Z6S_ua0t#u zM;XpX%MaTYUC0K*Dzs?P#-NPhvy2Q7SPU*t8%G$+qLL-KzY@dkZ{G1eWPmnfIAxNe{XMv z7hV|FyglNbCKGX_M`&y=qzSlMF$#AT;DSDG7q=ZwN9L=wua?3YjEdX0M;1~7<&FuA zk$||z8RbSm#u^CO6tfm^LV}K&Nwdb~QVs@k!*c_`>641I3hhj+GK+R|9MuZm*Ef24%Me*@(Id=kGB+;r zz<>u~&rE(oc;`dZ{6FH~5$QVQa@uNkn#AiobHr8TEaZm-{KZJY&OLFH*NtXXS7u|j zKb^^P#WC~X^PFQJFQx`D#Q+rGZXn=3*VtHw4Uz^Il1nx*oOC?{Rb*shWl-2?^B7Ya zwpa!Va@iQK;BNF>k};9}lYhZFehF&+1pS@-AEax{vFcLW3Gd-ClF$Zxtav?s z`((FW!v?=rbbUS;Ev;?iiK1lB&lXIPssaLTP!8gF=dtK>&b(GulE<||IAzb2?Y9^q zjz(}YPI&3q4jA(OD2fE~7)oAKW>#p@J%a#@5>Esil6vPD9OT!}n*G$;F}%9Ajx*-F zEbt*Oa#ZeRao7NJ&T?_wabFPpQ}~5@s7tKr+LUc^6WYxbVpw+ECOY!O4n9%195<=S z75T~WUsaY(16Hzv-J*Eo1iCV?V5o#~j1WlajCRS$74W{L@F&MQ{;t=WW}+6}LT0wz zY{>#Ce6SmT-s+>jBlxPut@}KDLDNxXYuKlCgL0^eoRCNgQy^y;@6R9-FB$Ei zFs#jU;D5x;GUe^=En#UFYi^8h^6`e*!(eASO1C2o>zc#x?u&J#>W^ot`F7HaXNrBX zn1p=f=M9fcZO6IjYtuX(;k$1UM+Tg4Jecioeo!`rkODwPk%!&FfsWbF1e0FX;xB?e z9lF!4<(?}=nHOcm(Loz!h8Js|djX#KZhich#6Ppuf`z%ViY0|(^4L2lj0pCE+p*6@ z9S=`jW5%w&7+4{_i|p+ati>iT0%QaVz!T7n3=`8l`kM0V{{RQ2q@pt`#;qWe$z>up z3J6zjes8=$z~gc0mdySb)1K2>WsMn1IY^!3;v&tAmQpzb)1hA20=)~vdd=;Qv2zwf z!t#WkIf;d3Lb%!nGF1LUo|rZD7s6i-!>+&t_XEn3=%RqXagIWTObjtQx#VNN09W0A z4SWfx>CJB%T-dBmQO{icFQ9xsyVY)^miBm}gj%#ftZ5>K z7*_!2a4f7q9FC{!?XdV0N`poaLvlApo<>SA)Den+7t6^l& z=m-&{VIv!23tVkyV#om_3I`i;jP%LPeI4+3MAM%@itQRyW&~Wt5-K!131wwC4T2k$ za&ZvM}AzSbYz z;jp-Nke#5Ct(vA&~wh|<`Ja7up>Il=jx0B`{H7_aH- z!Q+YxbcF1V9n&?utQ*N766*QsoCf-gXVO_hJHXdcPa8aigFuFM-g+Rw>Uwn?0qurd zL57}ao)I+5EPHkU`%7U-kPe4%IL~Z!&VF2TQA}hq66vvfFW*dn zIu4$kaqo`NJ(9~5rH7hUJ)i|r!z^>PhIjzuC+Y84cRn1`ZXwug(=sk+kH`wd;1B>O z8@W6TWQxnv{4H-~ACniBu(87^LmGU!8+r5u@z)*dJB>8QJWCadvZ*3jTzPY``M3wB zKJTxvCz|PP>{SvMPrtM-*9U5lSl|MBfsUOxz~qXX`!-pfWsnVw%)VMH24Df$3iUsC z1oqAbJ8+&ow2gG*EFZjam-5+$=&&}9M?3?LPZ%FJ74nn9lIuoGx7s3IzBUxbAmdY{Ku2fbNZFM*E33l0U9w<(#9F47;LYg zBaWvdIP|RzCeZ2NNhD%%9wmkbU{IdHGI;7vPe0DOEj!0LSBZ67?FUF{X1dWX1-`2k zw$B6Fo=8$$4cnJEbSEJ2*bQB+#8Am)D@U}r#BNY1VYR+x=hJBzZaMr<8*o&+7}Y{6 z?%d<|(fokq4D<(S;2qns)~ra;`DQ5?4eRofN}vP)Tdp`H4!q{Mol4OrljepZ;ewZN zvH{3b$ieH_c0Yw|Y0)T-5ZhT^KQ2i*&NwF|5_fmpxcqZoo2F%B^3_U_lPAlDQaiWT z1D*-vuV~z?leBEeAPeiX5%(CW1fIZtTn=iC=^FgON;w#2jqd`(xk_ihK=hxs$5)HXc4r`B)GXtWowpIQ<5S^VtOtK zs$C>~vH=<$%KI@Zki-Hx`FO_zIW5Tna$=ALP<+A$@Y{rC8;1lg0XZZ9ymj5vwNO~# zF)U%=23ZnJN;VlX2hSX3h|6+D2Hrxj>MG1cy~NucJhlPI4z0bJV+z^MK-#U>>yi)4 zAYjq&6DtF`#JwX>7?H?4g%}5soE-P6P|WXRYZ17XD0h}g!C1!L30?d9o)nI7r{%z_ z0!ED@Pd)*-gpG_PRzO092!XIi%reSwI%BR9If0B6a7q$gOu}Ir89wvA=cETB9W@^$yE%;BoJ}xIVDCbf5UeV7m9S3SBY9Vwk%BHoECiN zvH6ifz&Qi1GtW!$S6({Dh?LDZNbK#SMe^mz9E>PH*~a6zl_37;^fxepAzTs^1&<&W>bXBEfI)2TBCL_bu*KJOgoT_EA$&F%kbZ6f0|8X$ zC+6aE1WLY2>B$7^W02v^W$m2N9PHU9$SA%VCGzqO{iJEBumm3o?F;Gf_leF?d{4<{a z0H6LN@I+c(xv~dc@=no+BW4d7^9RZX?{ar^9ON9=CFA`8;?d!l$1F&yHoi%ak;nj! z0pNE%NcFFY?v$I$fg7~oHf1DiOad~lLHnzP1&JJtoE~aCG)SsujiXsv-EHPWD-q@G zWI5wINCYla5_uU@6~N5XJa6~Nb$69#aG>E-oyR!ofOCwVGEGK{h}ai6ga-`F#ou!z zU@^`QE=c340~`V@At3BmRh%%|(O|h4QTw-6!EA2%e~WR+Ew>)+`#SiP_;2FJgs&D= z`y`sQaZ4&o8U@q*Q2Uw7n-RI(w4W)y7(DTggVE($)%P}j_O3tV`+htJ4OaFq^ZkfXBY>NeqQ*S;N4fo5_obOE11&HOTLk{O+Dmh zOZ1haK`7fO0H6+mz$7fM_i|YJHHD3)n`LcbYFJy_#kC*Jkokr1%*I2F%vt{N>T`~j z?7y?W?DONF7JO#0_>bWoR{BP_(&dUR8qVE}vs_64izYz9JiV^2K}`9W=L0qR>8bda z_Q29~7<@5nplTK`6klhyzDC_5DrABiAbh1s!RyyNX1p@%!e6%5wW=GaN2nf)&}3_0v+wPbaTnX?lf?7NRhWg;W;YoG5~nOM0R$Wq$@k52 zwjU3_Z5wMRwzp3n!y8D^p!Rw@^^4R z`u_lj!oDo=hPQunE}gCG;_$#csUezHng9kfg5(l@Tyu_qW2QXPeN_|Lm$E}O+bGUQ@x{H5< z{ujE7%{S01AVn!VG%eVC$L0e7V;pgu4w$l^0Cd2qa~n+T&Dx872UO-!o#GE$+a9%(ICj~`&{{X-*+2`T5tK*#-4PZUs z`&>*To!z6kkr*76EuV5*I43zE*Yw}u&jM(=M})Nf8%nUTh6wc4G1{0HasU9_Q-BCi zKs;wXah(1z{@!1+H-hzTQs=~WR)5+0g^Crt)gh2u!6OpeBRKh4u&OWz0E~=~59G8T z1aB`{Www@B?F@|+H&=5itoU#VjR)W8MtH#owoP_$e$P5vTV{P)Wt^+AK4|$$g*Yk( zc*y9akjIRHLVN{{XX}!|D8equ$-xSzp{+%jQKj*)t|oje;;pC$2Nt z{uTW;Xm$fe(`@YRt#?7?q(5XkpxB#A0tp+4$lOmr8?UdhX}7*~DurfCcvH#*mfFFX zZXxlF*v>Fc00$)TT?$Ut-bU5iy;bAf9bPpph51PUwgw2v9S$*?$MFl>%_LH^NYlda z9I?o|<71u0GwK3?>A7)($gc+RZmXqOTeOcHF}#tucaktmhC>+h5k^i14;?;G4;A_Q z@sC{7(XWJBYB9TiEoBlbCE+cza6r9Ba6WFmdwfmf4GQMxO}(AtfHcrZAhB0jZl)w0 zZ%}s+;s6qHoaZMX@SUcYVI8At;yXlG3qu@|Znbt1uE@^N+`rrffJMN|r&F`6U+MP? z9LTY&MFCihtdHh0oDq|po|s(V0o8{!^0$vf>*5Pbvn)uG>Ivm68JS6!b_U!KHxNd0 zxX8-lzJ<{IGbP4|Z)Ed6*n{n35u-eSsO5+mB=QMfgYgySUOCn-G|L&$t$e8nkV_+> z^9Tgv=FcYpe8iG4dgG7IPZ9W%D?b<9x?4ucb891E(8Cs84tjx%oQz|k&M}(7@Xy3! z;ko6W;lxPyS+@pObx?U>(64jJ$n?d1Go*ZEw$yY>h@@wcq>Q|GE`lK3f>oQkj=AHf zUb*R`@mzYWA7?IMf#S?zoQScvaALiGi|=xA)E?ezuU*(__kk`XW?QR;w{IddaP1?N z0X|ZAdlAr}6)b->NNhH@NrAHP1vmLw2U|H1e zc*$21A?>&3&ry!JJmhm%<lyL5URk zEqj-Rr2;!sxR-6Ck=$q04yUi^hl2HFv%0Vs%l6ApEmqQL7=_Mr~`H5k(_WV z=_@^NO|!a@qPu5DL*?7F#sy;G3$ic({pH5h!2@?rw2}DsYhUd++!jko5W#pPSefuf zBT`O#k@J!4PZj0 zR%07YXL5yEV2g429E_0JVBa=4#~lTF9+~5hv-qy*6_L%HhFD>Yst8|h6t{2)T$0BG z^PZLV7l(XG*VZCO$Dba@@`f5va6_Im#t9kjTekr0+G^H~JKF_~3@38PBT`0xc_H&K z!>P{DKZG6LlIwmYj0v}0N@8b>EBT7^N0bieSYv)qMdKWC%9{9-Y8+&wy(lK!+?5gGEY)0b;mpeKTKJIW2agt1vN@0*l%G>RZ{BGVtmm3QV@G*ch z=-l+9CU4$ES&@ix+e8J|A2tabVNOULMKJHwYduP~ZT5XW9#f+%kD5 zuU;#W)}G28L%|nPMR6X_iT)YVqsAZ2X?5K^M!`WVv0XxjI3RAuO?}Bl73W_TP)YFr z0AE7Pp#7JXZH>k4u>c=_pN)KZ2#zIft@4?;Ap)}P2LZFxoFCBBysde8fID$pql90|O_m zUM;;Ok>4m-Myhxce{c@m@N?IW*vNq(kIwVNu39!$RrAbYa4wPq z4mO|R=s@qDgPQeyEbOwtKtxCsFl7X)E-}ge>F11b>62JDAy~RH&mayMc`QhT;{cwg zCpf@d4r`)=Po1DP(9G`ch9;3tT>}>zxoqUIBpwf3W1zLAcxo>S+t}Ogn^2r5m2-PM zo^9>NmY^4!LUPPW`HKwYdFTyv7P^&<-kxrvEd*1!XyLh5vYE+lSIb}sJRS)5^sZ}A zo<`Na$sMHW6zV4zZGj4$<&b3Lz5<-%9OFGjNro}BO^w3@IFkSzjFNMlk=s46PfX;z z6C(L+aCc`2;X)pSmKZ#47~DS&b6q8sx)>y6KnRghi#EXzL7es^?!Y}$BP4sFD2 zNpm4m@wP(X4aA+k+;_f%w1$qb~26Z z8A#-e;2yXmIVuOGK@3j#GEC8|QE;jXI;rJJ=O=^HpT0QhULEmz)$i>lSe$1pV=o!< zhh3cHe{}G`aDA)t%i>0dbq1p%NqQh9{!tq-isJ>dkT^X_$Ed}8J^MoFaW90mh+(-V zNiAe8ADQMES%+@J1e^fAyz(>nJ9!Gls9fb8%rcnK8F!UC{_@4q0SZ8Jz+`mpT>*&&Q39r)NUqZ(&m>&wYtGT@-hjq7$9ck0vjNeZb2A110BU;O~i1_ z%^ZvhNMnuKEN);1KX?FOcYse)F~%x*A@U(rXOXt#2Ik8Un_H}jf~g}^A%H) zH**}4wZuq`a#B4$FSDRjg4Re^%q3$i0B3LuCz|ZX90n_u8y**o$>I$zQ!!>`BXbD) ztBmafDu0WClDragfl+vic=08`mPtvDY@=kdfX5uJcc?p&cQyed?y{WL0u(74$2`Hr zK2&%rrc9WaMzUid{J?F=*mIMC^IV11P#~IC$#h>bC&Aw-3S}M6MCF*Is9Wp-75qyorB8|8cy?hA4OH7AFxng#4 zA@gKK5g8Oja*RV}JO$t>W(*HOyRkLDq3SDVtmzl=%)Vv4^mh?3aAiY~!w2TvSwQ1I zD#j48$qoIVe#71#dXdn9)QkWD9Deow%XvCaiI1An zs~Z*tm@ov3yoDfV9l7+cs;HuhE6hGJhi``7BoV)s__He6$4mQDkH;ANYw@f0mRqOz zQR79kX(zdtLAYo>%%%6pV~~Og;kgTg@{ms>91r5#_P6kanog-_tX!?q+-f6b$J$|x z5i4N0BmfRKFu??KzyKQf%PQ_+jJq%#Laxm@`@2T$jFXTv{6zM_6{DoV9p5IlZv%K@Yx_|?nQo8dc~Q<`2502%+M|UhEB8~RRx6^OnODkl7(np3QQVfKlQM)Pfl^|e_ zp|UZNUjly95^1_$!jBc-OKs((dSvqymIN|Mlqz3wJm(~-1E9$qjDI4&E!5z=)-R^E zibyS9?p7HpLT_@R%C{pKI3yAQ2c`+Yw!Aiz?gCuyF*exPu~u!zXF1>lf_OVl0RsZ` zn!7PzmX8=9qQ)|kGiPaj8vtWzJ4jKHh8+c4EmH2zSm(64xVM%72nJIWk*Gd_fnB64 zXVVzYaaP-0)g6^CE^a4X`75_%Slk$Z*(7n1h9`wQXKi{n!o5ah@y~{&V=Rhw2o(A8 zk0`KpRw{ZBPb3mBKp-FC{>nZN_*Y1{@F#~Z$_XcZC1#1dmsn&zP%OKEE0L0SF*wD3 zJO12X1$;}dd_)%B7_u_?^R>FmBdkz{$Rr6Hf-p`4VDcEAabE%3{1Eu39n_k4_IH-i zOC&Mu#?DvH807PiIm!0TC-zGCtEpNEJjAz(F^SAkf^rDJ8+ggX4so1}gUGE* zuh~c9c7zh;^=E=S`H|Yl!PZ24@Oj{5jz>&a2dwxf#o7dSc5<7WiTAS1$hb%_NCk4- zjtI_k(>Vm^)qiLI015cg_r~5E)IQf_w(-dW&xyRffmi|?0Bvu}mKn*#e@wm;w{fBA z@fn1I8))UYFfg^dF4zMD?w$$5F(c+R@Hg$@@Jq#>H}GVZeh|G_E-o&&%?#`~S#~D> z05E*R2a-r(*Pma<4Nu??#vL$O>AGE{*LK!ci*IvyBWPo}kysXJQ-D)F*MpPlYfDM} zpT0QDZm`E{eA}r=mPe6gBg`S%HOmdZcx3b;y7jGHNA_6w&36rup51NUUF^H%2#k}uxDU9H zz({yqs=SanZ(jRD)b2G~^pM^vX_mp=mGB-%W0GWJ$ikh2Xatdw?cOEJZdjUEe=p0o zVpO~q!#jgHZaO<0@t$&egBGVewzhFZH>N`glH_5%2^*Uyg5Ai*cqYC=_=!C8T;0ys z4A!zf)Dp_g84L2~-Pudz-YK3m^DIPAGO{zq{5-17oPpEj^dOw$=RXp7vi(c>I;E+C3{3W} z!VD!0z6ogM(b;J|frd;En9HEhjk&T=@foW3CZPw{Nm5@OcVJ6O(RDI=A3AxSvk75Q*aAKu3m@Slry`R+BM^MM3} zI}oZ*%Z%_(%Zz89;Ga`m8rc5;YfUUc=asOEi4h9ecFdbpazO_>hTdEFg?12W+NPhU zh_wAlp@ktT(3b=jUPu@xJb~%K=K}zCx-Hj@KFSN|SEa{jG~HG>r)9XFNd$Ktqlkh& zU8m+4;ZLhCQ7Eif?T^F4p&VQeE9mwizSYhm^aiYyzV=Lfo!SaC;p4 zwS>BHy_#zaSuG)WqP3n=3dk3nqOUS#zqO>VI z5vp8BcjY2dz;6LrdB$=ueLifs{h~Zkqxj!M((Jq|s_M3S{-W{fchTOW>E0ZV$&s2_ zAuJ1m%CYQ>HW`%i1$ys{{wd1^oU=)BZjW(j(T%d~L~H^VZZ>Wl01sTANj!W>;>~we z@fFFAD>u9QOvns!Bl)b1!Ayt_25?U9nZX0FuYtd7{{V)N>Hh!`eiZnID4k=~JWp?F zdn~`Y-MoOJPMii@1%5!|j^DLEvc{&GcZxg@q8Q>}xA0q;B0p#wSrwFp;4T{joPH&_ z{m33{kV8B>h5!s3GCu5sl{w%O-z4Pc(=FaI7~2L3I)D{-s(=XHwD1o(=op-l&|)`} z?Dpr&GDc?1J50e2N@lJ;+&-}nPOIpI}60DRYGpZA+gI4+d$(ybAUx; zYo%@_@EY6|j9Pq4@XNxRNq3OzmMQ}fahwuz*#zSQBQ^Go6juT9L=)gma00;Q*9CEr z{+VyjHSzl^!mqn5`+y6$ZHRNYU;&N~L(>AIm6Tw%@h0%9psO>3xM#NG$4)>#oMdoW z5VU0p8*s6!2=a1%Ty*xvI6U_`cecQ^j1~O3CFVWYQ-SjlfOrSE@7KAkySNcqBv^}} z1~(WP4bf(|eM1Dy1&-8ST3z+`2W84IXP z6;MwOK*8YfatA@iF%b=^~oLmX$%9+SeaT?)eX%97Skm1g9DuxFvb8%gi=72Js9irr!I zfQ_7~Dgg_e;|w|;a#yF#obj6GCc7{;`K^>PvWEl+*p5noryyYSkPjz5mD%WWLvb?P zp@+|%K2m@J>J+GNA^qNAlDyNi45W=~^*iKhDKQ<0Y{A!k`Y9Ul} z5Rw9SMV8D%Bkuq`GJd3U*0~$$8J!#xlt6)`JABN73i3K$A_lkennC-e;7c0}0oSf@ zIL;3Pu4@A9BeIoMJCLbnAdo@+?%k`OL;lykTWrjT@=3B%5FN3g$_~U1r#$14!k$hA zcz49>+cfhQZTtMTkVp3j!ws#@M>)YA^T!~A`K9qo%DB91sS!_>{$z1B2x4$Ikbd_k zkWZ#N3jFu@`8~Y)CG>Jkk%4UK9^H)`tU&=Al6MRON4IWk@WWb0O>X%R$|75-Ne5#i zZaH1Vo#PzvynMrxio~8rS^ofVw*kOG8NwyOIcFc(=(2 z+GXn5EBzx zx+D3U=J_Qnj4 zW#DUNHtMBf-nSb_Wdw#hae@FD;YS0Wxi#cDP$N>#cKq9X!?=%?4my+6WsZ7+M;WF# zToSJFuyBS|RSe*e5CBy7e%Zk%k%p?#Fp@H3+PP5_0cDanjtOncoUU-EyTRPn;N z;JXtL8`)!dqL@cCOg0UKl~c5w9^{N;85I&k2s?t^?YL%+KnY}%l1XwhSChAr4_(9W zXQJ?=a!cYHRt3zZ)rur09pLZ@ToT+V10>^l7(z2i<9koCc!F%CyYc6z%;)CHoT%7- zV$Q3U$iM*dMmdlq-!I+A6g+ZANv2*AKRuR=ay(0;*w z#o8KL_)kclJ8=8hN{)8|xxr9Q4+Meh{5?4}`r89rTCJO4zl9pCxD9E2H#sNFZos0y0NEkb|O*Z3D zw^^<%uP$tb!b@c`!z;utZKY_;(6-aHqkW}WHWh9`2aJDR-|$X6%kZnhQx$FE#wc1x zQ;;wL$jHyiMtcl^JBt30zh%V>r+BAqVHJO~e`+rf4-fn-@t&+he&a=&K4-`capHhv(tvJ4TYE4?j{Z)MyEm@}M)#{`prTyiV()$_hKP)NqiNhZYS z%Q@T!Ld$@pWbPx7E3WWNa7p5A5oT6o`+QFB>$tL(MIn%mJ$_IK%W!jw{=Gk9y*E#b z!geD~xiGuwODI5&);`VYh!b3Z6T6hv_L$WZlxrhhdZ0^+lND9 zZ;GfbDQcA{f>><@rF7V|_Np4OSB)q|BP3R}W>K_7sl8`nQ#x$1+o};;jqjV^@%{%n zlH!uWAh{7c0ZBy~_aJOz47-Mz!oSm-TPeVvV&A?c#W?X|gak z8Ft*#ZElx~GMmLpGq49}FwC{VY0kLD4v%+VE^A^U*oq9@!WeS}BR+o1burufdaLlE ze8n-6Uc(=KFVg$+tCnD`M}*#oKG3DtFt68B2}`Jsv~#tH=45RdqX7^F#8M%G(Fhlh zC?CP^%RZdq*RBIn%e)PwzZ-Nxz-My-V(l%v#~81r$#)MpZbw zRo&1Ct&|{W-n2>2qrKlE%2}1Is5yR{s&RJ&Kai>?(I{dutX6lFTy8sXRGX2#ry$rd zJ)|jbc>Vs#5IYrrjb2^E;))jgNeihV@f}$+>F2md1D@dnz+Qo*okT_3%~ ziKLiS>{>~TY(WAYmp-glc|v)ApS^b@gS2b%>nN>ccFe;^jZiLjhv)he*&2MLeV(g7 z2CaVa_3`8655LD-w|qFq*0wwYhQBs3blGM3tNVy>^FazaxvNTtg6SDx*VAJZuhoki z&=Y|9Bm(`}rw~;Ki#j&t%RwG~o!seQ!?V6*OHK>SX9*A|-Gh^qv`BIHEH;)2;zc1R zvhzjE8`TXF`Tj?ZxGVyH*|uWRdDh98&+_e$k8l0hpGW)_y)EUeSL-Ghy;lT9(~AJd z{P%@lu6?W6AhYDIwYKXPOCQByH>0Mfi#nMBzficwL*heUgfQ_^fGl2Ao_zbx50G*& zh(`ZT0*R|OCwMg+tGeEFZI_tr6>#dNHrb8EKIkQwr{eZq^bxxz2*0o##-+Lj@%&{{4~|2=x2#H&|Es&`7X|4uB#6j#d!)%HK`pO5A^b+A~mwW;`(7kXZq(P>`Tb z--PPExLW^MUJ}Kd-DnAgI4LiG3TIw{u>3nJ3uJM0p5Cz4Z)7&@ib-x1B)5Fn$8d%T zDgF%cC#22J5Fm{fY?m0}ZM<@{d@nF2vrEMJ^Ffu)=kM2W-wh$5{nRvR5Z2SdRqsh7qsTAWv0Hp0&aQHSXgAn*9eFA3)a?_t>!H`FcaC~lC`>YxJdCcxK9=z5rVxJ zmi02?9?GH2J!n^{6<0@0gTSrsbvKEmz8W=P>HNiefoE&k{LQ`G6)0FzQk0O*^G7=R ziagwFj+%5n{`+wYRQC_JELs;U}kPeB-KGxMI?1d=jP-q z8^5dTo@Rlw66axG&R+n}uO-DnR3*Tm7`vd8s4nYXA<@Y?xLadGUDB`#A~H;dc~tR* zEv{?Ms(&=x&HMTHqB<{G8JEy(cDPe;!^jKLdqY-VKh=IZ3Bk@&Z!a$7t6qyo70qoG zbNQ}~9%cm!Evc)>PCo#s{K2B&?z5AsZk&xx4?KH)&*5JE=)@g4)0#a~e9Pzi=&2)z zv?qbZvj*bTH)h3No@t1BY(&o{>=aWS{bdX#+AdLAN5Adhk>B31)K?dsc#{j#)ZAV@ z+rAuuJ%4W#a^9=m1m%cx%24gsFcEKWy~xGABWv|Mzvq@|aE&bcCHp)z(SgV8q5R5v zzi&^KAAHp0fC^yoaAJ1Y)pUwGhDj2n;FK1d!|9*HGe8XfY#6->Z;EraEts>GuweE} zjAQJ~dkKo267obQSunBm7;-la4r6gc$FBrSqkTW{$J6lv!QG>d!ph=|~~9 zt1~UZsK&!zzAzRy&&k<7f70t^%xTfGPrQQ|a-ZMRGb~hYT7Z)=mFh3s&n-sDN~Yzo zon7VT;w_Mk^VWRIK}+QKJ%$CdK^J!T{8yv zlsI0!mYn*fBU|jR%!#T5W9$Cd$RE{DALElD(kj!OAzhZkF|T#^y&j-VAOKQCX}y}+ zmYVwvO&~6KsEHeA=q19u#Vp?zzP}w(89V&CyUX{Ej`5_>sh#f_fKo_ZtQK&iwi4T) zP__`sklVjvf7Sp*`-K97Re_7>r&qGg?y3_IB~vYnPw{H?B*lZSmAt9mA%Ci9LJz&( zPRYI?1cL^20@e$h5f;-oAmEky z=l)g}iEF*GZw#D5kq72TT!KIrK_SPUHD^Om(TuM7jms9~|9V{t>ECch+$IIA6rV_wGY}TVf1a?D!7&J@rJFp*Bz#2#efKc#*nGwS z%C2Fe)b#PBes)A5)8O%yyZNDx4z;w7#i#*5YA8`?{x~*pGRWN0`@!p>muAHDUg2y% z^>EC=@6GM%VR7XhY3kdTd$19Hf*~~k0Iana^3Ta9#Mi0nyQFZmj%GiOj&tbmdZImQ znc}^W2U!-3R1b|_6e5c{8lu1((zW~X1ehM2d*n~MTtj`G%f6GrU74h%Xd2_l#|8HO z80MU9aG!6z9eagwDWxM zCa6{V*<*OmIt{%4;HTX727>abHY$&HHi>s5vS_u3FRcX|Z`Yx7lp}_P=x!;Di3F@S z&09nmZ5!TY{7CoE)NQ`8pA>1iWmcFr@;Gj~lRwvy27Lgv-)n@D0uUF{>x-D6hH_Ar zyd25V>qB3zF{L~oeDVbywinLqwx_qko3vA_?s@#iGYjt$pg$vz(@FlMQtv+s3+Y!+ zxutNLPv%sW$6FPKKb z`++D50>(Kf7PIlDb+TW6vBizwMiP@WHtzP(313B3 zen8(@?Jh7pbB?C9R;H#|X<}6dufS~id?|+p4up3LX>X)_Y<(n~Swsq8;OxeA?MHvA z?)T-*5L93F|916MXxYWe=4G^Pepz>kHAhE3%^<_+vP%J-JBmot;4q1m%ejhKLpgsMPoU%L# zNil;BmPuxLec+CLxp3f1fvYulV1`gb2*c>OBi?{YOxau;yi${v3Qk@{Yj1pwyy7vj zsR<2@Yc{HWN35s0Hvf&Qk+oE`5fnfS+$cEtUN~p@*yfLk>o^qk;fqL6B87)T&8g?# zPos|z5PqGs>w;e!jfzss{p#g(oh22PBjk^sYyphP;$wc z%V#=SY$Ncs^Xq27S&1gfN0HM&T*uU2e@s|}gbiAOi|70lv-|R~rO_j5tuT98OK!o} z1fgjGz@$x4-2@CFQ1Pyza$>hvcjn4d?*dyyKKv#4Cl|!V>_;wK4qNBFEe_E$olXG68K^0(ZDo1C29z<$x59G9djk3%}?OC%pFTFk^WNK{@x{bHo2B6g|jsD(7&rn78R% zeSx~ORDS)eJziDdc*_nORp*j4e=bU{djoB-seKi9oiSUv`qm$ggwsaI*&@Y9z}JrW z!<(fk{vGdWQ6H~*6`cKbMbFITJ{q`tu-G;^mR0 zLCSI=uAQ5CL~MptrT4Q!t9Q7{X;HU%VOTq>KA3NV-$0d*(gtGjw?1mTHX)vYoL)eT z2wgSE&0n_%?`n55?{Dtdz3kY1*l}gdZTFSg7tj0!yE*Mbd0pk9Aan2bUIaT`^{C0V7RbIoe#gx zu1SJk5CC}9Ygxg=R*c?{T2AyKAkN4gx3U+AaB)@_FMM^LuQNmK(sT#}qyoB_1F-3$ zvY{46MY?fsL{5F7Vi_kAD(TLaB1|QYh#Ng&T&y%9_HW|DzS52 z6ifdoI!t&INUDmf9bsG2ijzI$BddqFKc)%x@Gf!Yz<0Xk7L#t=w^2PfH@GNlhj{Fe zfxU(lJZb8tcdAyNRX5?peruc+>`+5jskU+=vC@alcDtHwF3!wjaCND*yMUs-1WvxE zvlU?1Kf3-O;HeX9uA2|ncJJ+x#A1=VR3PUYkb1S4QF@}l`@*yPMb^T#p(>mPtOK`b z6LWZ>aCL@X!wh5Eq1+p6XS%kJpXjW8q>uRie98%J011m$*rs&p;+{_~`>@PKxSs%; z*Gh_mt#e;E!~<~OzX4y$ybbAG`jW${3ZnGK#ul$e=}=-n{DzbPH>Zhjb;6ULB=OZX`R$2gekp-rWeua~_`6cGxbs z*nUAvF!pe}D0NgO@rpkm#yfAr;)Eq5mGRk7FVNbT-?rXOXNLWb8CymKE7oHM#LnL!oorB)rQ0BAqfWJvVm}-yn14!xL`oJXGZx_7Kvq;g`m+`_id``F{6BJrZJS zKZ2bnNISmdohR)@XEal zuA$IfuZ9oPsxGj)G9(6nz3#iRB_L2F#~TTUkB00_)JKlp46?Z<)#40$#?{;#v~(K~ zCcu%onHPjvZ+9a%4_uTeq~C`6mCKFsU(e8y@Oe|PKYmETCXYnWkqz%o-Z+2A928UO zB?E1OwY7YLJDLix20Kdt5n}%YBJ}^6zk0vwkffni%HN`~$w=OmVAPGV zl!SJbeB*C&PPL8odtRk`FQ5uZ9Q^hX9|tkj0$2<^0<}8xvd^#-gZxP)P%zCIc?4G- zUCO}*t2}w39J1WFcqL?E`A`M}dp#dVyRA_b9wxEDed*GThvkbR0J}TdV#%wV4V}{196)C{LGnY0Ymb*5l=7urM z358Bs;gA$r;`VN9p87v$R$V>R3RACD!I}AQmsHMeJ9m~mZB-!OC_f!;GR-{TRa)7f znP*tDV%``5SZaCvX-z2nnz66y>>p#zcCuUidc)`Xrb#0c-YLD;CD@Y~zAmS)iKFlV zAl5%0S7$R_5t#h~lbT#+*r?8^I@L2V@2SkV5S9oN3?wugg46Sd&9YEcaG}S03(P0Z z>xKzdvO*J=q!Dm*ZXz_pl0%mttiYkXQrd>=|$$ zE&jc|Y<1&s^NJPbi|*4@O=r}4Y#dGc9{s>G+?0J@#u=9iB_XtwNw}0Oh<6t2US^7a zh>K|`JT=8QQ->*Rd!~Omi7h8ofjIB}{Zqf}AF*doBLy80XzF2(rXoJ1;}ZgX^>HC9 zk(+;%G&MChTP+(*_kN~;r|zO}$6`CW<)2G0M(8e`6@hr!9n1>ch4>J?oFV{kbI3Tm z8b*lD`ZUW9yQ52{%G*0y^D_UgQ;!GArwswTA%JR#@O43Tyyv>zjH0FIyq57*vz)7e zFYvcf;YXIvTz`!4NbVBMw$!T1{NsWxyEIjaxk!N%>}-#w)Co$krB%A@q{s+OzZCVw zrW=ZfV1SK+o%;ks=GDMUj8|Sj!v!;f|ZY+0B3-XOmUqph<7$ayt~BPMT3 zV^qp=D{;;VBlC$@L`8;n{ZS)2EQeBM`j=*eJEAdPN{VjE_vl^;0t1xMyzTT4MnjZb z0;19ldlhoz;fVN0c^X;y4y(G$ zrvE07-L$#y+m|gi8Q$zUOEFz%rB#UM()%mK{N4L0Z1ttW@$Eb_RS8uKBpd#0M1O@7 zM!DNWU`4fmB~Pcbs#x=Ctsu1^r;KMwrl|`OM?4 zU^RX#1_$;aS|_L%7H}@lrqgv^pG%5ioepO3Ev#-7$l(O6?&(ORVT9BYzSRtPTNcMb zG%Yzl>HdUnOZ7c?Ah}bi)#_e95FIEQsr3XdyY0U!B-&&%?PfOkrPA=` z661NHu>onX4GZ6x=#aQn{vAf_7ETJ%0@sQ+XWi2`&R?#$#`e}L^w~(FR^XquP`ckS zg!O8&lioL(gAUFRufbo|&C8N9Q@Vm58-|@`=)l(+fspsA)a_{}G|T;gp07f#-g3}t z1(~cXIz0{E!bjRVtqYDk-&rq=S9NlqdL|Nmro9Rr133Xu7t-nEy1B4Otavc}Gz@9< znjWc5;`n_)^0#9OIVRp3-FbHGTju6xXe5UF%p|vji;aUnDJ`JuNIWT8_Pf@c7V^+Q zfEtwNNF8b_F^)FTS~!;`9{dM*#kc@TWSQ0HSA1q{+VO&{dilc z7Ex1$gz+6y5p+=b1_-wwIQH~}_vqzCb31PY_*-RwPU+^t%^wG6rC-`p^xVAyX066^ z$r|6{5(6FC6N*x)Sy{u5qo^pOzk~7I=_D{}uf?X#p5;Bi6H+jlKFs}rH zj$rB1%pW4HT(bp2pI*I!V0(N1fK0)86B)ceA=Kqc9X_ZbGOdGZ#;HD>7ynJt&rNS+ z%9s7@tNEBH)^Vd!3}aR_<#JpN&#Y>XuJZZ z9Nee$I&)wkXuzojX0RVI>=#N{$_Wof6sdE@YwrQ5Yfg)vJynbDb!!5m;R38r|J_@A zUSc$H8i(Ou%gFG%?Rf94Aua!vUkR-Zi|yv7FB~*jg9h=ZmBT%6eC?jIM9c_$gweEe6$GM#>uWZH8RCX0qqb zDbQK!zF;0Gv+!$XX2wk)iLZ;gZ{WSCxzH!p^_G9T__6ezG{*E0pJ5dXDlbnD_3pxw z0IzPOSHIIb?86BuqL8rCrT$sZU5S2+=h0fVqh)d78mHH@D%(}gu4x94+fR|Cue%w| zb0@Ke$qn+JFS_XzksD!NJsfG@oGTUa42Yk9Q@VZV2Y-a!J5YRm{<^O>k#e5Rkm5rw zyh`rTieEJO>O(zHZaYPEB*Uf+dibnL=T4~T5$H(W)6b<%Rd4q%nKf&tC%9`>kE`lOYoYN>3DJ*go>>};xh zaN;^|AImlK^-vUye)>I>ha+cO;x}F&48b@DRS5;l4X+K=HpvMZC@g)x!n2BzN}ZNq z!QdXW4!wTIIDGj)b(O;SMpvmvI;4%N-u`0{$*S))`Z>3fqX)#_MAZbm)~EsN+|P5n zeKnQRPfY(Ke2i&#jF&N&=S5`9G0dWS5a+~6O^#n4%lU~yOkW+j28AtNtY3=70%yPu zxBb9c_On6hn7H)=Utfk_n#TE)4 z+0(&2&Gdq6%mMLq_)p1WT;pPLk4EtIKY9W`cZp}n%oL*9Xm%iz9?B&UHb-|S7(VXE*6rtWb*1@jO!$9ebeOI&Dr!u_SQ2PAYxG5Kg4e6*CcA-B( zs(mgtp^H(J1abcPpb#@8;MRcZ2SZBS7Kdn$EU@}2ar(!1?M8aI8tpT|rza4B*iNOs z#gF<)ANfDgDzUewQBOEWTOmU?0MbryAg(VoII;b^o0~jk*}6yfdO!qk6erh<&FvgT zjr!?EY31*lUOZkIKhRLzVt;)j@Mdtq|%Uf#H7u{u7U#Db10GDsk8R2Jl^3QaTi5P-WQjsA6HT z!i1*q^yA-;dS$)NuffvTjSA&8=ZginQjK{bd|>#>DV%&+r|};ksZ~$)HB$=3f~A|C zJ^gl!VtJjc%@8-jYcBPxGM)=o9Au7N?cc9~MQ%lgtaOP6i{Z5)+xDscL_Y4xSvv&o z)>3_u6C~8Dn0tU|i{{5gn>9`?X(=O9hF#)R{<8kjystvB%&fii$0^0l ze{IANUc5-JW{vp4k{XUVR3)y({`|*HVPpoClkK`cUda8UcWF3tvM#ijGw1|AXtIG+ z>i_q!m?NzAT#6^0Q@2--z0eM9+a}=jX+@i2gT~y4! zjp#!!ZQ0S>rw)@V`$!jzB-9(gyo$mW3#lrRHLC*sj?-{Kd@4TX3$~I#fjl-5w{ijI zM}K{idK7q#-is_T0^4;#cnee)i4%S)qzC7XIDX=sjlLPLG_`SDtl${Sgo(khh64Pw z$JEP5J8S5&Q~Dpgxh?UUx@wgE(5`o*K7{gi5~F#eWw)VMi{%f`@R&w@6%&Ia?#0*2 zbGU8&0uwbA-|G1sc>RmqB`cyX1J^j&1V(IWDqAu3tIr4I6#PP#JzWT%% z{=`lQhzf7~9rC}x-|R`<3O|!D*yxKE4$*95b88c9scAlsE)``EDj*#ZsLshJF=U&& z6Bb0Cqlzn!#+(`lo=y!(bwKl8f-MKla}7thpo*`HrYD(rQDuI7{ssW1Iamx z{V!c)t3q?G6SH#$^*|kiOxbG}**KvVQ|#P^!1{-K<@aFLEjN>g^yw)=E?#L2$KDzC z9EfGOev~8gRG<0Us?Q?<_bKUUKZZ-OP&yHI_3!?TG;YtfrN&y-f>xQ`K+(^u3HKV~NIA4P0ar*HuIXO4w#sVA>_7SBWxz$yD~ zO@2D-+ju%UP)=3Ule%NM!WHR{DWKnqqlP$-y2rNXr))!cDy#;pL7Pb@c2B-?5O$$WCU^wql^2ZME@euxW=G7%%T2%s_({IhI zC%H1g$_5dYUMmEidkd5c61h7s%4FmfN8w{X+J5$G@$wqiOuqS{aG9o7T$mq{%BnXH z!k)7$G!(A>99hsfd8t_)4B>OesIq+SpYZCDTly9-2acJf1M*e9qd-;{v0+u{b1$00 z#>Jy|_GXxEn&|%k=Ej;&Rsh=+Em399ibZ1U?FtWNb25H^7C9=UClTc5G;o>#+VB|l zr5{uM_p?h)cDtO5snFXo_p0OWNBK8?v`DaXPW5RPZu0m4o+ShoOU2lmNv4lI^^dr_ zg+;-@;~bVI#wH00S}jZ9XTb@6!UkD)$J{kLBB4I+OyPOw=h;bMy|zOGpLgAURZ6X) zhOwR~t(VdJp86v7rQ`{KLI)= z0QMVvz$PM1aH;L|NojZWT=#gFM6VX>LU#=uALL(QMZFdeV?eCt%~kVNwNdc9XUhd+ z(RJJU%Tst^2jEubsmR8pM#$lEySn8Y1E#cf!KEUpm>|4nprG0w96a!Qp;mO>hyFqS z0h(*%*2`owbeH!k3Qh_UiG=zZJKJV zJ*pPA2d|7*^{N#K{33LdsDvU>@?4l{crY{kCm*W$THiEG2lTZ_=$Q4Hl0xy62ADf-s z_vxDz(zbOCo=n*fx2JAQm!g$0g)_!FARJm-BuohD|Kxa=iSWRKH&}?}XW&=O!cw(a zo4zRDgLn$(_c+>^9<&~&$=q>N^16b;@wP{a&)wcu|L+(zM(3N z{Ho%vRWbg7UxHoyoIdQjY>vHiFv%^C*g&(q$n0?`@pb!?k1Wrh85`GY&QvqV74^ok zC%zhV8k^*|D{Q?N>PvdP?(IAa?)N;GKK7zKLm+#9w@MvRwK>D}IJoocW zTQRQ<{*lCyPwIZNeVf;cn0Tp=3J#=Z1U# zDBJw+$vj`rL*mgh^5o;L(pkemK0ig77mW+y-XwIW17;ty-xt{)qWMR?O^hd4*CJUE zVD~!U^h>7{EF4>kIC%B&8}uI1eaVf{lyLhU`mz%XV>l9#6z@p4JCSsI5fBxpRhRTT z%%s=m_qiL{r1!q3b=1q+5%Jx{lgNA4`$M;t_U=|!yW!qGQ-9AvZRCWW7UqkTiFkgZ zLaMk;8hdpqW9fPHMAqH@$3ZTn&u%xfuI|lUZ00e3Ap7rd4OC*t;#NPaX_5WeViyHi zWOqbGw&+=;3HcAur>V7@axPA`V(MVGK1m_S|58IQ>bH~{Cc`}LH(D%|Em>I^OpUU7 z_C`J3k|wd{Rz)aLd?Buut7!xtp=;5$PiJIno4qs2QWR`I`Q~CT@0;T)l>t`-d>%DL zM6GzmHRk=>TjtO>O)d^?A4LrCVb>)DQT=?|VHWGG_3WP3n3$pmkc6!@TjSd)n7LAoEu%N&We)XH(L( z`AY;t=jUoaZAfjjK3tylY7qd~&EGd)Q&ALOe)MA?=1W_*q%(fv6He?{=VaHF!A|xJZGP=Zov`U4i^=%8Oik5@8uS>?L3iCPo)8#^CryZ6vMDRsZz58O^=0OrrIp*6*9LIT`N0^@HBIJhFsKrxq}fVp#= z^j#$Xxs_^!OWJxXROdka?9Zum0n{@uwZ%G;Hju9W5||X6MdEXFYSJ`?`>cn z1zt)QW0w`h9b}-fIk;OK{+a+{bnHL1Y!LB3P8{>2g>&ya!9Ms6ynyf1Pc?!_lw_Gq zy?tKKPl-SO{^#QxOMb??l$AJjVD`l+FP8VHR05kRIG?>c@?8c|UYhmQymw^mbbe5yE%sr!NASbL@D*Hp4|QkA$7XEXx{CfMQ2GG8e-& ze>RCdY)M=J$SLNjxs{KNed3O0#-+RP*|pjT2zKJtDp4^55{36=YzFFW9M@@Ge3ffB zp!tYUNZEF$8`Q0e!R~`FwU%oYLxkrmFE=S7hz+9u?vu0@{S5OY2_m)z7Zs79?h zfAL1k=|2F*?u!MX{(FS#2l0m8eXHDxK#iNDUf!RK>Cs18Z#e-vwv=GGn*{e6ndDjF z=fh?l)qR_#KBcU)Mw@Io>Q<|OHowk23*5MujE3dJ=G8gfH(-{J3n|7*P!-8+GXK#x zGxDSA?-UUVJ^rLVqW5<`VM@Ebz9c+<)AT74bo=)Ts>J3OSDBI0g3jV1zcSd(S? zGhBa-)|=NbW(9?~Q?mwgLvA!{SRfzZPO$Dx=MOG^Rad@#*#MzxIilGfhMYCgVFKS= zZ)j|+=M7$q7{HY{7QUJC=1(e+#)PLbsDj*-#y$VJl*E6kU@i0vNMX-YiW$l@cZNFc zL{T5F1V_GGBa}M$KOOJXGyi=M{DR&mXvk`OF$*&5A09Gy9Bgf1WwO-xi<9(nT z(1D?kcI30xA<`B60jDerpojfhqX=Q9dc6Kgb`_s37&jTxSCooo2fpXx?Q z{09IBxZlhdI(av!GE4u{J5xB@&RvmrKvhn8dk+2#g>lPQjHk`h|6YPoD<4kg6XTXy zlqz>X8%mxUP`0``F>_P1Q+?ivHwOWomh~SI+0rc-beMn45U_u1u6yQ+IRie$_Y*NZ z&Q-cqQZVs<0%V>sRgoo+;AXFq{*1xl*;kn|;7Waovfo3Tp-|jd)j=F3e^NVH@Z*yI z&x2{}yQ6^yLN@7%*-(BuKt!*i7Z6UO8rAiS+BJ(p3yJwq3t#cbY_P0tG}w8gl(8Jp zncAQutlk6&LI~+!hMn^UDpgj=w!$P08{fN`HBr2=pb2u(klLPs@>O>Y`ZuAO)+Z9bNQ4aubmU=umydl#&m z&kIe|gDPRH+J{PqE-7)Jwq?EME3%*HcXHWoF%K4RU<6X{o>%0}%Nqv#E|$%6SRl7b zf?qs9^9L^o(l2#MXx*Kb9Jf~Bm3Im;P3AKb#O^Z5(N!96w=^GAVJ~kQk@*ucFg|{# z$i3kHyCev+a}J4|wg^}O?in7TzhJLdyf)*_8?U7h#E~-NK`AL)0 zR#cKiYSq4{%+Sqfj@oA`IVRbJV|Yfj2OKq6L#pEPg3SXIWx|KnkP+jB>AUKOAkOeT ze>AvwsfZS8#cClH#BA@(HAPyff)s4(yaBJwFntvKFexedcbEjAHP)X0M#>?rU?BHi zk4t|9sdGfnLc* ziLyRj-@XWR!IE&fxZ7Hc@5etnsTj5l(`eNZ)#6nA2UDs&?>9X3*$^rN2ue1;C1yYH z?;fRsl*$($v>^Z-#NHfA$ajBfvM_E)m`a z96zg;t%-j%B+HLWRRJgvnewz(ae4W&cH5pGQ}-lYvKs?UpLenu9SX-IHCSB1oeA%} z6E#Wla`SIfo>9|=ZU~iPoLy{NY(_zfuv1@2v$;qko~gzsEjr99m(UHm5KpcJ8$Az5 ze-~f&gV*dyFuqt|{6ot!%{kUaVyjE|c<;>H+EJHnIEWOY63YVQroASuS5EDrbm0$9uEp zrRo9Iu2Jn#E$efJC9aZ?uo+JRetUU|WdYGv&UA1Kpvosf(VRtK!iCWHGKP(i#F-B+ z2456h&4gS2v_@OxxIu%szn{GCy76hbGl`3{7}vkG2A#M*r#+*`NliC|zMD7AO}g5i z7KM`iQN*3wHY{T;jdsg4YFvuVO7*U&8exsq&V;vr zE{UIwfkJM%F+nJZ(&J7IIJc%3={|}+nFZG+jgm}N2k6ko zbN0+6f3wH)gG3%iX|>u(RmYfP8n2?%CWKo``nNI{``;P*IP`~1xxFQQmM`t7md_Nf zaHZ2@zMlv-Xo~b`2m86!m7uTv_KCMWgPui9W$`gGW1IRxz*)MjB*`kRlVTLBH?DdVWQi30j_MRRAf-IX7=Aowuez@@j2Yr{G#hR zopQ3O>HA^GPtFopbJqjJUlHd35XSTsu&?>;Wsj&&Uh15lXv0(*XY(Kt3&TO#Qqc2~I1hdyLz zaN_2?~^DBZZHN0s?0`loSqCFUxo3XxS1z&^Y>8epE3t0qeYv{t*)ffGiP@) zg9XSvY~?$go&j~@b~0476IXAU0Dya|XvI|R&6cXt6}$5*H+nl*12ojE0>OX1BW@9& zW1Lt5FnX*Cd2B-i8^8N2$1WL;R}5M$ma1s&o*03S{6}0E^;ff3k`o@24v2$(ij(le zi@tAFmU{2?Ywp;J*w2zFRWVvNO3JcPLgV9*rrJ|lEjn96p^GI3oOZ~!%tzz6&K0oj zJ_ft8dt-UDC|Iro{&@Qxs=?kDFsHrO{|mVjfqqVl01_JZ2TDIQn%c*6Hi?w|(E)Gn ztun7vaqlluGNrZ7Kj~BZ&F1XYa+8n>SgJ8w;7>mAZ@UWNFK^~)Cyw;{u826=xaxPW zav~|b0OH!&37=_lKzb~LE`l~o~*CGyyDBGge{YzZU9L22R?OK!zg8inGcz4BAPYGS&}Y9%S8 z&w-Lc+||!#n;DI`P0qI!QV#vQT30u|FxOXPlX&HN@3q(cgD|Qf5jRn@XeCdA-L8HI zt>se{zZ3OkiB|`LFbi2)%(48R>pp0D%lCN2>m+7As}zBpH^fOTM<135p3kk{|9Vv- zZdVn%D*vcMJYF0wW*;n$D5DyX2H)@XD@AL`Uuynp2vW-|N3ELh-^5hnz46xs%4d+M zJQ%G!jLp_!mC)fU@-q+=2orwe3XQ`n$*91#Me3LDdujb8aUw-_kKSsQhWdUbw(%KO z8&xO1qBcz~#HvtJ@cw7>&1WXeiw4}iiSDLi$_I?MW2d;iLsjQ<{HBk1Kb_wQmtj%t z^8H*Xq~d<`u?mWDcH$$bt@uoQK9pvVz4JrrD zJ^f`4PgQUIaK|a{#nD(*11U1+grc(!ab3QrG`o?Yo)Aw>a{dp{wiAOr|GEBr3BPOy z7wfE$bKbAyF4F5)U+t70%mE<%x(pzok{7zS`UgLKq2YLDqA~r-mw|7#_I+f0Uqs^_@wZya%i27dwpWA}P8e5=_M?BOy?I>v_hM-v>sEEP5lXv9rccMiZ;)}7 zYoD1FHJ3*R{Oyw*W}b%-nHUnY9S}^KsnOSt^v@h1Va;?92cSd9zO?ydK!zt0D=eFL z_AK@(vD$bk=M421cy%k#gyxrp=2iTjba+4uT96E&HDunv;5IR2e2?nps@CpHy_;kr z`z==)&VY!QjHZ>Af<38MIL3zMsepV9msj&fav1I>q@L!)4-Bm4?5YI_%A+3Z_1H1Y zZ{|V1yeO*w0eTy7s);n#-)5!j7#V|RTzKrdz0A^oW#W!u3$Ql|typcvG@YJ^eg+`Y z#*CO5|GnxA%NWjlG`}zac~@>`CA$Za>U9I;aAgvF{X$n!QH03r)oOPPrHD+o11Ysy z*vl88t+eVdCD2H!-;;%utv})Y;@yVo2D9co|AhYZ=67<-Hfi77BqRj8NJ)fmK1xh) zJ%i{;18h49Zb9%NDgs0Q&Q>()4P_!>gm^>FWkbtnw>{q`XoWC>vq}dkSbcln>BFv# ze8LXc0P@s29abA>pY}8x*7DjpKOGCZg2KwP{*B4M3VgaH@-a5PU+NJMy!ppiN5D&9 zPgi4XhnoJp=o==TKICCV6IT9q;D$gB^}CmHw@R~GeC7fYZ#NDs1YbY>rr?uZqn(1G zN}?1zOhj3i*7?zu&brJWsLyA$p&Yrz8xY@Lk=+;Z4h=0Q$4hV3v-Foem_ON4V6VZ9 za1ntIE1GTasy{nDmr^#NwPm%l#P|is6_}XZzFHd52%s}Y2dC&q?I?qz`g{nr^w`@a z-EjTdE9GvZr%{tsM9swue>?jJx>qc+&fP^K6v?V^fSxD5Qy#eWW12*^OVFw>e#C~( zXD_JZnwlS2di6eK=*2~0PEUs3EuGU*DyNv2AQG!qtQ}_$inSup$B$2f7Z&;s31oJT z*b46fJYf~ysUKn4PB>FS^@^(CBh^_9HYsG3#@uqn z1A1p)BFWN7!P=05Hmhj|NLAE2Fo2?c4S;XflrDsPYP#i&DwyTsAjx1NPxq~iUoYWI zjVyDl^P0Y7mm2-72gq^T&dHk?^o`sr9|=i=zU+JcEoVi1RefV8k|PD5PfV)~#R=$3 zC7IHILBw|#^)M#@u7^4HpsLHCt8b0Z-uFF+!ow;)XUALZ`b1S*`N4~YQW0VUpLwQlnEH^FxkufnquAdySN1FZ2k4hp#d-?$x>8 zx*z%Lrll#8?|NM@@c#fvLASoNk&l^IZ?Ws!P6oQThEW++NWfJnS~VFesyAei5pmFr zoMblQ4_TvVde*L@J4;)ew%QfVye3E&C5R)A8G!CF!5|EC@BaV|zh_?__}9dC+HIDN zbramq5g}MwMnKMfT#=HyNFB+>PZ=Zn*Z%;5dw$J#p9TIMTUhF<7XJWHlw90LysE*w z1$T~&%Gt@_XFYMp*nb&54(T5gejn=o9q~1tjpR2_%?-p*fpn26f88>Is=>CEVhF;J zK-@V$#fR-b@G-sw{9o5}vKre@7t&2;;~rb95yt~L0ha`I>40!+;eA?3V!D<&jM2){ zy1efrg~;!*TRF=N(cx7?dCu7ac^NqXgC=85bW?wTIIY5C<3ER0y87Gc;pH{N9 zc-B~mh^musJ}^%1eo{s`D~>WSK+hPgOQ;~Wh`S%N!lQQki5f+fvJ1$)2n3YRQRq(s zz6SW^t3@35YT@LCotYz*_e!}tNn92iwyswrJe=T+*W>>H?H8{?@f7VA)Yu zmBCySnx8w$jkw4wvwxVWl6X>a(>?K$GJ4{^^3XgfJr&XJYNO^T}N2 z9-Q&bEy!!cHfZVXYC zK^P|>mH?a{007mgVut7}k}2{QGEt;(2>YxgTycZR`S}}Hj->iO!d*R|$DSLpx4pT5 zUFvX_%%x*SjoZu0i~<3Xk0AZ_#t$|7)9|lG9vSg|g*B_oJXZoZ!D$Kz$Sc3(!6R@3 zgPvbJF zLjiyW2dEVQx`mVw%ove5WDB2^la(YBxqwgr>63xQLB1`F@or}GLGsG9kjB3#UfJNc zaDR(6&Ulkf#=qd3)Su09@h?D`%zJ>jSJo^e2OsQ!Nj&k~X1>*;iu1pU?(z5o#19%g zj)K*Mae!o#7nb=|&lx=ic;}k=DK^}1D!)Dn#6%Rq0k8?i0O{1{8RD49Y_3vfWQ-lC zg@FaPF9m+-JPe+^espeJAz~v0umq4-1gQSRz70xYKlGdz_R4WG0H~{t=v6I~XBl%+ZhjSzAT9e44S>utUOi1e@?r)or zI!D>Us$6+eyl0RD^Ul$Q#t&dQ&+%jWNBx>SEj5G*EzzAK zTOjtkkC_^01cIc2o`<$E*BsYHru;ea7mEHUn`3IXnrubvCB3z#f@BEn8PqJQqZtJIeca>JNHZOFrI|o)@E?lVG272e9 zBiGv_`FH)XCh;%Ce~)^loEP%n%WmIip3GhF_x>wHLE%1Guj&s!Wj+Of1`!swc)-Te?TUj^mnH}6J?L&{39CLw=0PJ`jzh(R*;rXmIm@MTh zz8i3^GnmOE83cP|XO0I<)|7fCkp%B>(L?r`Mkd~H03+`YTydSaJpTX3s1-?UA&rNoxH;zw~|F5o=O5C^6@ zXO27d>T{2lzCZYr;IE0iGpbKx_A7l(_TEU5W7#Covo0_(gU>61q;NPKXZf-Ct*1w0 zz zh7Vkhx#QgIEp&;rYl}vaJm*s%-9%iF0nT&IInH{V=OZ=H>3SxVnl;Q@pi+oqVB1yM zlRn2hu;ZSC9Wh=3;)@7{&B~)FX^sgb2*@}i2dK``l5jZVps!N+4W=fSsa)ROCh)o3 z7D2oWfC$e69B?@#cCTdd@P}2>^(dbcViH*$@?m3+gy0+kxBv|C(+0mj{6V4{Jy2Py zN__Go5^fE-Ll3;55106M<3BL~43c{tKf*sJ@3*5fg=w24mhNB2bMVv0+?hIW@ z;a7kLN1biGQJ2c{fgmWz7|u52gOTn?uZ8sw3)%~vC1XY= z;_$xEc9+_?13Zv(kGe6wpSoKogM;%P zhP|)gK972u5ZnSu_?>egN# zx7O^n{{R)iqHB*hc5OD*;Fd`q-2uYLL?L5#%4e#8z>k3ZMd178yPr~?(s=B3t53FR zw+gKkH}REL-Z&s0Gqrfa5svlp-P2picYK!8#dNS-yewdqCs?G2gCe<6jmSe}a6uV7 zgPvPl@jj8^>xgXc=b3Kqa`8bF4qcUB%Oq}4tCFk&w$gBMf<|W2yhWtzmr_~j_a� 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 z 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

    kJ?Cr9@>bV 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 + + + + + + + + + + + + + + For tests only + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/javah/input/org/example/Foo.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/javah/input/org/example/Foo.java new file mode 100644 index 00000000..59d03f70 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/javah/input/org/example/Foo.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.example; + +public class Foo { + + public Foo() {} + + public native String bar(Object baz); + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml new file mode 100644 index 00000000..8418226b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/1nvalid-classname.jsp b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/1nvalid-classname.jsp new file mode 100644 index 00000000..f5b42e2b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/1nvalid-classname.jsp @@ -0,0 +1,25 @@ + +<%@ page language="java" %> + + + + +my name is <%= this.getClass().getName() %> + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/WEB-INF/web.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/WEB-INF/web.xml new file mode 100644 index 00000000..2ef199d0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/default.jsp b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/default.jsp new file mode 100644 index 00000000..c7296b2c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/default.jsp @@ -0,0 +1,25 @@ + +<%@ page language="java" %> + + + + +It is now <%= System.currentTimeMillis() %> + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/missing_tld.jsp b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/missing_tld.jsp new file mode 100644 index 00000000..b837fb1f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/missing_tld.jsp @@ -0,0 +1,32 @@ + +<%@ page language="java" %> +<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %> +<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %> +<%@ taglib uri="/WEB-INF/tlds/struts-template.tld" prefix="template" %> + + +shouldnt compile + + + + +This page should not compile because refers to TLDs that arent around. + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/simple.jsp b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/simple.jsp new file mode 100644 index 00000000..c7296b2c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/simple.jsp @@ -0,0 +1,25 @@ + +<%@ page language="java" %> + + + + +It is now <%= System.currentTimeMillis() %> + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/uriroot.jsp b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/uriroot.jsp new file mode 100644 index 00000000..c7296b2c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/uriroot.jsp @@ -0,0 +1,25 @@ + +<%@ page language="java" %> + + + + +It is now <%= System.currentTimeMillis() %> + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/xml.jsp b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/xml.jsp new file mode 100644 index 00000000..7bb9e49c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jsp/xml.jsp @@ -0,0 +1,32 @@ + + + + + + + + +System.currentTimeMillis() + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jspc.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jspc.xml new file mode 100644 index 00000000..f1207908 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/jspc.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit.xml new file mode 100644 index 00000000..cc66e20e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + import junit.framework.*; + public class A extends TestCase { + public A(String s) { super(s); } + public void test01() { System.out.println("A.test01"); } + public void test02() { System.out.println("A.test02"); fail(); } + public void test03() { System.out.println("A.test03"); fail(); } + } + + + import junit.framework.*; + public class B extends TestCase { + public B(String s) { super(s); } + public void test04() { System.out.println("B.test04"); fail(); } + public void test05() { System.out.println("B.test05"); } + public void test06() { System.out.println("B.test06"); } + } + + + import junit.framework.*; + public class C extends TestCase { + public C(String s) { super(s); } + public void test07() { System.out.println("C.test07"); } + public void test08() { System.out.println("C.test08"); } + public void test09() { System.out.println("C.test09"); } + } + + + package org; + import junit.framework.*; + public class D extends TestCase { + public D(String s) { super(s); } + public void test10() { System.out.println("D.test10"); fail(); } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + import junit.framework.*; + public class A extends TestCase { + public A(String s) { super(s); } + public void test01() { System.out.println("A.test01"); } + public void test02() { System.out.println("A.test02"); } + public void test03() { System.out.println("A.test03"); } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + public class T1 extends + junit.framework.TestCase { + public void testOK() {} + public void testBad() {throw new RuntimeException("failed");} + } + + import org.junit.Test; + public class T2 { + @Test + public void ok() {} + @Test + public void bad() { + throw new RuntimeException("failed");} + } + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/cdataoutput.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/cdataoutput.xml new file mode 100644 index 00000000..ab5409b3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/cdataoutput.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/matches.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/matches.xml new file mode 100644 index 00000000..2451cf89 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/matches.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/teardownlistener.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/teardownlistener.xml new file mode 100644 index 00000000..abb6a410 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junit/teardownlistener.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-frames.xsl new file mode 100644 index 00000000..3c0d85aa --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-frames.xsl @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unit Test Results. key1=<xsl:value-of select="$key1"/>,key2=<xsl:value-of select="$key2"/> + + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} + + + + + + + + + + All Failures + + + All Errors + + + All Tests + + + + + Unit Test Results: <xsl:value-of select="$title"/> + + + + + + open('allclasses-frame.html','classListFrame') + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + . + + + Unit Test Results: <xsl:value-of select="$class.name"/> + + + + + + + + +

    Class

    + + + + + +
    + + + +

    Failures

    +
    + +

    Errors

    +
    + +

    Tests

    +
    +
    + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
    +

    + + <none> +

    +
    + +

    Classes

    + + + + + + + +
    + +
    + + +
    + + + + + + + All Unit Test Classes + + + + + +

    Classes

    + + + + +
    + + +
    + + + + + + + + + / + _.html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

    Home

    +

    Packages

    + + + + +
    + + +
    + + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

    Summary

    + + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + +
    TestsFailuresErrorsSuccess rateTime
    + + + + + + + +
    + + + + +
    + Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
    + +

    Packages

    + + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + +
    + + <none> + + + + +
    + + +
    + + + + + + + + + + + + open('package-frame.html','classListFrame') + +

    Package

    + + + + + +

    Classes

    +

    + + + + + +
    +

    +
    + + +
    + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

    Unit Test Results

    + + + + + +
    Designed for use with JUnit and Ant.
    +
    +
    + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + + Class + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + + + + + + + + + + + + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-import.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-import.xsl new file mode 100644 index 00000000..ecba47bb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport-with-include/junit-import.xsl @@ -0,0 +1,24 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport.xml new file mode 100644 index 00000000..60806625 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/INCOMPLETE-sampleproject.incomplete.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/INCOMPLETE-sampleproject.incomplete.xml new file mode 100644 index 00000000..56af0146 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/INCOMPLETE-sampleproject.incomplete.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/NAMESPACE-sampleproject.namespace.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/NAMESPACE-sampleproject.namespace.xml new file mode 100644 index 00000000..41e7dbff --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/NAMESPACE-sampleproject.namespace.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + junit.framework.AssertionFailedError: DOEG + at sampleproject.coins.CoinTest.testFail(CoinTest.java:229) + + + + java.lang.RuntimeException: RTE + at sampleproject.coins.CoinTest.testException(CoinTest.java:234) + + + + + +testGetImageURL +testGetCountry +testGetDenomination +testGetYear +testGetSubType +testFail +testException +testSuccess +]]> + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.coins.CoinTest.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.coins.CoinTest.xml new file mode 100644 index 00000000..6bc99f29 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.coins.CoinTest.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + junit.framework.AssertionFailedError: DOEG + at sampleproject.coins.CoinTest.testFail(CoinTest.java:229) + + + + java.lang.RuntimeException: RTE + at sampleproject.coins.CoinTest.testException(CoinTest.java:234) + + + + + +testGetImageURL +testGetCountry +testGetDenomination +testGetYear +testGetSubType +testFail +testException +testSuccess +]]> + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.util.UniqueStringTest.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.util.UniqueStringTest.xml new file mode 100644 index 00000000..f4016c26 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/TEST-sampleproject.util.UniqueStringTest.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/WRONGELEMENT-sampleproject.wrongelement.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/WRONGELEMENT-sampleproject.wrongelement.xml new file mode 100644 index 00000000..9cb5a147 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/WRONGELEMENT-sampleproject.wrongelement.xml @@ -0,0 +1,18 @@ + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/ZEROBYTES-sampleproject.package.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/ZEROBYTES-sampleproject.package.xml new file mode 100644 index 00000000..e69de29b diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl new file mode 100644 index 00000000..ca313af9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unit Test Results. key1=<xsl:value-of select="$key1"/>,key2=<xsl:value-of select="$key2"/> + + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} + + + + + + + + + + All Failures + + + All Errors + + + All Tests + + + + + Unit Test Results: <xsl:value-of select="$title"/> + + + + + + open('allclasses-frame.html','classListFrame') + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    + + + + + + + . + + + Unit Test Results: <xsl:value-of select="$class.name"/> + + + + + + + + +

    Class

    + + + + + +
    + + + +

    Failures

    +
    + +

    Errors

    +
    + +

    Tests

    +
    +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + +
    + + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
    +

    + + <none> +

    +
    + +

    Classes

    + + + + + + + +
    + +
    + + +
    + + + + + + + All Unit Test Classes + + + + + +

    Classes

    + + + + +
    + + +
    + + + + + + + + + / + _.html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

    Home

    +

    Packages

    + + + + +
    + + +
    + + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

    Summary

    + + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + +
    TestsFailuresErrorsSuccess rateTime
    + + + + + + + +
    + + + + +
    + Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
    + +

    Packages

    + + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + +
    + + <none> + + + + +
    + + +
    + + + + + + + + + + + + open('package-frame.html','classListFrame') + +

    Package

    + + + + + +

    Classes

    +

    + + + + + +
    +

    +
    + + +
    + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

    Unit Test Results

    + + + + + +
    Designed for use with JUnit and Ant.
    +
    +
    + + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + + + Class + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + + + + + + + + + + + + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/build.xml new file mode 100644 index 00000000..27b40313 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/build.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + For tests only + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/expected/iso8859-1.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/expected/iso8859-1.test new file mode 100644 index 00000000..d60acc83 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/expected/iso8859-1.test @@ -0,0 +1 @@ +\u00e4\u00f6\u00fc\u00c4\u00d6\u00dc\u00df diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/input/iso8859-1.test b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/input/iso8859-1.test new file mode 100644 index 00000000..d5b3934f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/native2ascii/input/iso8859-1.test @@ -0,0 +1 @@ +äöüÄÖÜß \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/net/ftp.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/net/ftp.xml new file mode 100644 index 00000000..aaf4b8e6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/net/ftp.xml @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/propertyfile.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/propertyfile.xml new file mode 100644 index 00000000..20a17271 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/propertyfile.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + This file is for testing purposes only... + @see PropertyFileTest.java for more info. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo=3 + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/pvcs.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/pvcs.xml new file mode 100644 index 00000000..99bfcff4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/pvcs.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.properties new file mode 100644 index 00000000..d7f057e6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.properties @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +OldAbc=Def + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.xml new file mode 100644 index 00000000..58fdc59c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + This build file should only be run from within the testcase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world! + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.properties new file mode 100644 index 00000000..ada77277 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.properties @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +OldAbc=Def \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.result.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.result.properties new file mode 100644 index 00000000..6393cd7a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/replaceregexp2.result.properties @@ -0,0 +1,15 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +NewProp=AbcDef \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/schemavalidate.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/schemavalidate.xml new file mode 100644 index 00000000..f43201e7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/schemavalidate.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script.xml new file mode 100644 index 00000000..841f70d2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script.xml @@ -0,0 +1,46 @@ + + + + + + This build-file is intended to be run from the test cases + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script/scriptdef.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script/scriptdef.xml new file mode 100644 index 00000000..0d051eae --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script/scriptdef.xml @@ -0,0 +1,145 @@ + + + + + + This build-file is intended to be run from the test cases + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script_reference.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script_reference.xml new file mode 100644 index 00000000..82ccb1ff --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/script_reference.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/sos/sos.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/sos/sos.xml new file mode 100644 index 00000000..982b47ca --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/sos/sos.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/splash-test.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/splash-test.xml new file mode 100644 index 00000000..5b5bbe28 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/splash-test.xml @@ -0,0 +1,45 @@ + + + + + + Old behaviour + + + + + + + + + + New features + + + Progress: 10% + + Progress: 20% + + Progress: 50% + + Progress: 70% + + Progress: 100% + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/unix/symlink.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/unix/symlink.xml new file mode 100644 index 00000000..f039a622 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/unix/symlink.xml @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/vss/vss.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/vss/vss.xml new file mode 100644 index 00000000..7c6c0d39 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/vss/vss.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl new file mode 100644 index 00000000..b9d07949 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xalan-redirect-in.xsl @@ -0,0 +1,37 @@ + + + + + + + + + This should be written to the file + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/about.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/about.xml new file mode 100644 index 00000000..f6a9dab5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/about.xml @@ -0,0 +1,26 @@ + + + + +
    + in the absence of technology, there is only marketing +
    +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/apache.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/apache.xsl new file mode 100644 index 00000000..120addf8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/apache.xsl @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/books.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/books.xml new file mode 100644 index 00000000..17923d7d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/books.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/catalog b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/catalog new file mode 100644 index 00000000..1c9bddf2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/catalog @@ -0,0 +1,2 @@ +PUBLIC "-//stevo//DTD doc 1.0//EN" "doc.dtd" + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc-in-ns.xsd b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc-in-ns.xsd new file mode 100644 index 00000000..b34147c4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc-in-ns.xsd @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.dtd b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.dtd new file mode 100644 index 00000000..51629d58 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.dtd @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsd b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsd new file mode 100644 index 00000000..eeedbcaf --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsd @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsl new file mode 100644 index 00000000..3d9c2a4e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/doc.xsl @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/docwithentity.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/docwithentity.xml new file mode 100644 index 00000000..6435c328 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/docwithentity.xml @@ -0,0 +1,29 @@ + + + +]> + + &globaldefinitions; + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema-invalid.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema-invalid.xml new file mode 100644 index 00000000..ec580854 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema-invalid.xml @@ -0,0 +1,30 @@ + + + + + +
    + With a little luck, the network will pick me up. + This is Ripley - last survivor of The Nostromo - signing off. +
    + + + +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema.xml new file mode 100644 index 00000000..7ae559d9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-noSchema.xml @@ -0,0 +1,28 @@ + + + + + +
    + With a little luck, the network will pick me up. + This is Ripley - last survivor of The Nostromo - signing off. +
    + +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-ns-no-location.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-ns-no-location.xml new file mode 100644 index 00000000..3fe93c7c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece-ns-no-location.xml @@ -0,0 +1,23 @@ + + + +
    + With a little luck, the network will pick me up. + This is Ripley - last survivor of The Nostromo - signing off. +
    +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece.xml new file mode 100644 index 00000000..3fe93c7c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece.xml @@ -0,0 +1,23 @@ + + + +
    + With a little luck, the network will pick me up. + This is Ripley - last survivor of The Nostromo - signing off. +
    +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece2.xml new file mode 100644 index 00000000..eec49f6f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/endpiece2.xml @@ -0,0 +1,26 @@ + + + +
    + With a little luck, the network will pick me up. + This is Ripley - last survivor of The Nostromo - signing off. + +
    +
    diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/entity.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/entity.xml new file mode 100644 index 00000000..a9340e56 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/entity.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/iso-2022-jp.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/iso-2022-jp.xml new file mode 100644 index 00000000..b325e6da --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/iso-2022-jp.xml @@ -0,0 +1,23 @@ + + + +]> + +ISO-2022-JP $B$N%U%!%$%k!#(B + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl new file mode 100644 index 00000000..9c1ffad7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl new file mode 100644 index 00000000..b1feaca8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xml new file mode 100644 index 00000000..7f2abe00 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xml @@ -0,0 +1,25 @@ + + + + this is the first line + not indented + + indented + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xsl new file mode 100644 index 00000000..8d28eb3f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/test.xsl @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/utf-8.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/utf-8.xml new file mode 100644 index 00000000..db442a36 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/utf-8.xml @@ -0,0 +1,23 @@ + + + +]> + +Liberté, égalité, fraternité! + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/validate.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/validate.xml new file mode 100644 index 00000000..cade722a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xml/validate.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xmlvalidate.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xmlvalidate.xml new file mode 100644 index 00000000..cd7cc45e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xmlvalidate.xml @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xslt.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xslt.xml new file mode 100644 index 00000000..d872ea8c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xslt.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml new file mode 100644 index 00000000..80d93369 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xml @@ -0,0 +1,20 @@ + + + + éàèïù + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl new file mode 100644 index 00000000..f19bf820 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-encoding-in.xsl @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml new file mode 100644 index 00000000..a4b0247b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xml @@ -0,0 +1,23 @@ + + + +]> + + &include; + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl new file mode 100644 index 00000000..852d38af --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-in.xsl @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml new file mode 100644 index 00000000..aebef339 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xml @@ -0,0 +1,19 @@ + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl new file mode 100644 index 00000000..986f1b3e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/optional/xsltliaison-include.xsl @@ -0,0 +1,20 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/parallel.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/parallel.xml new file mode 100644 index 00000000..9a3434c1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/parallel.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + |1/ + + + + + + + + + + + + + + + + + + |2/ + + + + + + + + + + + + + + + + + + |3/ + + + + + + + + + + + + + + + + + + |4/ + + + + + + + + + + + + + + + + + + |4/ + + + + + + + + + + + + + + + + + + | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test build file for the <parallel> task. + Use the various targets to run the tests. + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/pathconvert.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/pathconvert.xml new file mode 100644 index 00000000..1cdcc8cd --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/pathconvert.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/presetdef.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/presetdef.xml new file mode 100644 index 00000000..695747eb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/presetdef.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + Inner Text + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + MyText + + + override text + + + + + + Line 1 + + + + Line 2 + + + + + + + Line 1 + + + + + Line 2 + + + + Line 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property.xml new file mode 100644 index 00000000..87cda8b0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + b is ${b} + + + + <?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> +<properties version="1.0"> + <comment> + Example of property definition according to Suns DTD as + specified in the Java5 docs and http://java.sun.com/dtd/properties.dtd. + </comment> + <entry key="xml.one">ONE</entry> + <entry key="xml.two">TWO</entry> +</properties> + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property1.properties new file mode 100644 index 00000000..ef3ebd30 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property1.properties @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +testprop2=xx +testprop3=${testprop2}yy +testprop4=${testprop1}zz diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property2.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property2.properties new file mode 100644 index 00000000..81253120 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property2.properties @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +testprop1=aa${testprop2}bb +testprop2=cc${testprop1}dd + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property3.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property3.properties new file mode 100644 index 00000000..ac21612f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property3.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +http.port = 80 +http.url = http://localhost:${http.port} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property4.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property4.properties new file mode 100644 index 00000000..65527105 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property4.properties @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +a=${a} +b=${a}/b diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property5.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property5.properties new file mode 100644 index 00000000..e1ebcd37 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/property5.properties @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +a=A +b=${a}/${c}/${a} +c=${a} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder.xml new file mode 100644 index 00000000..1c073118 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest1.result b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest1.result new file mode 100644 index 00000000..0f8013f3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest1.result @@ -0,0 +1 @@ + [echo] some message1 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest2.result b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest2.result new file mode 100644 index 00000000..80550fdd --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest2.result @@ -0,0 +1,2 @@ + [echo] some message1 + [echo] some message2 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest3.result b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest3.result new file mode 100644 index 00000000..e4961774 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest3.result @@ -0,0 +1,2 @@ + [echo] some message1 + [echo] some message3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest4.result b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest4.result new file mode 100644 index 00000000..db6239e0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest4.result @@ -0,0 +1 @@ + [echo] some message3 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest5.result b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest5.result new file mode 100644 index 00000000..7f58ebf8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest5.result @@ -0,0 +1,5 @@ + [echo] some message5 + +test6: + [echo] some message6 + [echo] some message8 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest6.result b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest6.result new file mode 100644 index 00000000..c9ceb0b5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder/rectest6.result @@ -0,0 +1,3 @@ + [echo] some message6 + [echo] some message7 + [echo] some message8 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder2.xml new file mode 100644 index 00000000..e093cf51 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/recorder2.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rename.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rename.xml new file mode 100644 index 00000000..a23a81e1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rename.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace.xml new file mode 100644 index 00000000..a4039e53 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Hello, world! + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/result.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/result.txt new file mode 100644 index 00000000..a74e06ea --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/result.txt @@ -0,0 +1,7 @@ +This is line one +This is line two +This is line three +This is line four +This is line five +This is line six + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/source.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/source.txt new file mode 100644 index 00000000..8d73f317 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/source.txt @@ -0,0 +1,4 @@ +This is line one +This is line two +This is line three +@@@Replace this@@@ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/value.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/value.txt new file mode 100644 index 00000000..c75b5529 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/replace/value.txt @@ -0,0 +1,3 @@ +This is line four +This is line five +This is line six \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/rmic.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/rmic.xml new file mode 100644 index 00000000..757fca51 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/rmic.xml @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Not found : ${build.dir}/@{file} + + + + + + + + + + + Not found : ${dest.dir}/@{file} + + + + + + + + + + + Expected to be missing : ${build.dir}/@{file} + + + + + + + + + + + Expected to be missing : ${dest.dir}/@{file} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/AntTimestamp.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/AntTimestamp.java new file mode 100644 index 00000000..d9ba7854 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/AntTimestamp.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.util.Calendar; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.util.DateUtils; + + +/** + * This class imports a dependency on the Ant runtime classes, + * so tests that classpath setup include them + */ +public class AntTimestamp implements RemoteTimestamp { + + + /** + * return the phase of the moon. + * Note the completely different semantics of the other implementation, + * which goes to show why signature is an inadequate way of verifying + * how well an interface is implemented. + * + * @return + * @throws RemoteException + */ + public long when() throws RemoteException { + Calendar cal=Calendar.getInstance(); + return DateUtils.getPhaseOfMoon(cal); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestamp.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestamp.java new file mode 100644 index 00000000..1834e4a1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestamp.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +import java.rmi.Remote; +import java.rmi.RemoteException; + +/** + * this is the interface we remote + */ +public interface RemoteTimestamp extends Remote { + long when() throws RemoteException ; +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestampImpl.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestampImpl.java new file mode 100644 index 00000000..f361452e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/rmic/src/RemoteTimestampImpl.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +import java.rmi.Remote; +import java.rmi.RemoteException; + +/** + * this is the implementation + */ +public class RemoteTimestampImpl implements RemoteTimestamp { + + public long when() throws RemoteException { + return System.currentTimeMillis(); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/signjar.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/signjar.xml new file mode 100644 index 00000000..38a13592 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/signjar.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This build is for use with Ant's test cases + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/skinconfig.dtd b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/skinconfig.dtd new file mode 100644 index 00000000..ba1b4de6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/skinconfig.dtd @@ -0,0 +1,19 @@ + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sleep.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sleep.xml new file mode 100644 index 00000000..e1613227 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sleep.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/build.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/build.xml new file mode 100644 index 00000000..c91d10f6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/build.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/data.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/data.xml new file mode 100644 index 00000000..21e2397f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/data.xml @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printFilename.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printFilename.xsl new file mode 100644 index 00000000..eb2cbc7d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printFilename.xsl @@ -0,0 +1,38 @@ + + + + + + + + + -not-set- + -not-set- + + + + filename='' + filedir ='' + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printParams.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printParams.xsl new file mode 100644 index 00000000..110e49ce --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/printParams.xsl @@ -0,0 +1,36 @@ + + + + + + +set default value +empty default value +undefined default value + + + +set='' +empty='' +undefined='' + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/testNewerStylesheet.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/testNewerStylesheet.xsl new file mode 100644 index 00000000..dff81209 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/style/testNewerStylesheet.xsl @@ -0,0 +1,28 @@ + + + + + + + +${xsl.value} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant.xml new file mode 100644 index 00000000..7db547a3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/genericsubant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/genericsubant.xml new file mode 100644 index 00000000..c5bfbe2c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/genericsubant.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test1/mysubant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test1/mysubant.xml new file mode 100644 index 00000000..ecc62883 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test1/mysubant.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test2/mysubant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test2/mysubant.xml new file mode 100644 index 00000000..5ee875fe --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/subant/subant-test2/mysubant.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sync.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sync.xml new file mode 100644 index 00000000..d2eb126e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/sync.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + This file must be used from a test case + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/tar.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/tar.xml new file mode 100644 index 00000000..2eda0b54 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/tar.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/taskdef.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/taskdef.xml new file mode 100644 index 00000000..4b0658e4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/taskdef.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In target + + In TaskContainer + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/template.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/template.xml new file mode 100644 index 00000000..9f351c73 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/template.xml @@ -0,0 +1,17 @@ + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test.antlib.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test.antlib.xml new file mode 100644 index 00000000..37ff7f8e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test.antlib.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test2.antlib.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test2.antlib.xml new file mode 100644 index 00000000..9a2509ec --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/test2.antlib.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelant.xml new file mode 100644 index 00000000..e6b466a6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelant.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelantcall.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelantcall.xml new file mode 100644 index 00000000..2ccabe7f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelantcall.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelsubant.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelsubant.xml new file mode 100644 index 00000000..b7a3a351 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/toplevelsubant.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/touch.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/touch.xml new file mode 100644 index 00000000..3b426d90 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/touch.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typeadapter.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typeadapter.xml new file mode 100644 index 00000000..c2aa70e1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typeadapter.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typedef.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typedef.xml new file mode 100644 index 00000000..1c7922b9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/typedef.xml @@ -0,0 +1,84 @@ + + + + + + + This file should only be run via a testcase + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hi + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/untar.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/untar.xml new file mode 100644 index 00000000..04d44b37 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/untar.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/unzip.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/unzip.xml new file mode 100644 index 00000000..ee96ee1f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/unzip.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/uptodate.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/uptodate.xml new file mode 100644 index 00000000..04bb3707 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/uptodate.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/war.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/war.xml new file mode 100644 index 00000000..b000ecf5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/war.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/whichresource.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/whichresource.xml new file mode 100644 index 00000000..352e9c0e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/whichresource.xml @@ -0,0 +1,37 @@ + + + + + Run via testcases only + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlns.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlns.xml new file mode 100644 index 00000000..e6991661 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlns.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty.xml new file mode 100644 index 00000000..a19eb6ce --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-input1.properties new file mode 100644 index 00000000..d60cbab5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-input1.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +properties.root=foo,bar +properties.a.b.c=d +properties.a.b=e +properties.foo.bar=quux,quux1 +properties.foo.quux=bar +properties.tag.value=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-original.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-original.properties new file mode 100644 index 00000000..ce05e187 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-original.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +root-tag.myattr=true +root-tag.inner-tag=Text +root-tag.inner-tag.someattr=val +root-tag.a2.a3.a4=false + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-override.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-override.properties new file mode 100644 index 00000000..33f8611a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-collapse-override.properties @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# Match value hardwired in code, NOT in the input... +override.property.test=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-input1.properties new file mode 100644 index 00000000..153ac765 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-input1.properties @@ -0,0 +1,8 @@ +properties.root=foo,bar +properties.a.b(c)=d +properties.a.b=e +properties.foo(bar)=quux +properties.foo.bar=quux1 +properties.foo.quux=bar +properties.tag(value)=foo + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-original.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-original.properties new file mode 100644 index 00000000..47e0c2de --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-nocollapse-original.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +root-tag(myattr)=true +root-tag.inner-tag=Text +root-tag.inner-tag(someattr)=val +root-tag.a2.a3.a4=false + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-include.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-include.properties new file mode 100644 index 00000000..d60cbab5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-include.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +properties.root=foo,bar +properties.a.b.c=d +properties.a.b=e +properties.foo.bar=quux,quux1 +properties.foo.quux=bar +properties.tag.value=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-input1.properties new file mode 100644 index 00000000..46b807ba --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-input1.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +properties.root=foo,bar +properties.a.b.c=d +properties.a.b=e +properties.foo.bar=quux,quux1 +properties.foo.quux=bar +properties.tag=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-override.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-override.properties new file mode 100644 index 00000000..33f8611a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/keeproot-semantic-override.properties @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# Match value hardwired in code, NOT in the input... +override.property.test=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-input1.properties new file mode 100644 index 00000000..7cfd29e8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-input1.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +root=foo,bar +a.b.c=d +a.b=e +foo.bar=quux,quux1 +foo.quux=bar +tag.value=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-original.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-original.properties new file mode 100644 index 00000000..5842c38f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-collapse-original.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +inner-tag=Text +inner-tag.someattr=val +a2.a3.a4=false + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-input1.properties new file mode 100644 index 00000000..3eca3683 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-input1.properties @@ -0,0 +1,7 @@ +root=foo,bar +a.b(c)=d +a.b=e +foo(bar)=quux +foo.bar=quux1 +foo.quux=bar +tag(value)=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-multi.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-multi.properties new file mode 100644 index 00000000..9ef90efb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-multi.properties @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +foo.bar=1,2,3,4 \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-original.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-original.properties new file mode 100644 index 00000000..550f2130 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-nocollapse-original.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +inner-tag=Text +inner-tag(someattr)=val +a2.a3.a4=false + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-include-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-include-input1.properties new file mode 100644 index 00000000..7cfd29e8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-include-input1.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +root=foo,bar +a.b.c=d +a.b=e +foo.bar=quux,quux1 +foo.quux=bar +tag.value=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-input1.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-input1.properties new file mode 100644 index 00000000..5dfcfb53 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-input1.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +root=foo,bar +a.b.c=d +a.b=e +foo.bar=quux,quux1 +foo.quux=bar +tag=foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-locations.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-locations.properties new file mode 100644 index 00000000..f945d7ca --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-locations.properties @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +file=FILE.foo \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-paths.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-paths.properties new file mode 100644 index 00000000..1bf51de9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-paths.properties @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +foo=ID.path \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-references.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-references.properties new file mode 100644 index 00000000..e55913a1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/goldfiles/nokeeproot-semantic-references.properties @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +property=foo +foo.bar=foo +foo.quux=foo +foo.thunk=foo +foo.property=ID.foo diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/input1.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/input1.xml new file mode 100644 index 00000000..28328c56 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/input1.xml @@ -0,0 +1,27 @@ + + + + foo + bar + e + + quux1 + bar + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/locations.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/locations.xml new file mode 100644 index 00000000..d5cace80 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/locations.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/multi.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/multi.xml new file mode 100644 index 00000000..66904d6a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/multi.xml @@ -0,0 +1,25 @@ + + + + + 1 + 2 + 3 + 4 + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/original.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/original.xml new file mode 100644 index 00000000..ef2603cc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/original.xml @@ -0,0 +1,22 @@ + + + + Text + false + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/override.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/override.xml new file mode 100644 index 00000000..c7da9c48 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/override.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/paths.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/paths.xml new file mode 100644 index 00000000..83422d9d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/paths.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/references.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/references.xml new file mode 100644 index 00000000..7e88b7b1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty/inputs/references.xml @@ -0,0 +1,24 @@ + + + + + + + ${property} + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.dtd b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.dtd new file mode 100644 index 00000000..5d75d6e5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.dtd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.xml new file mode 100644 index 00000000..5f922214 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_data.xml @@ -0,0 +1,22 @@ + + + + Text + false + ]]> + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_needscat.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_needscat.xml new file mode 100644 index 00000000..942a183f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_needscat.xml @@ -0,0 +1,22 @@ + + + + + true + false + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_withdtd.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_withdtd.xml new file mode 100644 index 00000000..1e96cdb3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/xmlproperty_withdtd.xml @@ -0,0 +1,24 @@ + + + + + + Text + false + ]]> + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip.xml new file mode 100644 index 00000000..4fa6de6c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip.xml @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip/zipgroupfileset1.zip b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/taskdefs/zip/zipgroupfileset1.zip new file mode 100644 index 0000000000000000000000000000000000000000..f3b96ffc7e98366c146e138e17c20612bfc10c9c GIT binary patch literal 2211 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 literal 0 HcmV?d00001 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/addtype.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/addtype.xml new file mode 100644 index 00000000..cc8ff24c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/addtype.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + This is line 1 + This is line 2 + This is line 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + before + + after + + + + before + + after + + + + + + + + + + + + + + + + + Value Set + + + + + + Value Set + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions.xml new file mode 100644 index 00000000..dee7ce7c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionMain.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionMain.java new file mode 100644 index 00000000..f4aa6906 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionMain.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + + +/** + * this is an assertion tester + * It has a main() entry + */ +public class AssertionMain { + + public static void main(String args[]) { + assert true == false : "there exist no facts that are both true and false"; + System.out.println("Assertions are disabled"); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionTest.java b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionTest.java new file mode 100644 index 00000000..19ed2df1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/assertions/AssertionTest.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + + import junit.framework.TestCase; + +/** + * this is an assertion tester for junit + */ +public class AssertionTest extends TestCase { + + public AssertionTest(String name) { + super(name); + } + + public void testAssertRaised() { + try { + assert true == false; + fail("expected an assertion"); + } catch(AssertionError asserto) { + //if we got here, all was well + } + } + + + public void testAssertNotRaised() { + assert(2+2==4); + } + + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description1.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description1.xml new file mode 100644 index 00000000..86a2a165 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description1.xml @@ -0,0 +1,22 @@ + + + + Test Project Description + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description2.xml new file mode 100644 index 00000000..945bc20d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description2.xml @@ -0,0 +1,23 @@ + + + + Multi Line +Project Description + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description3.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description3.xml new file mode 100644 index 00000000..af5dda11 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description3.xml @@ -0,0 +1,23 @@ + + + + Multi Instance + Project Description + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description4.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description4.xml new file mode 100644 index 00000000..22df9c2d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/description4.xml @@ -0,0 +1,23 @@ + + + + Multi Instance + + Nested Project Description + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filelist.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filelist.xml new file mode 100644 index 00000000..f854ddbb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filelist.xml @@ -0,0 +1,54 @@ + + + + + + + + + ${property} + + + + + + + + ${property} + + + + + + + + + + + ${property} + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterset.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterset.xml new file mode 100644 index 00000000..bf291e7d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterset.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterseta.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterseta.txt new file mode 100644 index 00000000..44049950 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filterseta.txt @@ -0,0 +1,2 @@ +This is a test file for filters @aaaa@ +It has two lines @bbbb@ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetb.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetb.txt new file mode 100644 index 00000000..f49640a3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetb.txt @@ -0,0 +1,5 @@ +This is a test file for filters with non default markers +@cccc@ - should not change +%cccc^ - should change +^dddd% - should not change +%dddd^ - should change diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetc.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetc.txt new file mode 100644 index 00000000..2522d350 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetc.txt @@ -0,0 +1,7 @@ +Combined filter test +@aaaa@ - should change +@bbbb@ - should change +@cccc@ - should not change +%cccc^ - should change +^dddd% - should not change +%dddd^ - should change diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetd.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetd.txt new file mode 100644 index 00000000..45c4849e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersetd.txt @@ -0,0 +1 @@ +@foo@ @bar@ @baz@ @blah@ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile1 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile1 new file mode 100644 index 00000000..20fe058f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile1 @@ -0,0 +1,2 @@ +foo=FOO +bar=BAR diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile2 b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile2 new file mode 100644 index 00000000..43c97f27 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/filtersfile2 @@ -0,0 +1 @@ +baz=BAZ diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/flexinteger.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/flexinteger.xml new file mode 100644 index 00000000..aa10aa07 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/flexinteger.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset1.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset1.txt new file mode 100644 index 00000000..975416f5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset1.txt @@ -0,0 +1,2 @@ +This is a test file for filters 1111 +It has two lines 2222 diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset2.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset2.txt new file mode 100644 index 00000000..eaab0215 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset2.txt @@ -0,0 +1,5 @@ +This is a test file for filters with non default markers +@cccc@ - should not change +3333 - should change +^dddd% - should not change +4444 - should change diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset3.txt b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset3.txt new file mode 100644 index 00000000..3516e62b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/gold/filterset3.txt @@ -0,0 +1,7 @@ +Combined filter test +1111 - should change +2222 - should change +@cccc@ - should not change +3333 - should change +^dddd% - should not change +4444 - should change diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mapper.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mapper.xml new file mode 100644 index 00000000..a96f10cb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/define.mapperresult.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/define.mapperresult.xml new file mode 100644 index 00000000..d9152a1c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/define.mapperresult.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/globmapper.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/globmapper.xml new file mode 100644 index 00000000..1666d810 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/globmapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/regexpmapper.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/regexpmapper.xml new file mode 100644 index 00000000..a85c49cf --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/regexpmapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/scriptmapper.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/scriptmapper.xml new file mode 100644 index 00000000..d3e7a8d0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/mappers/scriptmapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + self.addMappedName("a"); + + + + + + + + self.addMappedName("a"); + self.clear(); + + + + + + + + self.addMappedName("a"); + self.addMappedName("b"); + + + + + + + + //relying on "a" to map to "A" on all locales. + self.addMappedName(source.toUpperCase()); + self.addMappedName(source.toLowerCase()); + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/poly.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/poly.xml new file mode 100644 index 00000000..cabf9ece --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/poly.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote1.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote1.xml new file mode 100644 index 00000000..8e77122c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote1.xml @@ -0,0 +1,25 @@ + + + + + + + A stitch in time saves nine + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote2.xml new file mode 100644 index 00000000..ef9a3c3e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/quote2.xml @@ -0,0 +1,26 @@ + + + + + + + No news is good news + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/redirector.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/redirector.xml new file mode 100644 index 00000000..4784e9f0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/redirector.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + testLogInputString can-cat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/javaresource.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/javaresource.xml new file mode 100644 index 00000000..83267623 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/javaresource.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/resourcelist.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/resourcelist.xml new file mode 100644 index 00000000..f1ac6df7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/resourcelist.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/tarentry.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/tarentry.xml new file mode 100644 index 00000000..c0fa379c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/resources/tarentry.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + only use from within unit tests + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors.xml new file mode 100644 index 00000000..5a80d04a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors.xml @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/scriptselector.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/scriptselector.xml new file mode 100644 index 00000000..80afe309 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/scriptselector.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + self.setSelected(true); + + + + + + + + + + + + + + + + + + + + self.setSelected(false); + self.setSelected(true); + + + + + + + + + + self.setSelected(false); + + + + + + + + + + self.setSelected(file.equals(self.getFile())); + + + + + + + + + + self.setSelected(filename.equals(self.getFilename())); + + + + + + + + + + self.setSelected(basedir.equals(self.getBasedir())); + + + + + + + + + + self.setSelected((filename.length%2)==0); + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/signedselector.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/signedselector.xml new file mode 100644 index 00000000..60fe9408 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/selectors/signedselector.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xml new file mode 100644 index 00000000..63269f77 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xml @@ -0,0 +1,150 @@ + + + + + + + + This is to test XMLCatalog for external entity resolution from the + xslt task, both the simple case and using the document() function + to refer to a second file (which refers to the entity). This + buildfile is called by + org.apache.tools.ant.types.XMLCatalogBuildFileTest.java + Alternatively, you may try it out by hand by first removing the + comment symbols around the echo statements and then calling + ant -buildfile xmlcatalog.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xsl b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xsl new file mode 100644 index 00000000..a2c839ca --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog.xsl @@ -0,0 +1,47 @@ + + + + + + + + + + value + + + + + : + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog1.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog1.xml new file mode 100644 index 00000000..d4b5461f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog1.xml @@ -0,0 +1,30 @@ + + + +]> + + + + + + "e; + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog2.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog2.xml new file mode 100644 index 00000000..9d2bed03 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlcatalog2.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlfragment.xml b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlfragment.xml new file mode 100644 index 00000000..75214d64 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/types/xmlfragment.xml @@ -0,0 +1,31 @@ + + + + + + foo + + + foo + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/simple.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/simple.properties new file mode 100644 index 00000000..550908ca --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/simple.properties @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# a comment +prop.alpha=first property + +! more comment +prop.beta=simple + +# now a line wrapping one +prop.gamma=This is a long comment which \ + contains a line wrap. diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/unusual.properties b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/unusual.properties new file mode 100644 index 00000000..9c370faa --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/testcases/util/unusual.properties @@ -0,0 +1,37 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +\ prop\ one\ =\ \ leading and trailing spaces + +prop\ttwo=contains\ttab + +prop\nthree=contains\nnewline + +prop\rfour=contains\rcarraige return + +prop\ffive=contains\fform feed + +prop\\six=contains\\backslash + +prop\:seven=contains\:colon + +prop\=eight=contains\=equals + +prop\#nine=contains\#hash + +prop\!ten=contains\!exclamation + +alpha:set with a colon +beta set with a space diff --git a/framework/src/ant/apache-ant-1.9.6/src/etc/yearcheck.sh b/framework/src/ant/apache-ant-1.9.6/src/etc/yearcheck.sh new file mode 100644 index 00000000..1a510ffd --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/etc/yearcheck.sh @@ -0,0 +1,101 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# Simple shell script that checks whether changed files contain a copyright +# statement for a given year. +# +# Rename (or symlink) this script to the year you want to check, i.e. name it +# 2002 if you want to check for copyright statements that do not contain +# the year 2002. +# +# Use this script instead of your usual cvs update command. +# +# Usage YEAR [precommit] +# +# If the optional all argument has been omitted, the proposal directory will +# be skipped. +# + +if [ -n "$TMP" ]; then + TEMP_DIR="$TMP" +else + if [ -n "$TEMP" ]; then + TEMP_DIR="$TEMP" + else + TEMP_DIR=/tmp + fi +fi + +YEAR=`basename $0` + +if [ $YEAR = yearcheck.sh ]; then + YEAR=`date -R | cut -d ' ' -f 4` +fi + +precommit_call=false +for arg in "$@" ; do + if [ "$arg" = "precommit" ] ; then + precommit_call=true + fi +done + +if [ -d ".svn" ]; then + SCM_COMMAND=svn + if $precommit_call ; then + SCM_ARGS=status + CUT_ARGS="-c 8-" + else + SCM_ARGS=up + CUT_ARGS="-c 4-" + fi +else + SCM_COMMAND=cvs + SCM_ARGS="-z3 update -dP" + CUT_ARGS="-d ' ' -f 2" +fi + +"$SCM_COMMAND" $SCM_ARGS > "$TEMP_DIR"/update-prefilter + +# filter out boring lines +if [ "$SCM_COMMAND" = "svn" ]; then + < "$TEMP_DIR"/update-prefilter fgrep -v 'At revision' | fgrep -v 'Updated to revision' | egrep -v '^\?' > "$TEMP_DIR"/update +else + cp "$TEMP_DIR"/update-prefilter "$TEMP_DIR"/update +fi + +cut $CUT_ARGS < "$TEMP_DIR"/update > "$TEMP_DIR"/changed-files + +echo "Changed:" +echo "========" +cat "$TEMP_DIR"/changed-files +echo + +xargs fgrep -L Copyright < "$TEMP_DIR"/changed-files > "$TEMP_DIR"/no-copyright + +echo "No Copyright line" +echo "=================" +cat "$TEMP_DIR"/no-copyright +echo + +xargs egrep -L "Copyright.*$YEAR" < "$TEMP_DIR"/changed-files | cut -f 1 -d : > "$TEMP_DIR"/no-$YEAR + +echo "No Copyright line for year $YEAR" +echo "================================" +cat "$TEMP_DIR"/no-$YEAR + +rm "$TEMP_DIR"/no-$YEAR "$TEMP_DIR"/no-copyright "$TEMP_DIR"/changed-files "$TEMP_DIR"/update "$TEMP_DIR"/update-prefilter diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntClassLoader.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntClassLoader.java new file mode 100644 index 00000000..607ada71 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntClassLoader.java @@ -0,0 +1,1622 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.CodeSource; +import java.security.ProtectionDomain; +import java.security.cert.Certificate; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.StringTokenizer; +import java.util.Vector; +import java.util.jar.Attributes; +import java.util.jar.Attributes.Name; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.Manifest; + +import org.apache.tools.ant.launch.Locator; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.util.CollectionUtils; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.util.LoaderUtils; +import org.apache.tools.ant.util.ReflectUtil; +import org.apache.tools.ant.util.VectorSet; +import org.apache.tools.zip.ZipLong; + +/** + * Used to load classes within ant with a different classpath from + * that used to start ant. Note that it is possible to force a class + * into this loader even when that class is on the system classpath by + * using the forceLoadClass method. Any subsequent classes loaded by that + * class will then use this loader rather than the system class loader. + * + *

    + * Note that this classloader has a feature to allow loading + * in reverse order and for "isolation". + * Due to the fact that a number of + * methods in java.lang.ClassLoader are final (at least + * in java 1.4 getResources) this means that the + * class has to fake the given parent. + *

    + * + */ +public class AntClassLoader extends ClassLoader implements SubBuildListener { + + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** + * An enumeration of all resources of a given name found within the + * classpath of this class loader. This enumeration is used by the + * ClassLoader.findResources method, which is in + * turn used by the ClassLoader.getResources method. + * + * @see AntClassLoader#findResources(String) + * @see java.lang.ClassLoader#getResources(String) + */ + private class ResourceEnumeration implements Enumeration { + /** + * The name of the resource being searched for. + */ + private final String resourceName; + + /** + * The index of the next classpath element to search. + */ + private int pathElementsIndex; + + /** + * The URL of the next resource to return in the enumeration. If this + * field is null then the enumeration has been completed, + * i.e., there are no more elements to return. + */ + private URL nextResource; + + /** + * Constructs a new enumeration of resources of the given name found + * within this class loader's classpath. + * + * @param name the name of the resource to search for. + */ + ResourceEnumeration(final String name) { + this.resourceName = name; + this.pathElementsIndex = 0; + findNextResource(); + } + + /** + * Indicates whether there are more elements in the enumeration to + * return. + * + * @return true if there are more elements in the + * enumeration; false otherwise. + */ + public boolean hasMoreElements() { + return (this.nextResource != null); + } + + /** + * Returns the next resource in the enumeration. + * + * @return the next resource in the enumeration + */ + public URL nextElement() { + final URL ret = this.nextResource; + if (ret == null) { + throw new NoSuchElementException(); + } + findNextResource(); + return ret; + } + + /** + * Locates the next resource of the correct name in the classpath and + * sets nextResource to the URL of that resource. If no + * more resources can be found, nextResource is set to + * null. + */ + private void findNextResource() { + URL url = null; + while ((pathElementsIndex < pathComponents.size()) && (url == null)) { + try { + final File pathComponent = pathComponents.elementAt(pathElementsIndex); + url = getResourceURL(pathComponent, this.resourceName); + pathElementsIndex++; + } catch (final BuildException e) { + // ignore path elements which are not valid relative to the + // project + } + } + this.nextResource = url; + } + } + + /** + * The size of buffers to be used in this classloader. + */ + private static final int BUFFER_SIZE = 8192; + + /** + * Number of array elements in a test array of strings + */ + private static final int NUMBER_OF_STRINGS = 256; + + /** + * The components of the classpath that the classloader searches + * for classes. + */ + private final Vector pathComponents = new VectorSet(); + + /** + * The project to which this class loader belongs. + */ + private Project project; + + /** + * Indicates whether the parent class loader should be + * consulted before trying to load with this class loader. + */ + private boolean parentFirst = true; + + /** + * These are the package roots that are to be loaded by the parent class + * loader regardless of whether the parent class loader is being searched + * first or not. + */ + private final Vector systemPackages = new Vector(); + + /** + * These are the package roots that are to be loaded by this class loader + * regardless of whether the parent class loader is being searched first + * or not. + */ + private final Vector loaderPackages = new Vector(); + + /** + * Whether or not this classloader will ignore the base + * classloader if it can't find a class. + * + * @see #setIsolated(boolean) + */ + private boolean ignoreBase = false; + + /** + * The parent class loader, if one is given or can be determined. + */ + private ClassLoader parent = null; + + /** + * A hashtable of zip files opened by the classloader (File to JarFile). + */ + private Hashtable jarFiles = new Hashtable(); + + /** Static map of jar file/time to manifest class-path entries */ + private static Map pathMap = + Collections.synchronizedMap(new HashMap()); + + /** + * The context loader saved when setting the thread's current + * context loader. + */ + private ClassLoader savedContextLoader = null; + + /** + * Whether or not the context loader is currently saved. + */ + private boolean isContextLoaderSaved = false; + + /** + * Create an Ant ClassLoader for a given project, with + * a parent classloader and an initial classpath. + * @since Ant 1.7. + * @param parent the parent for this classloader. + * @param project The project to which this classloader is to + * belong. + * @param classpath The classpath to use to load classes. + */ + public AntClassLoader(final ClassLoader parent, final Project project, final Path classpath) { + setParent(parent); + setClassPath(classpath); + setProject(project); + } + + /** + * Create an Ant Class Loader + */ + public AntClassLoader() { + setParent(null); + } + + /** + * Creates a classloader for the given project using the classpath given. + * + * @param project The project to which this classloader is to belong. + * Must not be null. + * @param classpath The classpath to use to load the classes. This + * is combined with the system classpath in a manner + * determined by the value of ${build.sysclasspath}. + * May be null, in which case no path + * elements are set up to start with. + */ + public AntClassLoader(final Project project, final Path classpath) { + setParent(null); + setProject(project); + setClassPath(classpath); + } + + /** + * Creates a classloader for the given project using the classpath given. + * + * @param parent The parent classloader to which unsatisfied loading + * attempts are delegated. May be null, + * in which case the classloader which loaded this + * class is used as the parent. + * @param project The project to which this classloader is to belong. + * Must not be null. + * @param classpath the classpath to use to load the classes. + * May be null, in which case no path + * elements are set up to start with. + * @param parentFirst If true, indicates that the parent + * classloader should be consulted before trying to + * load the a class through this loader. + */ + public AntClassLoader( + final ClassLoader parent, final Project project, final Path classpath, final boolean parentFirst) { + this(project, classpath); + if (parent != null) { + setParent(parent); + } + setParentFirst(parentFirst); + addJavaLibraries(); + } + + /** + * Creates a classloader for the given project using the classpath given. + * + * @param project The project to which this classloader is to belong. + * Must not be null. + * @param classpath The classpath to use to load the classes. May be + * null, in which case no path + * elements are set up to start with. + * @param parentFirst If true, indicates that the parent + * classloader should be consulted before trying to + * load the a class through this loader. + */ + public AntClassLoader(final Project project, final Path classpath, final boolean parentFirst) { + this(null, project, classpath, parentFirst); + } + + /** + * Creates an empty class loader. The classloader should be configured + * with path elements to specify where the loader is to look for + * classes. + * + * @param parent The parent classloader to which unsatisfied loading + * attempts are delegated. May be null, + * in which case the classloader which loaded this + * class is used as the parent. + * @param parentFirst If true, indicates that the parent + * classloader should be consulted before trying to + * load the a class through this loader. + */ + public AntClassLoader(final ClassLoader parent, final boolean parentFirst) { + setParent(parent); + project = null; + this.parentFirst = parentFirst; + } + + /** + * Set the project associated with this class loader + * + * @param project the project instance + */ + public void setProject(final Project project) { + this.project = project; + if (project != null) { + project.addBuildListener(this); + } + } + + /** + * Set the classpath to search for classes to load. This should not be + * changed once the classloader starts to server classes + * + * @param classpath the search classpath consisting of directories and + * jar/zip files. + */ + public void setClassPath(final Path classpath) { + pathComponents.removeAllElements(); + if (classpath != null) { + final Path actualClasspath = classpath.concatSystemClasspath("ignore"); + final String[] pathElements = actualClasspath.list(); + for (int i = 0; i < pathElements.length; ++i) { + try { + addPathElement(pathElements[i]); + } catch (final BuildException e) { + // ignore path elements which are invalid + // relative to the project + } + } + } + } + + /** + * Set the parent for this class loader. This is the class loader to which + * this class loader will delegate to load classes + * + * @param parent the parent class loader. + */ + public void setParent(final ClassLoader parent) { + this.parent = parent == null ? AntClassLoader.class.getClassLoader() : parent; + } + + /** + * Control whether class lookup is delegated to the parent loader first + * or after this loader. Use with extreme caution. Setting this to + * false violates the class loader hierarchy and can lead to Linkage errors + * + * @param parentFirst if true, delegate initial class search to the parent + * classloader. + */ + public void setParentFirst(final boolean parentFirst) { + this.parentFirst = parentFirst; + } + + /** + * Logs a message through the project object if one has been provided. + * + * @param message The message to log. + * Should not be null. + * + * @param priority The logging priority of the message. + */ + protected void log(final String message, final int priority) { + if (project != null) { + project.log(message, priority); + } + } + + /** + * Sets the current thread's context loader to this classloader, storing + * the current loader value for later resetting. + */ + public void setThreadContextLoader() { + if (isContextLoaderSaved) { + throw new BuildException("Context loader has not been reset"); + } + if (LoaderUtils.isContextLoaderAvailable()) { + savedContextLoader = LoaderUtils.getContextClassLoader(); + ClassLoader loader = this; + if (project != null && "only".equals(project.getProperty("build.sysclasspath"))) { + loader = this.getClass().getClassLoader(); + } + LoaderUtils.setContextClassLoader(loader); + isContextLoaderSaved = true; + } + } + + /** + * Resets the current thread's context loader to its original value. + */ + public void resetThreadContextLoader() { + if (LoaderUtils.isContextLoaderAvailable() && isContextLoaderSaved) { + LoaderUtils.setContextClassLoader(savedContextLoader); + savedContextLoader = null; + isContextLoaderSaved = false; + } + } + + + /** + * Adds an element to the classpath to be searched. + * + * @param pathElement The path element to add. Must not be + * null. + * + * @exception BuildException if the given path element cannot be resolved + * against the project. + */ + public void addPathElement(final String pathElement) throws BuildException { + final File pathComponent = project != null ? project.resolveFile(pathElement) : new File( + pathElement); + try { + addPathFile(pathComponent); + } catch (final IOException e) { + throw new BuildException(e); + } + } + + /** + * Add a path component. + * This simply adds the file, unlike addPathElement + * it does not open jar files and load files from + * their CLASSPATH entry in the manifest file. + * @param file the jar file or directory to add. + */ + public void addPathComponent(final File file) { + if (pathComponents.contains(file)) { + return; + } + pathComponents.addElement(file); + } + + /** + * Add a file to the path. + * Reads the manifest, if available, and adds any additional class path jars + * specified in the manifest. + * + * @param pathComponent the file which is to be added to the path for + * this class loader + * + * @throws IOException if data needed from the file cannot be read. + */ + protected void addPathFile(final File pathComponent) throws IOException { + if (!pathComponents.contains(pathComponent)) { + pathComponents.addElement(pathComponent); + } + if (pathComponent.isDirectory()) { + return; + } + + final String absPathPlusTimeAndLength = pathComponent.getAbsolutePath() + + pathComponent.lastModified() + "-" + pathComponent.length(); + String classpath = pathMap.get(absPathPlusTimeAndLength); + if (classpath == null) { + JarFile jarFile = null; + try { + jarFile = new JarFile(pathComponent); + final Manifest manifest = jarFile.getManifest(); + if (manifest == null) { + return; + } + classpath = manifest.getMainAttributes() + .getValue(Attributes.Name.CLASS_PATH); + } finally { + if (jarFile != null) { + jarFile.close(); + } + } + if (classpath == null) { + classpath = ""; + } + pathMap.put(absPathPlusTimeAndLength, classpath); + } + + if (!"".equals(classpath)) { + final URL baseURL = FILE_UTILS.getFileURL(pathComponent); + final StringTokenizer st = new StringTokenizer(classpath); + while (st.hasMoreTokens()) { + final String classpathElement = st.nextToken(); + final URL libraryURL = new URL(baseURL, classpathElement); + if (!libraryURL.getProtocol().equals("file")) { + log("Skipping jar library " + classpathElement + + " since only relative URLs are supported by this" + " loader", + Project.MSG_VERBOSE); + continue; + } + final String decodedPath = Locator.decodeUri(libraryURL.getFile()); + final File libraryFile = new File(decodedPath); + if (libraryFile.exists() && !isInPath(libraryFile)) { + addPathFile(libraryFile); + } + } + } + } + + /** + * Returns the classpath this classloader will consult. + * + * @return the classpath used for this classloader, with elements + * separated by the path separator for the system. + */ + public String getClasspath() { + final StringBuilder sb = new StringBuilder(); + boolean firstPass = true; + final Enumeration componentEnum = pathComponents.elements(); + while (componentEnum.hasMoreElements()) { + if (!firstPass) { + sb.append(System.getProperty("path.separator")); + } else { + firstPass = false; + } + sb.append(componentEnum.nextElement().getAbsolutePath()); + } + return sb.toString(); + } + + /** + * Sets whether this classloader should run in isolated mode. In + * isolated mode, classes not found on the given classpath will + * not be referred to the parent class loader but will cause a + * ClassNotFoundException. + * + * @param isolated Whether or not this classloader should run in + * isolated mode. + */ + public synchronized void setIsolated(final boolean isolated) { + ignoreBase = isolated; + } + + /** + * Forces initialization of a class in a JDK 1.1 compatible, albeit hacky + * way. + * + * @param theClass The class to initialize. + * Must not be null. + * + * @deprecated since 1.6.x. + * Use Class.forName with initialize=true instead. + */ + @Deprecated + public static void initializeClass(final Class theClass) { + // ***HACK*** We ask the VM to create an instance + // by voluntarily providing illegal arguments to force + // the VM to run the class' static initializer, while + // at the same time not running a valid constructor. + + final Constructor[] cons = theClass.getDeclaredConstructors(); + //At least one constructor is guaranteed to be there, but check anyway. + if (cons != null) { + if (cons.length > 0 && cons[0] != null) { + final String[] strs = new String[NUMBER_OF_STRINGS]; + try { + cons[0].newInstance((Object[]) strs); + // Expecting an exception to be thrown by this call: + // IllegalArgumentException: wrong number of Arguments + } catch (final Exception e) { + // Ignore - we are interested only in the side + // effect - that of getting the static initializers + // invoked. As we do not want to call a valid + // constructor to get this side effect, an + // attempt is made to call a hopefully + // invalid constructor - come on, nobody + // would have a constructor that takes in + // 256 String arguments ;-) + // (In fact, they can't - according to JVM spec + // section 4.10, the number of method parameters is limited + // to 255 by the definition of a method descriptor. + // Constructors count as methods here.) + } + } + } + } + + /** + * Adds a package root to the list of packages which must be loaded on the + * parent loader. + * + * All subpackages are also included. + * + * @param packageRoot The root of all packages to be included. + * Should not be null. + */ + public void addSystemPackageRoot(final String packageRoot) { + systemPackages.addElement(packageRoot + (packageRoot.endsWith(".") ? "" : ".")); + } + + /** + * Adds a package root to the list of packages which must be loaded using + * this loader. + * + * All subpackages are also included. + * + * @param packageRoot The root of all packages to be included. + * Should not be null. + */ + public void addLoaderPackageRoot(final String packageRoot) { + loaderPackages.addElement(packageRoot + (packageRoot.endsWith(".") ? "" : ".")); + } + + /** + * Loads a class through this class loader even if that class is available + * on the parent classpath. + * + * This ensures that any classes which are loaded by the returned class + * will use this classloader. + * + * @param classname The name of the class to be loaded. + * Must not be null. + * + * @return the required Class object + * + * @exception ClassNotFoundException if the requested class does not exist + * on this loader's classpath. + */ + public Class forceLoadClass(final String classname) throws ClassNotFoundException { + log("force loading " + classname, Project.MSG_DEBUG); + + Class theClass = findLoadedClass(classname); + + if (theClass == null) { + theClass = findClass(classname); + } + return theClass; + } + + /** + * Loads a class through this class loader but defer to the parent class + * loader. + * + * This ensures that instances of the returned class will be compatible + * with instances which have already been loaded on the parent + * loader. + * + * @param classname The name of the class to be loaded. + * Must not be null. + * + * @return the required Class object + * + * @exception ClassNotFoundException if the requested class does not exist + * on this loader's classpath. + */ + public Class forceLoadSystemClass(final String classname) throws ClassNotFoundException { + log("force system loading " + classname, Project.MSG_DEBUG); + + Class theClass = findLoadedClass(classname); + + if (theClass == null) { + theClass = findBaseClass(classname); + } + return theClass; + } + + /** + * Returns a stream to read the requested resource name. + * + * @param name The name of the resource for which a stream is required. + * Must not be null. + * + * @return a stream to the required resource or null if the + * resource cannot be found on the loader's classpath. + */ + @Override + public InputStream getResourceAsStream(final String name) { + InputStream resourceStream = null; + if (isParentFirst(name)) { + resourceStream = loadBaseResource(name); + } + if (resourceStream != null) { + log("ResourceStream for " + name + + " loaded from parent loader", Project.MSG_DEBUG); + } else { + resourceStream = loadResource(name); + if (resourceStream != null) { + log("ResourceStream for " + name + + " loaded from ant loader", Project.MSG_DEBUG); + } + } + if (resourceStream == null && !isParentFirst(name)) { + if (ignoreBase) { + resourceStream = getRootLoader() == null + ? null + : getRootLoader().getResourceAsStream(name); + } else { + resourceStream = loadBaseResource(name); + } + if (resourceStream != null) { + log("ResourceStream for " + name + " loaded from parent loader", + Project.MSG_DEBUG); + } + } + if (resourceStream == null) { + log("Couldn't load ResourceStream for " + name, Project.MSG_DEBUG); + } + return resourceStream; + } + + /** + * Returns a stream to read the requested resource name from this loader. + * + * @param name The name of the resource for which a stream is required. + * Must not be null. + * + * @return a stream to the required resource or null if + * the resource cannot be found on the loader's classpath. + */ + private InputStream loadResource(final String name) { + // we need to search the components of the path to see if we can + // find the class we want. + InputStream stream = null; + + final Enumeration e = pathComponents.elements(); + while (e.hasMoreElements() && stream == null) { + final File pathComponent = e.nextElement(); + stream = getResourceStream(pathComponent, name); + } + return stream; + } + + /** + * Finds a system resource (which should be loaded from the parent + * classloader). + * + * @param name The name of the system resource to load. + * Must not be null. + * + * @return a stream to the named resource, or null if + * the resource cannot be found. + */ + private InputStream loadBaseResource(final String name) { + return parent == null ? super.getResourceAsStream(name) : parent.getResourceAsStream(name); + } + + /** + * Returns an inputstream to a given resource in the given file which may + * either be a directory or a zip file. + * + * @param file the file (directory or jar) in which to search for the + * resource. Must not be null. + * @param resourceName The name of the resource for which a stream is + * required. Must not be null. + * + * @return a stream to the required resource or null if + * the resource cannot be found in the given file. + */ + private InputStream getResourceStream(final File file, final String resourceName) { + try { + JarFile jarFile = jarFiles.get(file); + if (jarFile == null && file.isDirectory()) { + final File resource = new File(file, resourceName); + if (resource.exists()) { + return new FileInputStream(resource); + } + } else { + if (jarFile == null) { + if (file.exists()) { + jarFile = new JarFile(file); + jarFiles.put(file, jarFile); + } else { + return null; + } + //to eliminate a race condition, retrieve the entry + //that is in the hash table under that filename + jarFile = jarFiles.get(file); + } + final JarEntry entry = jarFile.getJarEntry(resourceName); + if (entry != null) { + return jarFile.getInputStream(entry); + } + } + } catch (final Exception e) { + log("Ignoring Exception " + e.getClass().getName() + ": " + e.getMessage() + + " reading resource " + resourceName + " from " + file, Project.MSG_VERBOSE); + } + return null; + } + + /** + * Tests whether or not the parent classloader should be checked for a + * resource before this one. If the resource matches both the "use parent + * classloader first" and the "use this classloader first" lists, the latter + * takes priority. + * + * @param resourceName + * The name of the resource to check. Must not be + * null. + * + * @return whether or not the parent classloader should be checked for a + * resource before this one is. + */ + private boolean isParentFirst(final String resourceName) { + // default to the global setting and then see + // if this class belongs to a package which has been + // designated to use a specific loader first + // (this one or the parent one) + + // TODO - shouldn't this always return false in isolated mode? + + boolean useParentFirst = parentFirst; + + for (final Enumeration e = systemPackages.elements(); e.hasMoreElements();) { + final String packageName = e.nextElement(); + if (resourceName.startsWith(packageName)) { + useParentFirst = true; + break; + } + } + for (final Enumeration e = loaderPackages.elements(); e.hasMoreElements();) { + final String packageName = e.nextElement(); + if (resourceName.startsWith(packageName)) { + useParentFirst = false; + break; + } + } + return useParentFirst; + } + + /** + * Used for isolated resource seaching. + * @return the root classloader of AntClassLoader. + */ + private ClassLoader getRootLoader() { + ClassLoader ret = getClass().getClassLoader(); + while (ret != null && ret.getParent() != null) { + ret = ret.getParent(); + } + return ret; + } + + /** + * Finds the resource with the given name. A resource is + * some data (images, audio, text, etc) that can be accessed by class + * code in a way that is independent of the location of the code. + * + * @param name The name of the resource for which a stream is required. + * Must not be null. + * + * @return a URL for reading the resource, or null if the + * resource could not be found or the caller doesn't have + * adequate privileges to get the resource. + */ + @Override + public URL getResource(final String name) { + // we need to search the components of the path to see if + // we can find the class we want. + URL url = null; + if (isParentFirst(name)) { + url = parent == null ? super.getResource(name) : parent.getResource(name); + } + if (url != null) { + log("Resource " + name + " loaded from parent loader", Project.MSG_DEBUG); + } else { + // try and load from this loader if the parent either didn't find + // it or wasn't consulted. + final Enumeration e = pathComponents.elements(); + while (e.hasMoreElements() && url == null) { + final File pathComponent = e.nextElement(); + url = getResourceURL(pathComponent, name); + if (url != null) { + log("Resource " + name + " loaded from ant loader", Project.MSG_DEBUG); + } + } + } + if (url == null && !isParentFirst(name)) { + // this loader was first but it didn't find it - try the parent + if (ignoreBase) { + url = getRootLoader() == null ? null : getRootLoader().getResource(name); + } else { + url = parent == null ? super.getResource(name) : parent.getResource(name); + } + if (url != null) { + log("Resource " + name + " loaded from parent loader", Project.MSG_DEBUG); + } + } + if (url == null) { + log("Couldn't load Resource " + name, Project.MSG_DEBUG); + } + return url; + } + + /** + * Finds all the resources with the given name. A resource is some + * data (images, audio, text, etc) that can be accessed by class + * code in a way that is independent of the location of the code. + * + *

    Would override getResources if that wasn't final in Java + * 1.4.

    + * + * @param name name of the resource + * @return possible URLs as enumeration + * @throws IOException + * @see {@link #findResources(String, boolean)} + * @since Ant 1.8.0 + */ + public Enumeration getNamedResources(final String name) + throws IOException { + return findResources(name, false); + } + + /** + * Returns an enumeration of URLs representing all the resources with the + * given name by searching the class loader's classpath. + * + * @param name The resource name to search for. + * Must not be null. + * @return an enumeration of URLs for the resources + * @exception IOException if I/O errors occurs (can't happen) + */ + @Override + protected Enumeration findResources(final String name) throws IOException { + return findResources(name, true); + } + + /** + * Returns an enumeration of URLs representing all the resources with the + * given name by searching the class loader's classpath. + * + * @param name The resource name to search for. + * Must not be null. + * @param parentHasBeenSearched whether ClassLoader.this.parent + * has been searched - will be true if the method is (indirectly) + * called from ClassLoader.getResources + * @return an enumeration of URLs for the resources + * @exception IOException if I/O errors occurs (can't happen) + */ + protected Enumeration findResources(final String name, + final boolean parentHasBeenSearched) + throws IOException { + final Enumeration mine = new ResourceEnumeration(name); + Enumeration base; + if (parent != null && (!parentHasBeenSearched || parent != getParent())) { + // Delegate to the parent: + base = parent.getResources(name); + // Note: could cause overlaps in case + // ClassLoader.this.parent has matches and + // parentHasBeenSearched is true + } else { + // ClassLoader.this.parent is already delegated to for example from + // ClassLoader.getResources, no need: + base = new CollectionUtils.EmptyEnumeration(); + } + if (isParentFirst(name)) { + // Normal case. + return CollectionUtils.append(base, mine); + } + if (ignoreBase) { + return getRootLoader() == null ? mine : CollectionUtils.append(mine, getRootLoader() + .getResources(name)); + } + // parent last: + return CollectionUtils.append(mine, base); + } + + /** + * Returns the URL of a given resource in the given file which may + * either be a directory or a zip file. + * + * @param file The file (directory or jar) in which to search for + * the resource. Must not be null. + * @param resourceName The name of the resource for which a stream + * is required. Must not be null. + * + * @return a stream to the required resource or null if the + * resource cannot be found in the given file object. + */ + protected URL getResourceURL(final File file, final String resourceName) { + try { + JarFile jarFile = jarFiles.get(file); + if (jarFile == null && file.isDirectory()) { + final File resource = new File(file, resourceName); + + if (resource.exists()) { + try { + return FILE_UTILS.getFileURL(resource); + } catch (final MalformedURLException ex) { + return null; + } + } + } else { + if (jarFile == null) { + if (file.exists()) { + if (!isZip(file)) { + final String msg = "CLASSPATH element " + file + + " is not a JAR."; + log(msg, Project.MSG_WARN); + System.err.println(msg); + return null; + } + jarFile = new JarFile(file); + jarFiles.put(file, jarFile); + } else { + return null; + } + // potential race-condition + jarFile = jarFiles.get(file); + } + final JarEntry entry = jarFile.getJarEntry(resourceName); + if (entry != null) { + try { + return new URL("jar:" + FILE_UTILS.getFileURL(file) + "!/" + entry); + } catch (final MalformedURLException ex) { + return null; + } + } + } + } catch (final Exception e) { + final String msg = "Unable to obtain resource from " + file + ": "; + log(msg + e, Project.MSG_WARN); + System.err.println(msg); + e.printStackTrace(); + } + return null; + } + + /** + * Loads a class with this class loader. + * + * This class attempts to load the class in an order determined by whether + * or not the class matches the system/loader package lists, with the + * loader package list taking priority. If the classloader is in isolated + * mode, failure to load the class in this loader will result in a + * ClassNotFoundException. + * + * @param classname The name of the class to be loaded. + * Must not be null. + * @param resolve true if all classes upon which this class + * depends are to be loaded. + * + * @return the required Class object + * + * @exception ClassNotFoundException if the requested class does not exist + * on the system classpath (when not in isolated mode) or this loader's + * classpath. + */ + @Override + protected synchronized Class loadClass(final String classname, final boolean resolve) + throws ClassNotFoundException { + // 'sync' is needed - otherwise 2 threads can load the same class + // twice, resulting in LinkageError: duplicated class definition. + // findLoadedClass avoids that, but without sync it won't work. + + Class theClass = findLoadedClass(classname); + if (theClass != null) { + return theClass; + } + if (isParentFirst(classname)) { + try { + theClass = findBaseClass(classname); + log("Class " + classname + " loaded from parent loader " + "(parentFirst)", + Project.MSG_DEBUG); + } catch (final ClassNotFoundException cnfe) { + theClass = findClass(classname); + log("Class " + classname + " loaded from ant loader " + "(parentFirst)", + Project.MSG_DEBUG); + } + } else { + try { + theClass = findClass(classname); + log("Class " + classname + " loaded from ant loader", Project.MSG_DEBUG); + } catch (final ClassNotFoundException cnfe) { + if (ignoreBase) { + throw cnfe; + } + theClass = findBaseClass(classname); + log("Class " + classname + " loaded from parent loader", Project.MSG_DEBUG); + } + } + if (resolve) { + resolveClass(theClass); + } + return theClass; + } + + /** + * Converts the class dot notation to a filesystem equivalent for + * searching purposes. + * + * @param classname The class name in dot format (eg java.lang.Integer). + * Must not be null. + * + * @return the classname in filesystem format (eg java/lang/Integer.class) + */ + private String getClassFilename(final String classname) { + return classname.replace('.', '/') + ".class"; + } + + /** + * Define a class given its bytes + * + * @param container the container from which the class data has been read + * may be a directory or a jar/zip file. + * + * @param classData the bytecode data for the class + * @param classname the name of the class + * + * @return the Class instance created from the given data + * + * @throws IOException if the class data cannot be read. + */ + protected Class defineClassFromData(final File container, final byte[] classData, final String classname) + throws IOException { + definePackage(container, classname); + final ProtectionDomain currentPd = Project.class.getProtectionDomain(); + final String classResource = getClassFilename(classname); + final CodeSource src = new CodeSource(FILE_UTILS.getFileURL(container), + getCertificates(container, + classResource)); + final ProtectionDomain classesPd = + new ProtectionDomain(src, currentPd.getPermissions(), + this, + currentPd.getPrincipals()); + return defineClass(classname, classData, 0, classData.length, + classesPd); + } + + /** + * Define the package information associated with a class. + * + * @param container the file containing the class definition. + * @param className the class name of for which the package information + * is to be determined. + * + * @exception IOException if the package information cannot be read from the + * container. + */ + protected void definePackage(final File container, final String className) throws IOException { + final int classIndex = className.lastIndexOf('.'); + if (classIndex == -1) { + return; + } + final String packageName = className.substring(0, classIndex); + if (getPackage(packageName) != null) { + // already defined + return; + } + // define the package now + final Manifest manifest = getJarManifest(container); + + if (manifest == null) { + definePackage(packageName, null, null, null, null, null, null, null); + } else { + definePackage(container, packageName, manifest); + } + } + + /** + * Get the manifest from the given jar, if it is indeed a jar and it has a + * manifest + * + * @param container the File from which a manifest is required. + * + * @return the jar's manifest or null is the container is not a jar or it + * has no manifest. + * + * @exception IOException if the manifest cannot be read. + */ + private Manifest getJarManifest(final File container) throws IOException { + if (container.isDirectory()) { + return null; + } + final JarFile jarFile = jarFiles.get(container); + if (jarFile == null) { + return null; + } + return jarFile.getManifest(); + } + + /** + * Get the certificates for a given jar entry, if it is indeed a jar. + * + * @param container the File from which to read the entry + * @param entry the entry of which the certificates are requested + * + * @return the entry's certificates or null is the container is + * not a jar or it has no certificates. + * + * @exception IOException if the manifest cannot be read. + */ + private Certificate[] getCertificates(final File container, final String entry) + throws IOException { + if (container.isDirectory()) { + return null; + } + final JarFile jarFile = jarFiles.get(container); + if (jarFile == null) { + return null; + } + final JarEntry ent = jarFile.getJarEntry(entry); + return ent == null ? null : ent.getCertificates(); + } + + /** + * Define the package information when the class comes from a + * jar with a manifest + * + * @param container the jar file containing the manifest + * @param packageName the name of the package being defined. + * @param manifest the jar's manifest + */ + protected void definePackage(final File container, final String packageName, final Manifest manifest) { + final String sectionName = packageName.replace('.', '/') + "/"; + + String specificationTitle = null; + String specificationVendor = null; + String specificationVersion = null; + String implementationTitle = null; + String implementationVendor = null; + String implementationVersion = null; + String sealedString = null; + URL sealBase = null; + + final Attributes sectionAttributes = manifest.getAttributes(sectionName); + if (sectionAttributes != null) { + specificationTitle = sectionAttributes.getValue(Name.SPECIFICATION_TITLE); + specificationVendor = sectionAttributes.getValue(Name.SPECIFICATION_VENDOR); + specificationVersion = sectionAttributes.getValue(Name.SPECIFICATION_VERSION); + implementationTitle = sectionAttributes.getValue(Name.IMPLEMENTATION_TITLE); + implementationVendor = sectionAttributes.getValue(Name.IMPLEMENTATION_VENDOR); + implementationVersion = sectionAttributes.getValue(Name.IMPLEMENTATION_VERSION); + sealedString = sectionAttributes.getValue(Name.SEALED); + } + final Attributes mainAttributes = manifest.getMainAttributes(); + if (mainAttributes != null) { + if (specificationTitle == null) { + specificationTitle = mainAttributes.getValue(Name.SPECIFICATION_TITLE); + } + if (specificationVendor == null) { + specificationVendor = mainAttributes.getValue(Name.SPECIFICATION_VENDOR); + } + if (specificationVersion == null) { + specificationVersion = mainAttributes.getValue(Name.SPECIFICATION_VERSION); + } + if (implementationTitle == null) { + implementationTitle = mainAttributes.getValue(Name.IMPLEMENTATION_TITLE); + } + if (implementationVendor == null) { + implementationVendor = mainAttributes.getValue(Name.IMPLEMENTATION_VENDOR); + } + if (implementationVersion == null) { + implementationVersion = mainAttributes.getValue(Name.IMPLEMENTATION_VERSION); + } + if (sealedString == null) { + sealedString = mainAttributes.getValue(Name.SEALED); + } + } + if (sealedString != null && sealedString.equalsIgnoreCase("true")) { + try { + sealBase = new URL(FileUtils.getFileUtils().toURI(container.getAbsolutePath())); + } catch (final MalformedURLException e) { + // ignore + } + } + definePackage(packageName, specificationTitle, specificationVersion, specificationVendor, + implementationTitle, implementationVersion, implementationVendor, sealBase); + } + + /** + * Reads a class definition from a stream. + * + * @param stream The stream from which the class is to be read. + * Must not be null. + * @param classname The name of the class in the stream. + * Must not be null. + * @param container the file or directory containing the class. + * + * @return the Class object read from the stream. + * + * @exception IOException if there is a problem reading the class from the + * stream. + * @exception SecurityException if there is a security problem while + * reading the class from the stream. + */ + private Class getClassFromStream(final InputStream stream, final String classname, final File container) + throws IOException, SecurityException { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int bytesRead = -1; + final byte[] buffer = new byte[BUFFER_SIZE]; + + while ((bytesRead = stream.read(buffer, 0, BUFFER_SIZE)) != -1) { + baos.write(buffer, 0, bytesRead); + } + final byte[] classData = baos.toByteArray(); + return defineClassFromData(container, classData, classname); + } + + /** + * Searches for and load a class on the classpath of this class loader. + * + * @param name The name of the class to be loaded. Must not be + * null. + * + * @return the required Class object + * + * @exception ClassNotFoundException if the requested class does not exist + * on this loader's classpath. + */ + @Override + public Class findClass(final String name) throws ClassNotFoundException { + log("Finding class " + name, Project.MSG_DEBUG); + return findClassInComponents(name); + } + + /** + * Indicate if the given file is in this loader's path + * + * @param component the file which is to be checked + * + * @return true if the file is in the class path + */ + protected boolean isInPath(final File component) { + return pathComponents.contains(component); + } + + /** + * Finds a class on the given classpath. + * + * @param name The name of the class to be loaded. Must not be + * null. + * + * @return the required Class object + * + * @exception ClassNotFoundException if the requested class does not exist + * on this loader's classpath. + */ + private Class findClassInComponents(final String name) + throws ClassNotFoundException { + // we need to search the components of the path to see if + // we can find the class we want. + final String classFilename = getClassFilename(name); + final Enumeration e = pathComponents.elements(); + while (e.hasMoreElements()) { + final File pathComponent = e.nextElement(); + InputStream stream = null; + try { + stream = getResourceStream(pathComponent, classFilename); + if (stream != null) { + log("Loaded from " + pathComponent + " " + + classFilename, Project.MSG_DEBUG); + return getClassFromStream(stream, name, pathComponent); + } + } catch (final SecurityException se) { + throw se; + } catch (final IOException ioe) { + // ioe.printStackTrace(); + log("Exception reading component " + pathComponent + " (reason: " + + ioe.getMessage() + ")", Project.MSG_VERBOSE); + } finally { + FileUtils.close(stream); + } + } + throw new ClassNotFoundException(name); + } + + /** + * Finds a system class (which should be loaded from the same classloader + * as the Ant core). + * + * For JDK 1.1 compatibility, this uses the findSystemClass method if + * no parent classloader has been specified. + * + * @param name The name of the class to be loaded. + * Must not be null. + * + * @return the required Class object + * + * @exception ClassNotFoundException if the requested class does not exist + * on this loader's classpath. + */ + private Class findBaseClass(final String name) throws ClassNotFoundException { + return parent == null ? findSystemClass(name) : parent.loadClass(name); + } + + /** + * Cleans up any resources held by this classloader. Any open archive + * files are closed. + */ + public synchronized void cleanup() { + for (final Enumeration e = jarFiles.elements(); e.hasMoreElements();) { + final JarFile jarFile = e.nextElement(); + try { + jarFile.close(); + } catch (final IOException ioe) { + // ignore + } + } + jarFiles = new Hashtable(); + if (project != null) { + project.removeBuildListener(this); + } + project = null; + } + + /** + * Gets the parent as has been specified in the constructor or via + * setParent. + * + * @return classloader + * @since Ant 1.8.0 + */ + public ClassLoader getConfiguredParent() { + return parent; + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the buildStarted event + */ + public void buildStarted(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * Cleans up any resources held by this classloader at the end + * of a build. + * + * @param event the buildFinished event + */ + public void buildFinished(final BuildEvent event) { + cleanup(); + } + + /** + * Cleans up any resources held by this classloader at the end of + * a subbuild if it has been created for the subbuild's project + * instance. + * + * @param event the buildFinished event + * + * @since Ant 1.6.2 + */ + public void subBuildFinished(final BuildEvent event) { + if (event.getProject() == project) { + cleanup(); + } + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the buildStarted event + * + * @since Ant 1.6.2 + */ + public void subBuildStarted(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the targetStarted event + */ + public void targetStarted(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the targetFinished event + */ + public void targetFinished(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the taskStarted event + */ + public void taskStarted(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the taskFinished event + */ + public void taskFinished(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * Empty implementation to satisfy the BuildListener interface. + * + * @param event the messageLogged event + */ + public void messageLogged(final BuildEvent event) { + // Not significant for the class loader. + } + + /** + * add any libraries that come with different java versions + * here + */ + public void addJavaLibraries() { + final Vector packages = JavaEnvUtils.getJrePackages(); + final Enumeration e = packages.elements(); + while (e.hasMoreElements()) { + final String packageName = e.nextElement(); + addSystemPackageRoot(packageName); + } + } + + /** + * Returns a String representing this loader. + * @return the path that this classloader has. + */ + @Override + public String toString() { + return "AntClassLoader[" + getClasspath() + "]"; + } + + private static Class subClassToLoad = null; + private static final Class[] CONSTRUCTOR_ARGS = new Class[] { + ClassLoader.class, Project.class, Path.class, Boolean.TYPE + }; + + static { + if (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_1_5)) { + try { + subClassToLoad = + Class.forName("org.apache.tools.ant.loader.AntClassLoader5"); + } catch (final ClassNotFoundException e) { + // this is Java5 but the installation is lacking our subclass + } + } + } + + /** + * Factory method + */ + public static AntClassLoader newAntClassLoader(final ClassLoader parent, + final Project project, + final Path path, + final boolean parentFirst) { + if (subClassToLoad != null) { + return (AntClassLoader) + ReflectUtil.newInstance(subClassToLoad, + CONSTRUCTOR_ARGS, + new Object[] { + parent, project, path, + Boolean.valueOf(parentFirst) + }); + } + return new AntClassLoader(parent, project, path, parentFirst); + } + + private static final ZipLong EOCD_SIG = new ZipLong(0X06054B50L); + private static final ZipLong SINGLE_SEGMENT_SPLIT_MARKER = + new ZipLong(0X30304B50L); + + private static boolean isZip(final File file) throws IOException { + final byte[] sig = new byte[4]; + if (readFully(file, sig)) { + final ZipLong start = new ZipLong(sig); + return ZipLong.LFH_SIG.equals(start) // normal file + || EOCD_SIG.equals(start) // empty zip + || ZipLong.DD_SIG.equals(start) // split zip + || SINGLE_SEGMENT_SPLIT_MARKER.equals(start); + } + return false; + } + + private static boolean readFully(final File f, final byte[] b) throws IOException { + final FileInputStream fis = new FileInputStream(f); + try { + final int len = b.length; + int count = 0, x = 0; + while (count != len) { + x = fis.read(b, count, len - count); + if (x == -1) { + break; + } + count += x; + } + return count == len; + } finally { + fis.close(); + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntTypeDefinition.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntTypeDefinition.java new file mode 100644 index 00000000..104820f1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/AntTypeDefinition.java @@ -0,0 +1,389 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + + +/** + * This class contains all the information + * on a particular ant type, + * the classname, adapter and the class + * it should be assignable from. + * This type replaces the task/datatype split + * of pre ant 1.6. + * + */ +public class AntTypeDefinition { + private String name; + private Class clazz; + private Class adapterClass; + private Class adaptToClass; + private String className; + private ClassLoader classLoader; + private boolean restrict = false; + + /** + * Set the restrict attribute. + * @param restrict the value to set. + */ + public void setRestrict(boolean restrict) { + this.restrict = restrict; + } + + /** + * Get the restrict attribute. + * @return the restrict attribute. + */ + public boolean isRestrict() { + return restrict; + } + + /** + * Set the definition's name. + * @param name the name of the definition. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Return the definition's name. + * @return the name of the definition. + */ + public String getName() { + return name; + } + + /** + * Set the class of the definition. + * As a side-effect may set the classloader and classname. + * @param clazz the class of this definition. + */ + public void setClass(Class clazz) { + this.clazz = clazz; + if (clazz == null) { + return; + } + this.classLoader = (classLoader == null) + ? clazz.getClassLoader() : classLoader; + this.className = (className == null) ? clazz.getName() : className; + } + + /** + * Set the classname of the definition. + * @param className the classname of this definition. + */ + public void setClassName(String className) { + this.className = className; + } + + /** + * Get the classname of the definition. + * @return the name of the class of this definition. + */ + public String getClassName() { + return className; + } + + /** + * Set the adapter class for this definition. + * This class is used to adapt the definitions class if + * required. + * @param adapterClass the adapterClass. + */ + public void setAdapterClass(Class adapterClass) { + this.adapterClass = adapterClass; + } + + /** + * Set the assignable class for this definition. + * @param adaptToClass the assignable class. + */ + + public void setAdaptToClass(Class adaptToClass) { + this.adaptToClass = adaptToClass; + } + + /** + * Set the classloader to use to create an instance + * of the definition. + * @param classLoader the ClassLoader. + */ + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + /** + * Get the classloader for this definition. + * @return the classloader for this definition. + */ + public ClassLoader getClassLoader() { + return classLoader; + } + + /** + * Get the exposed class for this + * definition. This will be a proxy class + * (adapted class) if there is an adapter + * class and the definition class is not + * assignable from the assignable class. + * @param project the current project. + * @return the exposed class - may return null if unable to load the class + */ + public Class getExposedClass(Project project) { + if (adaptToClass != null) { + Class z = getTypeClass(project); + if (z == null || adaptToClass.isAssignableFrom(z)) { + return z; + } + } + return (adapterClass == null) ? getTypeClass(project) : adapterClass; + } + + /** + * Get the definition class. + * @param project the current project. + * @return the type of the definition. + */ + public Class getTypeClass(Project project) { + try { + return innerGetTypeClass(); + } catch (NoClassDefFoundError ncdfe) { + project.log("Could not load a dependent class (" + + ncdfe.getMessage() + ") for type " + + name, Project.MSG_DEBUG); + } catch (ClassNotFoundException cnfe) { + project.log("Could not load class (" + className + + ") for type " + name, Project.MSG_DEBUG); + } + return null; + } + + /** + * Try and load a class, with no attempt to catch any fault. + * @return the class that implements this component + * @throws ClassNotFoundException if the class cannot be found. + * @throws NoClassDefFoundError if the there is an error + * finding the class. + */ + public Class innerGetTypeClass() throws ClassNotFoundException { + if (clazz != null) { + return clazz; + } + if (classLoader == null) { + clazz = Class.forName(className); + } else { + clazz = classLoader.loadClass(className); + } + return clazz; + } + + /** + * Create an instance of the definition. + * The instance may be wrapped in a proxy class. + * @param project the current project. + * @return the created object. + */ + public Object create(Project project) { + return icreate(project); + } + + /** + * Create a component object based on + * its definition. + * @return the component as an Object. + */ + private Object icreate(Project project) { + Class c = getTypeClass(project); + if (c == null) { + return null; + } + Object o = createAndSet(project, c); + if (o == null || adapterClass == null) { + return o; + } + if (adaptToClass != null) { + if (adaptToClass.isAssignableFrom(o.getClass())) { + return o; + } + } + TypeAdapter adapterObject = (TypeAdapter) createAndSet( + project, adapterClass); + if (adapterObject == null) { + return null; + } + adapterObject.setProxy(o); + return adapterObject; + } + + /** + * Checks if the attributes are correct. + *
      + *
    • if the class can be created.
    • + *
    • if an adapter class can be created
    • + *
    • if the type is assignable from adapter
    • + *
    • if the type can be used with the adapter class
    • + *
    + * @param project the current project. + */ + public void checkClass(Project project) { + if (clazz == null) { + clazz = getTypeClass(project); + if (clazz == null) { + throw new BuildException( + "Unable to create class for " + getName()); + } + } + // check adapter + if (adapterClass != null && (adaptToClass == null + || !adaptToClass.isAssignableFrom(clazz))) { + TypeAdapter adapter = (TypeAdapter) createAndSet( + project, adapterClass); + if (adapter == null) { + throw new BuildException("Unable to create adapter object"); + } + adapter.checkProxyClass(clazz); + } + } + + /** + * Get the constructor of the definition + * and invoke it. + * @return the instantiated Object. + */ + private Object createAndSet(Project project, Class c) { + try { + Object o = innerCreateAndSet(c, project); + return o; + } catch (InvocationTargetException ex) { + Throwable t = ex.getTargetException(); + throw new BuildException( + "Could not create type " + name + " due to " + t, t); + } catch (NoClassDefFoundError ncdfe) { + String msg = "Type " + name + ": A class needed by class " + + c + " cannot be found: " + ncdfe.getMessage(); + throw new BuildException(msg, ncdfe); + } catch (NoSuchMethodException nsme) { + throw new BuildException("Could not create type " + name + + " as the class " + c + " has no compatible constructor"); + } catch (InstantiationException nsme) { + throw new BuildException("Could not create type " + + name + " as the class " + c + " is abstract"); + } catch (IllegalAccessException e) { + throw new BuildException("Could not create type " + + name + " as the constructor " + c + " is not accessible"); + } catch (Throwable t) { + throw new BuildException( + "Could not create type " + name + " due to " + t, t); + } + } + + /** + * Inner implementation of the {@link #createAndSet(Project, Class)} logic, with no + * exception catching. + * @param return type of the method + * @param newclass class to create + * @param project the project to use + * @return a newly constructed and bound instance. + * @throws NoSuchMethodException no good constructor. + * @throws InstantiationException cannot initialize the object. + * @throws IllegalAccessException cannot access the object. + * @throws InvocationTargetException error in invocation. + */ + public T innerCreateAndSet(Class newclass, Project project) + throws NoSuchMethodException, + InstantiationException, + IllegalAccessException, + InvocationTargetException { + Constructor ctor; + boolean noArg = false; + // DataType can have a "no arg" constructor or take a single + // Project argument. + try { + ctor = newclass.getConstructor(new Class[0]); + noArg = true; + } catch (NoSuchMethodException nse) { + //can throw the same exception, if there is no this(Project) ctor. + ctor = newclass.getConstructor(new Class[] {Project.class}); + noArg = false; + } + //now we instantiate + T o = ctor.newInstance( + ((noArg) ? new Object[0] : new Object[] {project})); + + //set up project references. + project.setProjectReference(o); + return o; + } + + /** + * Equality method for this definition (assumes the names are the same). + * + * @param other another definition. + * @param project the project the definition. + * @return true if the definitions are the same. + */ + public boolean sameDefinition(AntTypeDefinition other, Project project) { + return (other != null && other.getClass() == getClass() + && other.getTypeClass(project).equals(getTypeClass(project)) + && other.getExposedClass(project).equals(getExposedClass(project)) + && other.restrict == restrict + && other.adapterClass == adapterClass + && other.adaptToClass == adaptToClass); + } + + /** + * Similar definition; + * used to compare two definitions defined twice with the same + * name and the same types. + * The classloader may be different but have the same + * path so #sameDefinition cannot + * be used. + * @param other the definition to compare to. + * @param project the current project. + * @return true if the definitions are the same. + */ + public boolean similarDefinition(AntTypeDefinition other, Project project) { + if (other == null + || getClass() != other.getClass() + || !getClassName().equals(other.getClassName()) + || !extractClassname(adapterClass).equals( + extractClassname(other.adapterClass)) + || !extractClassname(adaptToClass).equals( + extractClassname(other.adaptToClass)) + || restrict != other.restrict) { + return false; + } + // all the names are the same: check if the class path of the loader + // is the same + ClassLoader oldLoader = other.getClassLoader(); + ClassLoader newLoader = getClassLoader(); + return oldLoader == newLoader + || (oldLoader instanceof AntClassLoader + && newLoader instanceof AntClassLoader + && ((AntClassLoader) oldLoader).getClasspath() + .equals(((AntClassLoader) newLoader).getClasspath())); + } + + private String extractClassname(Class c) { + return (c == null) ? "" : c.getClass().getName(); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessor.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessor.java new file mode 100644 index 00000000..07812f2f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessor.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.PrintStream; +import java.util.List; + +/** + * Processor of arguments of the command line. + *

    + * Arguments supported by third party code should not conflict with Ant core + * ones. It is then recommended to chose specific 'enough' argument name, + * avoiding for instance one letter arguments. By the way, if there any + * conflict, Ant will take precedence. + * + * @since 1.9 + */ +public interface ArgumentProcessor { + + /** + * Read the arguments from the command line at the specified position + *

    + * If the argument is not supported, returns -1. Else, the position of the + * first argument not supported. + */ + int readArguments(String[] args, int pos); + + /** + * If some arguments matched with {@link #readArguments(String[], int)}, + * this method is called after all arguments were parsed. Returns + * true if Ant should stop there, ie the build file not parsed + * and the project should not be executed. + */ + boolean handleArg(List args); + + /** + * If some arguments matched with {@link #readArguments(String[], int)}, + * this method is called just before the project being configured + */ + void prepareConfigure(Project project, List args); + + /** + * Handle the arguments with {@link #readArguments(String[], int)}, just + * after the project being configured. Returns true if Ant + * should stop there, ie the build file not parsed and the project should + * not be executed. + */ + boolean handleArg(Project project, List arg); + + /** + * Print the usage of the supported arguments + * + * @see org.apache.tools.ant.Main#printUsage() + */ + void printUsage(PrintStream writer); + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java new file mode 100644 index 00000000..bdb7c0a8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +import org.apache.tools.ant.util.LoaderUtils; + +/** + * The global registry for {@link ArgumentProcessor}s. + *

    + * An {@link ArgumentProcessor} implementation can be registered via the system + * property org.apache.tools.ant.ArgumentProcessor, or via a JDK1.3 + * 'service', by putting the fully qualified name of the implementation into the + * file META-INF/services/org.apache.tools.ant.ArgumentProcessor + *

    + * Use the system property ant.argument-processor.debug to enable + * the print of debug log. + * + * @since 1.9 + */ +public class ArgumentProcessorRegistry { + + private static final String DEBUG_ARGUMENT_PROCESSOR_REPOSITORY = "ant.argument-processor-repo.debug"; + + // The message log level is not accessible here because everything + // is instanciated statically + private static final boolean DEBUG = "true".equals(System.getProperty(DEBUG_ARGUMENT_PROCESSOR_REPOSITORY)); + + private static final String SERVICE_ID = "META-INF/services/org.apache.tools.ant.ArgumentProcessor"; + + private static ArgumentProcessorRegistry instance = new ArgumentProcessorRegistry(); + + private List processors = new ArrayList(); + + public static ArgumentProcessorRegistry getInstance() { + return instance; + } + + private ArgumentProcessorRegistry() { + collectArgumentProcessors(); + } + + public List getProcessors() { + return processors; + } + + private void collectArgumentProcessors() { + try { + ClassLoader classLoader = LoaderUtils.getContextClassLoader(); + if (classLoader != null) { + Enumeration resources = classLoader.getResources(SERVICE_ID); + while (resources.hasMoreElements()) { + URL resource = resources.nextElement(); + URLConnection conn = resource.openConnection(); + conn.setUseCaches(false); + ArgumentProcessor processor = getProcessorByService(conn.getInputStream()); + registerArgumentProcessor(processor); + } + } + + InputStream systemResource = ClassLoader.getSystemResourceAsStream(SERVICE_ID); + if (systemResource != null) { + ArgumentProcessor processor = getProcessorByService(systemResource); + registerArgumentProcessor(processor); + } + } catch (Exception e) { + System.err.println("Unable to load ArgumentProcessor from service " + + SERVICE_ID + " (" + e.getClass().getName() + ": " + + e.getMessage() + ")"); + if (DEBUG) { + e.printStackTrace(System.err); + } + } + } + + public void registerArgumentProcessor(String helperClassName) + throws BuildException { + registerArgumentProcessor(getProcessor(helperClassName)); + } + + public void registerArgumentProcessor( + Class< ? extends ArgumentProcessor> helperClass) + throws BuildException { + registerArgumentProcessor(getProcessor(helperClass)); + } + + private ArgumentProcessor getProcessor(String helperClassName) { + try { + @SuppressWarnings("unchecked") + Class< ? extends ArgumentProcessor> cl = (Class< ? extends ArgumentProcessor>) Class.forName(helperClassName); + return getProcessor(cl); + } catch (ClassNotFoundException e) { + throw new BuildException("Argument processor class " + + helperClassName + " was not found", e); + } + } + + private ArgumentProcessor getProcessor( + Class< ? extends ArgumentProcessor> processorClass) { + ArgumentProcessor processor; + try { + processor = processorClass.getConstructor().newInstance(); + } catch (Exception e) { + throw new BuildException("The argument processor class" + + processorClass.getClass().getName() + + " could not be instanciated with a default constructor", + e); + } + return processor; + } + + public void registerArgumentProcessor(ArgumentProcessor processor) { + if (processor == null) { + return; + } + processors.add(processor); + if (DEBUG) { + System.out.println("Argument processor " + + processor.getClass().getName() + " registered."); + } + } + + private ArgumentProcessor getProcessorByService(InputStream is) + throws IOException { + InputStreamReader isr = null; + try { + try { + isr = new InputStreamReader(is, "UTF-8"); + } catch (java.io.UnsupportedEncodingException e) { + isr = new InputStreamReader(is); + } + BufferedReader rd = new BufferedReader(isr); + String processorClassName = rd.readLine(); + if (processorClassName != null && !"".equals(processorClassName)) { + return getProcessor(processorClassName); + } + } finally { + try { + isr.close(); + } catch (IOException e) { + // ignore + } + } + return null; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildEvent.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildEvent.java new file mode 100644 index 00000000..623ad1e6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildEvent.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.util.EventObject; + +/** + * Class representing an event occurring during a build. An + * event is built by specifying either a project, a task or a target. + * A project level event will only have a project reference; + * a target level event will have project and target references; + * a task level event will have project, target and task references. + * + */ +public class BuildEvent extends EventObject { + + private static final long serialVersionUID = 4538050075952288486L; + + /** Project which emitted the event. */ + private final Project project; + /** Target which emitted the event, if specified. */ + private final Target target; + /** Task which emitted the event, if specified. */ + private final Task task; + /** + * Message associated with the event. This is only used for + * "messageLogged" events. + */ + private String message; + /** + * The priority of the message, for "messageLogged" events. + */ + private int priority = Project.MSG_VERBOSE; + /** + * The exception associated with this event, if any. + * This is only used for "messageLogged", "taskFinished", "targetFinished", + * and "buildFinished" events. + */ + private Throwable exception; + + /** + * Construct a BuildEvent for a project level event. + * + * @param project the project that emitted the event. + * Should not be null. + */ + public BuildEvent(Project project) { + super(project); + this.project = project; + this.target = null; + this.task = null; + } + + /** + * Construct a BuildEvent for a target level event. + * The project associated with the event is derived + * from the given target. + * + * @param target the target that emitted the event. + * Must not be null. + */ + public BuildEvent(Target target) { + super(target); + this.project = target.getProject(); + this.target = target; + this.task = null; + } + + /** + * Construct a BuildEvent for a task level event. + * The project and target associated with the event + * are derived from the given task. + * + * @param task the task that emitted the event. + * Must not be null. + */ + public BuildEvent(Task task) { + super(task); + this.project = task.getProject(); + this.target = task.getOwningTarget(); + this.task = task; + } + + /** + * Sets the message and priority associated with this event. + * This is used for "messageLogged" events. + * + * @param message the message to be associated with this event. + * Should not be null. + * @param priority the priority to be associated with this event, + * as defined in the {@link Project Project} class. + * + * @see BuildListener#messageLogged(BuildEvent) + */ + public void setMessage(String message, int priority) { + this.message = message; + this.priority = priority; + } + + /** + * Sets the exception associated with this event. This is used + * for "messageLogged", "taskFinished", "targetFinished", and "buildFinished" + * events. + * + * @param exception The exception to be associated with this event. + * May be null. + * + * @see BuildListener#messageLogged(BuildEvent) + * @see BuildListener#taskFinished(BuildEvent) + * @see BuildListener#targetFinished(BuildEvent) + * @see BuildListener#buildFinished(BuildEvent) + */ + public void setException(Throwable exception) { + this.exception = exception; + } + + /** + * Returns the project that fired this event. + * + * @return the project that fired this event + */ + public Project getProject() { + return project; + } + + /** + * Returns the target that fired this event. + * + * @return the project that fired this event, or null + * if this event is a project level event. + */ + public Target getTarget() { + return target; + } + + /** + * Returns the task that fired this event. + * + * @return the task that fired this event, or null + * if this event is a project or target level event. + */ + public Task getTask() { + return task; + } + + /** + * Returns the logging message. This field will only be set + * for "messageLogged" events. + * + * @return the message associated with this event, or null + * if no message has been set. + * + * @see BuildListener#messageLogged(BuildEvent) + */ + public String getMessage() { + return message; + } + + /** + * Returns the priority of the logging message. This field will only + * be set for "messageLogged" events. The meaning of this priority + * is as specified by the constants in the {@link Project Project} class. + * + * @return the priority associated with this event. + * + * @see BuildListener#messageLogged(BuildEvent) + */ + public int getPriority() { + return priority; + } + + /** + * Returns the exception that was thrown, if any. This field will only + * be set for "messageLogged", "taskFinished", "targetFinished", and "buildFinished" + * events. + * + * @return the exception associated with this exception, or + * null if no exception has been set. + * + * @see BuildListener#messageLogged(BuildEvent) + * @see BuildListener#taskFinished(BuildEvent) + * @see BuildListener#targetFinished(BuildEvent) + * @see BuildListener#buildFinished(BuildEvent) + */ + public Throwable getException() { + return exception; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildException.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildException.java new file mode 100644 index 00000000..34c16051 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildException.java @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Signals an error condition during a build + */ +public class BuildException extends RuntimeException { + + private static final long serialVersionUID = -5419014565354664240L; + + /** Location in the build file where the exception occurred */ + private Location location = Location.UNKNOWN_LOCATION; + + /** + * Constructs a build exception with no descriptive information. + */ + public BuildException() { + super(); + } + + /** + * Constructs an exception with the given descriptive message. + * + * @param message A description of or information about the exception. + * Should not be null. + */ + public BuildException(String message) { + super(message); + } + + /** + * Constructs an exception with the given message and exception as + * a root cause. + * + * @param message A description of or information about the exception. + * Should not be null unless a cause is specified. + * @param cause The exception that might have caused this one. + * May be null. + */ + public BuildException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Constructs an exception with the given message and exception as + * a root cause and a location in a file. + * + * @param msg A description of or information about the exception. + * Should not be null unless a cause is specified. + * @param cause The exception that might have caused this one. + * May be null. + * @param location The location in the project file where the error + * occurred. Must not be null. + */ + public BuildException(String msg, Throwable cause, Location location) { + this(msg, cause); + this.location = location; + } + + /** + * Constructs an exception with the given exception as a root cause. + * + * @param cause The exception that might have caused this one. + * Should not be null. + */ + public BuildException(Throwable cause) { + super(cause); + } + + /** + * Constructs an exception with the given descriptive message and a + * location in a file. + * + * @param message A description of or information about the exception. + * Should not be null. + * @param location The location in the project file where the error + * occurred. Must not be null. + */ + public BuildException(String message, Location location) { + super(message); + this.location = location; + } + + /** + * Constructs an exception with the given exception as + * a root cause and a location in a file. + * + * @param cause The exception that might have caused this one. + * Should not be null. + * @param location The location in the project file where the error + * occurred. Must not be null. + */ + public BuildException(Throwable cause, Location location) { + this(cause); + this.location = location; + } + + /** + * Returns the nested exception, if any. + * + * @return the nested exception, or null if no + * exception is associated with this one + * @deprecated Use {@link #getCause} instead. + */ + public Throwable getException() { + return getCause(); + } + + /** + * Returns the location of the error and the error message. + * + * @return the location of the error and the error message + */ + public String toString() { + return location.toString() + getMessage(); + } + + /** + * Sets the file location where the error occurred. + * + * @param location The file location where the error occurred. + * Must not be null. + */ + public void setLocation(Location location) { + this.location = location; + } + + /** + * Returns the file location where the error occurred. + * + * @return the file location where the error occurred. + */ + public Location getLocation() { + return location; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildListener.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildListener.java new file mode 100644 index 00000000..ed6731cf --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildListener.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.util.EventListener; + +/** + * Instances of classes that implement this interface can register + * to be notified when things happened during a build. + * + * @see BuildEvent + * @see Project#addBuildListener(BuildListener) + * + */ +public interface BuildListener extends EventListener { + + /** + * Signals that a build has started. This event + * is fired before any targets have started. + * + *

    This event is fired before the project instance is fully + * configured. In particular no properties have been set and the + * project may not know its name or default target, yet.

    + * + * @param event An event with any relevant extra information. + * Must not be null. + */ + void buildStarted(BuildEvent event); + + /** + * Signals that the last target has finished. This event + * will still be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getException() + */ + void buildFinished(BuildEvent event); + + /** + * Signals that a target is starting. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getTarget() + */ + void targetStarted(BuildEvent event); + + /** + * Signals that a target has finished. This event will + * still be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getException() + */ + void targetFinished(BuildEvent event); + + /** + * Signals that a task is starting. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getTask() + */ + void taskStarted(BuildEvent event); + + /** + * Signals that a task has finished. This event will still + * be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getException() + */ + void taskFinished(BuildEvent event); + + /** + * Signals a message logging event. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getMessage() + * @see BuildEvent#getException() + * @see BuildEvent#getPriority() + */ + void messageLogged(BuildEvent event); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildLogger.java new file mode 100644 index 00000000..249d8f51 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/BuildLogger.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.PrintStream; + +/** + * Interface used by Ant to log the build output. + * + * A build logger is a build listener which has the 'right' to send output to + * the ant log, which is usually System.out unless redirected by + * the -logfile option. + * + */ +public interface BuildLogger extends BuildListener { + + /** + * Sets the highest level of message this logger should respond to. + * + * Only messages with a message level lower than or equal to the + * given level should be written to the log. + *

    + * Constants for the message levels are in the + * {@link Project Project} class. The order of the levels, from least + * to most verbose, is MSG_ERR, MSG_WARN, + * MSG_INFO, MSG_VERBOSE, + * MSG_DEBUG. + * + * @param level the logging level for the logger. + */ + void setMessageOutputLevel(int level); + + /** + * Sets the output stream to which this logger is to send its output. + * + * @param output The output stream for the logger. + * Must not be null. + */ + void setOutputPrintStream(PrintStream output); + + /** + * Sets this logger to produce emacs (and other editor) friendly output. + * + * @param emacsMode true if output is to be unadorned so that + * emacs and other editors can parse files names, etc. + */ + void setEmacsMode(boolean emacsMode); + + /** + * Sets the output stream to which this logger is to send error messages. + * + * @param err The error stream for the logger. + * Must not be null. + */ + void setErrorPrintStream(PrintStream err); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ComponentHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ComponentHelper.java new file mode 100644 index 00000000..eceedeef --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ComponentHelper.java @@ -0,0 +1,1101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.Stack; + +import org.apache.tools.ant.launch.Launcher; +import org.apache.tools.ant.taskdefs.Definer; +import org.apache.tools.ant.taskdefs.Typedef; +import org.apache.tools.ant.util.FileUtils; + +/** + * Component creation and configuration. + * + * The class is based around handing component + * definitions in an AntTypeTable. + * + * The old task/type methods have been kept + * for backward compatibly. + * Project will just delegate its calls to this class. + * + * A very simple hook mechanism is provided that allows users to plug + * in custom code. It is also possible to replace the default behavior + * ( for example in an app embedding ant ) + * + * @since Ant1.6 + */ +public class ComponentHelper { + /** Map of component name to lists of restricted definitions */ + private Map> restrictedDefinitions = new HashMap>(); + + /** Map from component name to anttypedefinition */ + private final Hashtable antTypeTable = new Hashtable(); + + /** Map of tasks generated from antTypeTable */ + private final Hashtable> taskClassDefinitions = new Hashtable>(); + + /** flag to rebuild taskClassDefinitions */ + private boolean rebuildTaskClassDefinitions = true; + + /** Map of types generated from antTypeTable */ + private final Hashtable> typeClassDefinitions = new Hashtable>(); + + /** flag to rebuild typeClassDefinitions */ + private boolean rebuildTypeClassDefinitions = true; + + /** Set of namespaces that have been checked for antlibs */ + private final HashSet checkedNamespaces = new HashSet(); + + /** + * Stack of antlib contexts used to resolve definitions while + * processing antlib + */ + private Stack antLibStack = new Stack(); + + /** current antlib uri */ + private String antLibCurrentUri = null; + + /** + * this does not appear to be used anywhere in the Ant codebase + * even via its accessors + */ + private ComponentHelper next; + + /** + * Project that owns a component helper + */ + private Project project; + + /** + * Error string when the file taskdefs/defaults.properties cannot be found + */ + private static final String ERROR_NO_TASK_LIST_LOAD = "Can't load default task list"; + + /** + * Error string when the typedefs/defaults.properties cannot be found + */ + private static final String ERROR_NO_TYPE_LIST_LOAD = "Can't load default type list"; + + /** + * reference under which we register ourselves with a project -{@value} + */ + public static final String COMPONENT_HELPER_REFERENCE = "ant.ComponentHelper"; + + /** + * string used to control build.syspath policy {@value} + */ + private static final String BUILD_SYSCLASSPATH_ONLY = "only"; + + /** + * special name of ant's property task -{@value}. There is some + * contrived work here to enable this early. + */ + private static final String ANT_PROPERTY_TASK = "property"; + + // {tasks, types} + private static Properties[] defaultDefinitions = new Properties[2]; + + /** + * Get the project. + * @return the project owner of this helper. + */ + public Project getProject() { + return project; + } + + /** + * Find a project component for a specific project, creating + * it if it does not exist. + * @param project the project. + * @return the project component for a specific project. + */ + public static ComponentHelper getComponentHelper(Project project) { + if (project == null) { + return null; + } + // Singleton for now, it may change ( per/classloader ) + ComponentHelper ph = (ComponentHelper) project.getReference(COMPONENT_HELPER_REFERENCE); + if (ph != null) { + return ph; + } + ph = new ComponentHelper(); + ph.setProject(project); + + project.addReference(COMPONENT_HELPER_REFERENCE, ph); + return ph; + } + + /** + * Creates a new ComponentHelper instance. + */ + protected ComponentHelper() { + } + + /** + * Set the next chained component helper. + * + * @param next the next chained component helper. + */ + public void setNext(ComponentHelper next) { + this.next = next; + } + + /** + * Get the next chained component helper. + * + * @return the next chained component helper. + */ + public ComponentHelper getNext() { + return next; + } + + /** + * Sets the project for this component helper. + * + * @param project the project for this helper. + */ + public void setProject(Project project) { + this.project = project; +// antTypeTable = new Hashtable(project); + } + + /** + * @return A copy of the CheckedNamespace. + */ + private synchronized Set getCheckedNamespace() { + @SuppressWarnings("unchecked") + final Set result = (Set) checkedNamespaces.clone(); + return result; + } + + /** + * @return A deep copy of the restrictredDefinition + */ + private Map> getRestrictedDefinition() { + final Map> result = new HashMap>(); + synchronized (restrictedDefinitions) { + for (Map.Entry> entry : restrictedDefinitions.entrySet()) { + List entryVal = entry.getValue(); + synchronized (entryVal) { + //copy the entryVal + entryVal = new ArrayList (entryVal); + } + result.put(entry.getKey(), entryVal); + } + } + return result; + } + + + /** + * Used with creating child projects. Each child + * project inherits the component definitions + * from its parent. + * @param helper the component helper of the parent project. + */ + public void initSubProject(ComponentHelper helper) { + // add the types of the parent project + @SuppressWarnings("unchecked") + final Hashtable typeTable = (Hashtable) helper.antTypeTable.clone(); + synchronized (antTypeTable) { + for (AntTypeDefinition def : typeTable.values()) { + antTypeTable.put(def.getName(), def); + } + } + // add the parsed namespaces of the parent project + Set inheritedCheckedNamespace = helper.getCheckedNamespace(); + synchronized (this) { + checkedNamespaces.addAll(inheritedCheckedNamespace); + } + Map> inheritedRestrictedDef = helper.getRestrictedDefinition(); + synchronized (restrictedDefinitions) { + restrictedDefinitions.putAll(inheritedRestrictedDef); + } + } + + /** + * Factory method to create the components. + * + * This should be called by UnknownElement. + * + * @param ue The Unknown Element creating this component. + * @param ns Namespace URI. Also available as ue.getNamespace(). + * @param componentType The component type, + * Also available as ue.getComponentName(). + * @return the created component. + * @throws BuildException if an error occurs. + */ + public Object createComponent(UnknownElement ue, String ns, String componentType) + throws BuildException { + Object component = createComponent(componentType); + if (component instanceof Task) { + Task task = (Task) component; + task.setLocation(ue.getLocation()); + task.setTaskType(componentType); + task.setTaskName(ue.getTaskName()); + task.setOwningTarget(ue.getOwningTarget()); + task.init(); + } + return component; + } + + /** + * Create an object for a component. + * + * @param componentName the name of the component, if + * the component is in a namespace, the + * name is prefixed with the namespace uri and ":". + * @return the class if found or null if not. + */ + public Object createComponent(String componentName) { + AntTypeDefinition def = getDefinition(componentName); + return def == null ? null : def.create(project); + } + + /** + * Return the class of the component name. + * + * @param componentName the name of the component, if + * the component is in a namespace, the + * name is prefixed with the namespace uri and ":". + * @return the class if found or null if not. + */ + public Class getComponentClass(String componentName) { + AntTypeDefinition def = getDefinition(componentName); + return def == null ? null : def.getExposedClass(project); + } + + /** + * Return the antTypeDefinition for a componentName. + * @param componentName the name of the component. + * @return the ant definition or null if not present. + */ + public AntTypeDefinition getDefinition(String componentName) { + checkNamespace(componentName); + return antTypeTable.get(componentName); + } + + /** + * This method is initialization code implementing the original ant component + * loading from /org/apache/tools/ant/taskdefs/default.properties + * and /org/apache/tools/ant/types/default.properties. + */ + public void initDefaultDefinitions() { + initTasks(); + initTypes(); + new DefaultDefinitions(this).execute(); + } + + /** + * Adds a new task definition to the project. + * Attempting to override an existing definition with an + * equivalent one (i.e. with the same classname) results in + * a verbose log message. Attempting to override an existing definition + * with a different one results in a warning log message. + * + * @param taskName The name of the task to add. + * Must not be null. + * @param taskClass The full name of the class implementing the task. + * Must not be null. + * + * @exception BuildException if the class is unsuitable for being an Ant + * task. An error level message is logged before + * this exception is thrown. + * + * @see #checkTaskClass(Class) + */ + public void addTaskDefinition(String taskName, Class taskClass) { + checkTaskClass(taskClass); + AntTypeDefinition def = new AntTypeDefinition(); + def.setName(taskName); + def.setClassLoader(taskClass.getClassLoader()); + def.setClass(taskClass); + def.setAdapterClass(TaskAdapter.class); + def.setClassName(taskClass.getName()); + def.setAdaptToClass(Task.class); + updateDataTypeDefinition(def); + } + + /** + * Checks whether or not a class is suitable for serving as Ant task. + * Ant task implementation classes must be public, concrete, and have + * a no-arg constructor. + * + * @param taskClass The class to be checked. + * Must not be null. + * + * @exception BuildException if the class is unsuitable for being an Ant + * task. An error level message is logged before + * this exception is thrown. + */ + public void checkTaskClass(final Class taskClass) throws BuildException { + if (!Modifier.isPublic(taskClass.getModifiers())) { + final String message = taskClass + " is not public"; + project.log(message, Project.MSG_ERR); + throw new BuildException(message); + } + if (Modifier.isAbstract(taskClass.getModifiers())) { + final String message = taskClass + " is abstract"; + project.log(message, Project.MSG_ERR); + throw new BuildException(message); + } + try { + taskClass.getConstructor((Class[]) null); + // don't have to check for public, since + // getConstructor finds public constructors only. + } catch (NoSuchMethodException e) { + final String message = "No public no-arg constructor in " + taskClass; + project.log(message, Project.MSG_ERR); + throw new BuildException(message); + } + if (!Task.class.isAssignableFrom(taskClass)) { + TaskAdapter.checkTaskClass(taskClass, project); + } + } + + /** + * Returns the current task definition hashtable. The returned hashtable is + * "live" and so should not be modified. Also, the returned table may be + * modified asynchronously. + * + * @return a map of from task name to implementing class + * (String to Class). + */ + public Hashtable> getTaskDefinitions() { + synchronized (taskClassDefinitions) { + synchronized (antTypeTable) { + if (rebuildTaskClassDefinitions) { + taskClassDefinitions.clear(); + for (Map.Entry e : antTypeTable.entrySet()) { + final Class clazz = e.getValue().getExposedClass(project); + if (clazz == null) { + continue; + } + if (Task.class.isAssignableFrom(clazz)) { + taskClassDefinitions.put(e.getKey(), e.getValue().getTypeClass(project)); + } + } + rebuildTaskClassDefinitions = false; + } + } + } + return taskClassDefinitions; + } + + /** + * Returns the current type definition hashtable. The returned hashtable is + * "live" and so should not be modified. + * + * @return a map of from type name to implementing class + * (String to Class). + */ + public Hashtable> getDataTypeDefinitions() { + synchronized (typeClassDefinitions) { + synchronized (antTypeTable) { + if (rebuildTypeClassDefinitions) { + typeClassDefinitions.clear(); + for (Map.Entry e : antTypeTable.entrySet()) { + final Class clazz = e.getValue().getExposedClass(project); + if (clazz == null) { + continue; + } + if (!Task.class.isAssignableFrom(clazz)) { + typeClassDefinitions.put(e.getKey(), e.getValue().getTypeClass(project)); + } + } + rebuildTypeClassDefinitions = false; + } + } + } + return typeClassDefinitions; + } + + /** + * This returns a list of restricted definitions for a name. + * The returned List is "live" and so should not be modified. + * Also, the returned list may be modified asynchronously. + * Any access must be guarded with a lock on the list itself. + * + * @param componentName the name to use. + * @return the list of restricted definitions for a particular name. + */ + public List getRestrictedDefinitions(String componentName) { + synchronized (restrictedDefinitions) { + return restrictedDefinitions.get(componentName); + } + } + + /** + * Adds a new datatype definition. + * Attempting to override an existing definition with an + * equivalent one (i.e. with the same classname) results in + * a verbose log message. Attempting to override an existing definition + * with a different one results in a warning log message, but the + * definition is changed. + * + * @param typeName The name of the datatype. + * Must not be null. + * @param typeClass The full name of the class implementing the datatype. + * Must not be null. + */ + public void addDataTypeDefinition(String typeName, Class typeClass) { + final AntTypeDefinition def = new AntTypeDefinition(); + def.setName(typeName); + def.setClass(typeClass); + updateDataTypeDefinition(def); + project.log(" +User datatype: " + typeName + " " + typeClass.getName(), + Project.MSG_DEBUG); + } + + /** + * Describe addDataTypeDefinition method here. + * + * @param def an AntTypeDefinition value. + */ + public void addDataTypeDefinition(AntTypeDefinition def) { + if (!def.isRestrict()) { + updateDataTypeDefinition(def); + } else { + updateRestrictedDefinition(def); + } + } + + /** + * Returns the current datatype definition hashtable. The returned + * hashtable is "live" and so should not be modified. + * + * @return a map of from datatype name to datatype definition + * (String to {@link AntTypeDefinition}). + */ + public Hashtable getAntTypeTable() { + return antTypeTable; + } + + /** + * Creates a new instance of a task. + * + * Called from Project.createTask(), which can be called by tasks. + * + * @param taskType The name of the task to create an instance of. + * Must not be null. + * + * @return an instance of the specified task, or null if + * the task name is not recognised. + * + * @exception BuildException if the task name is recognised but task + * creation fails. + */ + public Task createTask(String taskType) throws BuildException { + Task task = createNewTask(taskType); + if (task == null && taskType.equals(ANT_PROPERTY_TASK)) { + // quick fix for Ant.java use of property before + // initializing the project + addTaskDefinition(ANT_PROPERTY_TASK, org.apache.tools.ant.taskdefs.Property.class); + task = createNewTask(taskType); + } + return task; + } + + /** + * Creates a new instance of a task. + * @since ant1.6 + * @param taskType The name of the task to create an instance of. + * Must not be null. + * + * @return an instance of the specified task, or null if + * the task name is not recognised. + * + * @exception BuildException if the task name is recognised but task + * creation fails. + */ + private Task createNewTask(String taskType) throws BuildException { + Class c = getComponentClass(taskType); + if (c == null || !(Task.class.isAssignableFrom(c))) { + return null; + } + Object obj = createComponent(taskType); + if (obj == null) { + return null; + } + if (!(obj instanceof Task)) { + throw new BuildException("Expected a Task from '" + taskType + + "' but got an instance of " + obj.getClass().getName() + " instead"); + } + Task task = (Task) obj; + task.setTaskType(taskType); + + // set default value, can be changed by the user + task.setTaskName(taskType); + + project.log(" +Task: " + taskType, Project.MSG_DEBUG); + return task; + } + + /** + * Creates a new instance of a data type. + * + * @param typeName The name of the data type to create an instance of. + * Must not be null. + * + * @return an instance of the specified data type, or null if + * the data type name is not recognised. + * + * @exception BuildException if the data type name is recognised but + * instance creation fails. + */ + public Object createDataType(String typeName) throws BuildException { + return createComponent(typeName); + } + + /** + * Returns a description of the type of the given element. + *

    + * This is useful for logging purposes. + * + * @param element The element to describe. + * Must not be null. + * + * @return a description of the element type. + * + * @since Ant 1.6 + */ + public String getElementName(Object element) { + return getElementName(element, false); + } + + /** + * Returns a description of the type of the given element. + *

    + * This is useful for logging purposes. + * + * @param o The element to describe. + * Must not be null. + * @param brief whether to use a brief description. + * @return a description of the element type. + * + * @since Ant 1.7 + */ + public String getElementName(Object o, boolean brief) { + // PR: I do not know what to do if the object class + // has multiple defines + // but this is for logging only... + Class elementClass = o.getClass(); + String elementClassname = elementClass.getName(); + synchronized (antTypeTable) { + for (AntTypeDefinition def : antTypeTable.values()) { + if (elementClassname.equals(def.getClassName()) + && (elementClass == def.getExposedClass(project))) { + String name = def.getName(); + return brief ? name : "The <" + name + "> type"; + } + } + } + return getUnmappedElementName(o.getClass(), brief); + } + + /** + * Convenient way to get some element name even when you may not have a + * Project context. + * @param p The optional Project instance. + * @param o The element to describe. + * Must not be null. + * @param brief whether to use a brief description. + * @return a description of the element type. + * @since Ant 1.7 + */ + public static String getElementName(Project p, Object o, boolean brief) { + if (p == null) { + p = Project.getProject(o); + } + return p == null ? getUnmappedElementName(o.getClass(), brief) : getComponentHelper(p) + .getElementName(o, brief); + } + + private static String getUnmappedElementName(Class c, boolean brief) { + if (brief) { + String name = c.getName(); + return name.substring(name.lastIndexOf('.') + 1); + } + return c.toString(); + } + + /** + * Check if definition is a valid definition--it may be a + * definition of an optional task that does not exist. + * @param def the definition to test. + * @return true if exposed type of definition is present. + */ + private boolean validDefinition(AntTypeDefinition def) { + return !(def.getTypeClass(project) == null || def.getExposedClass(project) == null); + } + + /** + * Check if two definitions are the same. + * @param def the new definition. + * @param old the old definition. + * @return true if the two definitions are the same. + */ + private boolean sameDefinition(AntTypeDefinition def, AntTypeDefinition old) { + boolean defValid = validDefinition(def); + boolean sameValidity = (defValid == validDefinition(old)); + //must have same validity; then if they are valid they must also be the same: + return sameValidity && (!defValid || def.sameDefinition(old, project)); + } + + /** + * update the restricted definition table with a new or + * modified definition. + */ + private void updateRestrictedDefinition(AntTypeDefinition def) { + String name = def.getName(); + List list = null; + synchronized (restrictedDefinitions) { + list = restrictedDefinitions.get(name); + if (list == null) { + list = new ArrayList(); + restrictedDefinitions.put(name, list); + } + } + // Check if the classname is already present and remove it + // if it is + synchronized (list) { + for (Iterator i = list.iterator(); i.hasNext();) { + AntTypeDefinition current = i.next(); + if (current.getClassName().equals(def.getClassName())) { + i.remove(); + break; + } + } + list.add(def); + } + } + + /** + * Update the component definition table with a new or + * modified definition. + * @param def the definition to update or insert. + */ + private void updateDataTypeDefinition(AntTypeDefinition def) { + String name = def.getName(); + synchronized (antTypeTable) { + rebuildTaskClassDefinitions = true; + rebuildTypeClassDefinitions = true; + final AntTypeDefinition old = antTypeTable.get(name); + if (old != null) { + if (sameDefinition(def, old)) { + return; + } + Class oldClass = old.getExposedClass(project); + boolean isTask = oldClass != null && Task.class.isAssignableFrom(oldClass); + project.log("Trying to override old definition of " + + (isTask ? "task " : "datatype ") + name, (def.similarDefinition(old, + project)) ? Project.MSG_VERBOSE : Project.MSG_WARN); + } + project.log(" +Datatype " + name + " " + def.getClassName(), Project.MSG_DEBUG); + antTypeTable.put(name, def); + } + } + + /** + * Called at the start of processing an antlib. + * @param uri the uri that is associated with this antlib. + */ + public void enterAntLib(String uri) { + antLibCurrentUri = uri; + antLibStack.push(uri); + } + + /** + * @return the current antlib uri. + */ + public String getCurrentAntlibUri() { + return antLibCurrentUri; + } + + /** + * Called at the end of processing an antlib. + */ + public void exitAntLib() { + antLibStack.pop(); + antLibCurrentUri = (antLibStack.size() == 0) ? null : (String) antLibStack.peek(); + } + + /** + * Load ant's tasks. + */ + private void initTasks() { + ClassLoader classLoader = getClassLoader(null); + Properties props = getDefaultDefinitions(false); + Enumeration e = props.propertyNames(); + while (e.hasMoreElements()) { + String name = (String) e.nextElement(); + String className = props.getProperty(name); + AntTypeDefinition def = new AntTypeDefinition(); + def.setName(name); + def.setClassName(className); + def.setClassLoader(classLoader); + def.setAdaptToClass(Task.class); + def.setAdapterClass(TaskAdapter.class); + antTypeTable.put(name, def); + } + } + + private ClassLoader getClassLoader(ClassLoader classLoader) { + String buildSysclasspath = project.getProperty(MagicNames.BUILD_SYSCLASSPATH); + if (project.getCoreLoader() != null + && !(BUILD_SYSCLASSPATH_ONLY.equals(buildSysclasspath))) { + classLoader = project.getCoreLoader(); + } + return classLoader; + } + + /** + * Load default task or type definitions - just the names, + * no class loading. + * Caches results between calls to reduce overhead. + * @param type true for typedefs, false for taskdefs + * @return a mapping from definition names to class names + * @throws BuildException if there was some problem loading + * or parsing the definitions list + */ + private static synchronized Properties getDefaultDefinitions(boolean type) + throws BuildException { + int idx = type ? 1 : 0; + if (defaultDefinitions[idx] == null) { + String resource = type ? MagicNames.TYPEDEFS_PROPERTIES_RESOURCE + : MagicNames.TASKDEF_PROPERTIES_RESOURCE; + String errorString = type ? ERROR_NO_TYPE_LIST_LOAD : ERROR_NO_TASK_LIST_LOAD; + InputStream in = null; + try { + in = ComponentHelper.class.getResourceAsStream(resource); + if (in == null) { + throw new BuildException(errorString); + } + Properties p = new Properties(); + p.load(in); + defaultDefinitions[idx] = p; + } catch (IOException e) { + throw new BuildException(errorString, e); + } finally { + FileUtils.close(in); + } + } + return defaultDefinitions[idx]; + } + + /** + * Load ant's datatypes. + */ + private void initTypes() { + ClassLoader classLoader = getClassLoader(null); + Properties props = getDefaultDefinitions(true); + Enumeration e = props.propertyNames(); + while (e.hasMoreElements()) { + String name = (String) e.nextElement(); + String className = props.getProperty(name); + AntTypeDefinition def = new AntTypeDefinition(); + def.setName(name); + def.setClassName(className); + def.setClassLoader(classLoader); + antTypeTable.put(name, def); + } + } + + /** + * Called for each component name, check if the + * associated URI has been examined for antlibs. + * @param componentName the name of the component, which should include a URI + * prefix if it is in a namespace + */ + private synchronized void checkNamespace(String componentName) { + String uri = ProjectHelper.extractUriFromComponentName(componentName); + if ("".equals(uri)) { + uri = ProjectHelper.ANT_CORE_URI; + } + if (!uri.startsWith(ProjectHelper.ANTLIB_URI)) { + return; // namespace that does not contain antlib + } + if (checkedNamespaces.contains(uri)) { + return; // Already processed + } + checkedNamespaces.add(uri); + + if (antTypeTable.size() == 0) { + // Project instance doesn't know the tasks and types + // defined in defaults.properties, likely created by the + // user - without those definitions it cannot parse antlib + // files as taskdef, typedef and friends are unknown + initDefaultDefinitions(); + } + Typedef definer = new Typedef(); + definer.setProject(project); + definer.init(); + definer.setURI(uri); + //there to stop error messages being "null" + definer.setTaskName(uri); + //if this is left out, bad things happen. like all build files break + //on the first element encountered. + definer.setResource(Definer.makeResourceFromURI(uri)); + // a fishing expedition :- ignore errors if antlib not present + definer.setOnError(new Typedef.OnError(Typedef.OnError.POLICY_IGNORE)); + definer.execute(); + } + + /** + * Handler called to do decent diagnosis on instantiation failure. + * @param componentName component name. + * @param type component type, used in error messages + * @return a string containing as much diagnostics info as possible. + */ + public String diagnoseCreationFailure(String componentName, String type) { + StringWriter errorText = new StringWriter(); + PrintWriter out = new PrintWriter(errorText); + out.println("Problem: failed to create " + type + " " + componentName); + //class of problem + boolean lowlevel = false; + boolean jars = false; + boolean definitions = false; + boolean antTask; + String home = System.getProperty(Launcher.USER_HOMEDIR); + File libDir = new File(home, Launcher.USER_LIBDIR); + String antHomeLib; + boolean probablyIDE = false; + String anthome = System.getProperty(MagicNames.ANT_HOME); + if (anthome != null) { + File antHomeLibDir = new File(anthome, "lib"); + antHomeLib = antHomeLibDir.getAbsolutePath(); + } else { + //running under an IDE that doesn't set ANT_HOME + probablyIDE = true; + antHomeLib = "ANT_HOME" + File.separatorChar + "lib"; + } + StringBuffer dirListingText = new StringBuffer(); + final String tab = " -"; + dirListingText.append(tab); + dirListingText.append(antHomeLib); + dirListingText.append('\n'); + if (probablyIDE) { + dirListingText.append(tab); + dirListingText.append("the IDE Ant configuration dialogs"); + } else { + dirListingText.append(tab); + dirListingText.append(libDir); + dirListingText.append('\n'); + dirListingText.append(tab); + dirListingText.append("a directory added on the command line with the -lib argument"); + } + String dirListing = dirListingText.toString(); + + //look up the name + AntTypeDefinition def = getDefinition(componentName); + if (def == null) { + //not a known type + printUnknownDefinition(out, componentName, dirListing); + definitions = true; + } else { + //we are defined, so it is an instantiation problem + final String classname = def.getClassName(); + antTask = classname.startsWith("org.apache.tools.ant."); + boolean optional = classname.startsWith("org.apache.tools.ant.taskdefs.optional"); + optional |= classname.startsWith("org.apache.tools.ant.types.optional"); + + //start with instantiating the class. + Class clazz = null; + try { + clazz = def.innerGetTypeClass(); + } catch (ClassNotFoundException e) { + jars = true; + if (!optional) { + definitions = true; + } + printClassNotFound(out, classname, optional, dirListing); + } catch (NoClassDefFoundError ncdfe) { + jars = true; + printNotLoadDependentClass(out, optional, ncdfe, dirListing); + } + //here we successfully loaded the class or failed. + if (clazz != null) { + //success: proceed with more steps + try { + def.innerCreateAndSet(clazz, project); + //hey, there is nothing wrong with us + out.println("The component could be instantiated."); + } catch (NoSuchMethodException e) { + lowlevel = true; + out.println("Cause: The class " + classname + + " has no compatible constructor."); + + } catch (InstantiationException e) { + lowlevel = true; + out.println("Cause: The class " + classname + + " is abstract and cannot be instantiated."); + } catch (IllegalAccessException e) { + lowlevel = true; + out.println("Cause: The constructor for " + classname + + " is private and cannot be invoked."); + } catch (InvocationTargetException ex) { + lowlevel = true; + Throwable t = ex.getTargetException(); + out.println("Cause: The constructor threw the exception"); + out.println(t.toString()); + t.printStackTrace(out); + } catch (NoClassDefFoundError ncdfe) { + jars = true; + out.println("Cause: A class needed by class " + classname + + " cannot be found: "); + out.println(" " + ncdfe.getMessage()); + out.println("Action: Determine what extra JAR files are" + + " needed, and place them in:"); + out.println(dirListing); + } + } + out.println(); + out.println("Do not panic, this is a common problem."); + if (definitions) { + out.println("It may just be a typographical error in the build file " + + "or the task/type declaration."); + } + if (jars) { + out.println("The commonest cause is a missing JAR."); + } + if (lowlevel) { + out.println("This is quite a low level problem, which may need " + + "consultation with the author of the task."); + if (antTask) { + out.println("This may be the Ant team. Please file a " + + "defect or contact the developer team."); + } else { + out.println("This does not appear to be a task bundled with Ant."); + out.println("Please take it up with the supplier of the third-party " + type + + "."); + out.println("If you have written it yourself, you probably have a bug to fix."); + } + } else { + out.println(); + out.println("This is not a bug; it is a configuration problem"); + } + } + out.flush(); + out.close(); + return errorText.toString(); + } + + /** + * Print unknown definition.forking + */ + private void printUnknownDefinition(PrintWriter out, String componentName, String dirListing) { + boolean isAntlib = componentName.startsWith(MagicNames.ANTLIB_PREFIX); + String uri = ProjectHelper.extractUriFromComponentName(componentName); + out.println("Cause: The name is undefined."); + out.println("Action: Check the spelling."); + out.println("Action: Check that any custom tasks/types have been declared."); + out.println("Action: Check that any /" + + " declarations have taken place."); + if (uri.length() > 0) { + final List matches = findTypeMatches(uri); + if (matches.size() > 0) { + out.println(); + out.println("The definitions in the namespace " + uri + " are:"); + for (AntTypeDefinition def : matches) { + String local = ProjectHelper.extractNameFromComponentName(def.getName()); + out.println(" " + local); + } + } else { + out.println("No types or tasks have been defined in this namespace yet"); + if (isAntlib) { + out.println(); + out.println("This appears to be an antlib declaration. "); + out.println("Action: Check that the implementing library exists in one of:"); + out.println(dirListing); + } + } + } + } + + /** + * Print class not found. + */ + private void printClassNotFound(PrintWriter out, String classname, boolean optional, + String dirListing) { + out.println("Cause: the class " + classname + " was not found."); + if (optional) { + out.println(" This looks like one of Ant's optional components."); + out.println("Action: Check that the appropriate optional JAR exists in"); + out.println(dirListing); + } else { + out.println("Action: Check that the component has been correctly declared"); + out.println(" and that the implementing JAR is in one of:"); + out.println(dirListing); + } + } + + /** + * Print could not load dependent class. + */ + private void printNotLoadDependentClass(PrintWriter out, boolean optional, + NoClassDefFoundError ncdfe, String dirListing) { + out.println("Cause: Could not load a dependent class " + + ncdfe.getMessage()); + if (optional) { + out.println(" It is not enough to have Ant's optional JARs"); + out.println(" you need the JAR files that the" + " optional tasks depend upon."); + out.println(" Ant's optional task dependencies are" + " listed in the manual."); + } else { + out.println(" This class may be in a separate JAR" + " that is not installed."); + } + out.println("Action: Determine what extra JAR files are" + + " needed, and place them in one of:"); + out.println(dirListing); + } + + /** + * Create a list of all definitions that match a prefix, usually the URI + * of a library + * @param prefix prefix to match off + * @return the (possibly empty) list of definitions + */ + private List findTypeMatches(String prefix) { + final List result = new ArrayList(); + synchronized (antTypeTable) { + for (AntTypeDefinition def : antTypeTable.values()) { + if (def.getName().startsWith(prefix)) { + result.add(def); + } + } + } + return result; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultDefinitions.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultDefinitions.java new file mode 100644 index 00000000..062018d0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultDefinitions.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Default definitions. + * @since Ant 1.9.1 + */ +public final class DefaultDefinitions { + private static final String IF_NAMESPACE = "ant:if"; + private static final String UNLESS_NAMESPACE = "ant:unless"; + private static final String OATA = "org.apache.tools.ant."; + + private final ComponentHelper componentHelper; + + /** + * Create a default definitions object. + * @param componentHelper the componenthelper to initialize. + */ + public DefaultDefinitions(ComponentHelper componentHelper) { + this.componentHelper = componentHelper; + } + + /** + * Register the definitions. + */ + public void execute() { + attributeNamespaceDef(IF_NAMESPACE); + attributeNamespaceDef(UNLESS_NAMESPACE); + + ifUnlessDef("true", "IfTrueAttribute"); + ifUnlessDef("set", "IfSetAttribute"); + ifUnlessDef("blank", "IfBlankAttribute"); + } + + private void attributeNamespaceDef(String ns) { + AntTypeDefinition def = new AntTypeDefinition(); + def.setName(ProjectHelper.nsToComponentName(ns)); + def.setClassName(OATA + "attribute.AttributeNamespace"); + def.setClassLoader(getClass().getClassLoader()); + def.setRestrict(true); + componentHelper.addDataTypeDefinition(def); + } + + private void ifUnlessDef(String name, String base) { + String classname = OATA + "attribute." + base; + componentDef(IF_NAMESPACE, name, classname); + componentDef(UNLESS_NAMESPACE, name, classname + "$Unless"); + } + + private void componentDef(String ns, String name, String classname) { + AntTypeDefinition def = new AntTypeDefinition(); + String n = ProjectHelper.genComponentName(ns, name); + def.setName(ProjectHelper.genComponentName(ns, name)); + def.setClassName(classname); + def.setClassLoader(getClass().getClassLoader()); + def.setRestrict(true); + componentHelper.addDataTypeDefinition(def); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultLogger.java new file mode 100644 index 00000000..dbc60486 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DefaultLogger.java @@ -0,0 +1,380 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintStream; +import java.io.StringReader; +import java.text.DateFormat; +import java.util.Date; + +import org.apache.tools.ant.util.DateUtils; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.StringUtils; + +/** + * Writes build events to a PrintStream. Currently, it + * only writes which targets are being executed, and + * any messages that get logged. + * + */ +public class DefaultLogger implements BuildLogger { + /** + * Size of left-hand column for right-justified task name. + * @see #messageLogged(BuildEvent) + */ + public static final int LEFT_COLUMN_SIZE = 12; + + // CheckStyle:VisibilityModifier OFF - bc + /** PrintStream to write non-error messages to */ + protected PrintStream out; + + /** PrintStream to write error messages to */ + protected PrintStream err; + + /** Lowest level of message to write out */ + protected int msgOutputLevel = Project.MSG_ERR; + + /** Time of the start of the build */ + private long startTime = System.currentTimeMillis(); + + // CheckStyle:ConstantNameCheck OFF - bc + /** Line separator */ + protected static final String lSep = StringUtils.LINE_SEP; + // CheckStyle:ConstantNameCheck ON + + /** Whether or not to use emacs-style output */ + protected boolean emacsMode = false; + // CheckStyle:VisibilityModifier ON + + + /** + * Sole constructor. + */ + public DefaultLogger() { + } + + /** + * Sets the highest level of message this logger should respond to. + * + * Only messages with a message level lower than or equal to the + * given level should be written to the log. + *

    + * Constants for the message levels are in the + * {@link Project Project} class. The order of the levels, from least + * to most verbose, is MSG_ERR, MSG_WARN, + * MSG_INFO, MSG_VERBOSE, + * MSG_DEBUG. + *

    + * The default message level for DefaultLogger is Project.MSG_ERR. + * + * @param level the logging level for the logger. + */ + public void setMessageOutputLevel(int level) { + this.msgOutputLevel = level; + } + + /** + * Sets the output stream to which this logger is to send its output. + * + * @param output The output stream for the logger. + * Must not be null. + */ + public void setOutputPrintStream(PrintStream output) { + this.out = new PrintStream(output, true); + } + + /** + * Sets the output stream to which this logger is to send error messages. + * + * @param err The error stream for the logger. + * Must not be null. + */ + public void setErrorPrintStream(PrintStream err) { + this.err = new PrintStream(err, true); + } + + /** + * Sets this logger to produce emacs (and other editor) friendly output. + * + * @param emacsMode true if output is to be unadorned so that + * emacs and other editors can parse files names, etc. + */ + public void setEmacsMode(boolean emacsMode) { + this.emacsMode = emacsMode; + } + + /** + * Responds to a build being started by just remembering the current time. + * + * @param event Ignored. + */ + public void buildStarted(BuildEvent event) { + startTime = System.currentTimeMillis(); + } + + static void throwableMessage(StringBuffer m, Throwable error, boolean verbose) { + while (error instanceof BuildException) { // #43398 + Throwable cause = error.getCause(); + if (cause == null) { + break; + } + String msg1 = error.toString(); + String msg2 = cause.toString(); + if (msg1.endsWith(msg2)) { + m.append(msg1.substring(0, msg1.length() - msg2.length())); + error = cause; + } else { + break; + } + } + if (verbose || !(error instanceof BuildException)) { + m.append(StringUtils.getStackTrace(error)); + } else { + m.append(error).append(lSep); + } + } + + /** + * Prints whether the build succeeded or failed, + * any errors the occurred during the build, and + * how long the build took. + * + * @param event An event with any relevant extra information. + * Must not be null. + */ + public void buildFinished(BuildEvent event) { + Throwable error = event.getException(); + StringBuffer message = new StringBuffer(); + if (error == null) { + message.append(StringUtils.LINE_SEP); + message.append(getBuildSuccessfulMessage()); + } else { + message.append(StringUtils.LINE_SEP); + message.append(getBuildFailedMessage()); + message.append(StringUtils.LINE_SEP); + throwableMessage(message, error, Project.MSG_VERBOSE <= msgOutputLevel); + } + message.append(StringUtils.LINE_SEP); + message.append("Total time: "); + message.append(formatTime(System.currentTimeMillis() - startTime)); + + String msg = message.toString(); + if (error == null) { + printMessage(msg, out, Project.MSG_VERBOSE); + } else { + printMessage(msg, err, Project.MSG_ERR); + } + log(msg); + } + + /** + * This is an override point: the message that indicates whether a build failed. + * Subclasses can change/enhance the message. + * @return The classic "BUILD FAILED" + */ + protected String getBuildFailedMessage() { + return "BUILD FAILED"; + } + + /** + * This is an override point: the message that indicates that a build succeeded. + * Subclasses can change/enhance the message. + * @return The classic "BUILD SUCCESSFUL" + */ + protected String getBuildSuccessfulMessage() { + return "BUILD SUCCESSFUL"; + } + + /** + * Logs a message to say that the target has started if this + * logger allows information-level messages. + * + * @param event An event with any relevant extra information. + * Must not be null. + */ + public void targetStarted(BuildEvent event) { + if (Project.MSG_INFO <= msgOutputLevel + && !event.getTarget().getName().equals("")) { + String msg = StringUtils.LINE_SEP + + event.getTarget().getName() + ":"; + printMessage(msg, out, event.getPriority()); + log(msg); + } + } + + /** + * No-op implementation. + * + * @param event Ignored. + */ + public void targetFinished(BuildEvent event) { + } + + /** + * No-op implementation. + * + * @param event Ignored. + */ + public void taskStarted(BuildEvent event) { + } + + /** + * No-op implementation. + * + * @param event Ignored. + */ + public void taskFinished(BuildEvent event) { + } + + /** + * Logs a message, if the priority is suitable. + * In non-emacs mode, task level messages are prefixed by the + * task name which is right-justified. + * + * @param event A BuildEvent containing message information. + * Must not be null. + */ + public void messageLogged(BuildEvent event) { + int priority = event.getPriority(); + // Filter out messages based on priority + if (priority <= msgOutputLevel) { + + StringBuffer message = new StringBuffer(); + if (event.getTask() != null && !emacsMode) { + // Print out the name of the task if we're in one + String name = event.getTask().getTaskName(); + String label = "[" + name + "] "; + int size = LEFT_COLUMN_SIZE - label.length(); + StringBuffer tmp = new StringBuffer(); + for (int i = 0; i < size; i++) { + tmp.append(" "); + } + tmp.append(label); + label = tmp.toString(); + + BufferedReader r = null; + try { + r = new BufferedReader( + new StringReader(event.getMessage())); + String line = r.readLine(); + boolean first = true; + do { + if (first) { + if (line == null) { + message.append(label); + break; + } + } else { + message.append(StringUtils.LINE_SEP); + } + first = false; + message.append(label).append(line); + line = r.readLine(); + } while (line != null); + } catch (IOException e) { + // shouldn't be possible + message.append(label).append(event.getMessage()); + } finally { + if (r != null) { + FileUtils.close(r); + } + } + + } else { + //emacs mode or there is no task + message.append(event.getMessage()); + } + Throwable ex = event.getException(); + if (Project.MSG_DEBUG <= msgOutputLevel && ex != null) { + message.append(StringUtils.getStackTrace(ex)); + } + + String msg = message.toString(); + if (priority != Project.MSG_ERR) { + printMessage(msg, out, priority); + } else { + printMessage(msg, err, priority); + } + log(msg); + } + } + + /** + * Convenience method to format a specified length of time. + * + * @param millis Length of time to format, in milliseconds. + * + * @return the time as a formatted string. + * + * @see DateUtils#formatElapsedTime(long) + */ + protected static String formatTime(final long millis) { + return DateUtils.formatElapsedTime(millis); + } + + /** + * Prints a message to a PrintStream. + * + * @param message The message to print. + * Should not be null. + * @param stream A PrintStream to print the message to. + * Must not be null. + * @param priority The priority of the message. + * (Ignored in this implementation.) + */ + protected void printMessage(final String message, + final PrintStream stream, + final int priority) { + stream.println(message); + } + + /** + * Empty implementation which allows subclasses to receive the + * same output that is generated here. + * + * @param message Message being logged. Should not be null. + */ + protected void log(String message) { + } + + /** + * Get the current time. + * @return the current time as a formatted string. + * @since Ant1.7.1 + */ + protected String getTimestamp() { + Date date = new Date(System.currentTimeMillis()); + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + String finishTime = formatter.format(date); + return finishTime; + } + + /** + * Get the project name or null + * @param event the event + * @return the project that raised this event + * @since Ant1.7.1 + */ + protected String extractProjectName(BuildEvent event) { + Project project = event.getProject(); + return (project != null) ? project.getName() : null; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxInputStream.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxInputStream.java new file mode 100644 index 00000000..ea263ca7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxInputStream.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.IOException; +import java.io.InputStream; + +/** + * + * Passes input requests to the project object for demuxing into + * individual tasks and threads. + * + * @since Ant 1.6 + */ +public class DemuxInputStream extends InputStream { + + private static final int MASK_8BIT = 0xFF; + /** + * The project to from which to get input. + */ + private Project project; + + /** + * Create a DemuxInputStream for the given project + * + * @param project the project instance + */ + public DemuxInputStream(Project project) { + this.project = project; + } + + /** + * Read a byte from the project's demuxed input. + * @return the next byte + * @throws IOException on error + */ + public int read() throws IOException { + byte[] buffer = new byte[1]; + if (project.demuxInput(buffer, 0, 1) == -1) { + return -1; + } + return buffer[0] & MASK_8BIT; + } + + + /** + * Read bytes from the project's demuxed input. + * @param buffer an array of bytes to read into + * @param offset the offset in the array of bytes + * @param length the number of bytes in the array + * @return the number of bytes read + * @throws IOException on error + */ + public int read(byte[] buffer, int offset, int length) throws IOException { + return project.demuxInput(buffer, offset, length); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxOutputStream.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxOutputStream.java new file mode 100644 index 00000000..bd399132 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DemuxOutputStream.java @@ -0,0 +1,249 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.WeakHashMap; + + +/** + * Logs content written by a thread and forwards the buffers onto the + * project object which will forward the content to the appropriate + * task. + * + * @since 1.4 + */ +public class DemuxOutputStream extends OutputStream { + + /** + * A data class to store information about a buffer. Such information + * is stored on a per-thread basis. + */ + private static class BufferInfo { + /** + * The per-thread output stream. + */ + private ByteArrayOutputStream buffer; + + /** + * Indicates we have just seen a carriage return. It may be part of + * a crlf pair or a single cr invoking processBuffer twice. + */ + private boolean crSeen = false; + } + + /** Maximum buffer size. */ + private static final int MAX_SIZE = 1024; + + /** Initial buffer size. */ + private static final int INITIAL_SIZE = 132; + + /** Carriage return */ + private static final int CR = 0x0d; + + /** Linefeed */ + private static final int LF = 0x0a; + + /** Mapping from thread to buffer (Thread to BufferInfo). */ + private WeakHashMap buffers = new WeakHashMap(); + + /** + * The project to send output to. + */ + private Project project; + + /** + * Whether or not this stream represents an error stream. + */ + private boolean isErrorStream; + + /** + * Creates a new instance of this class. + * + * @param project The project instance for which output is being + * demultiplexed. Must not be null. + * @param isErrorStream true if this is the error string, + * otherwise a normal output stream. This is + * passed to the project so it knows + * which stream it is receiving. + */ + public DemuxOutputStream(Project project, boolean isErrorStream) { + this.project = project; + this.isErrorStream = isErrorStream; + } + + /** + * Returns the buffer associated with the current thread. + * + * @return a BufferInfo for the current thread to write data to + */ + private BufferInfo getBufferInfo() { + Thread current = Thread.currentThread(); + BufferInfo bufferInfo = (BufferInfo) buffers.get(current); + if (bufferInfo == null) { + bufferInfo = new BufferInfo(); + bufferInfo.buffer = new ByteArrayOutputStream(INITIAL_SIZE); + bufferInfo.crSeen = false; + buffers.put(current, bufferInfo); + } + return bufferInfo; + } + + /** + * Resets the buffer for the current thread. + */ + private void resetBufferInfo() { + Thread current = Thread.currentThread(); + BufferInfo bufferInfo = (BufferInfo) buffers.get(current); + try { + bufferInfo.buffer.close(); + } catch (IOException e) { + // Shouldn't happen + } + bufferInfo.buffer = new ByteArrayOutputStream(); + bufferInfo.crSeen = false; + } + + /** + * Removes the buffer for the current thread. + */ + private void removeBuffer() { + Thread current = Thread.currentThread(); + buffers.remove (current); + } + + /** + * Writes the data to the buffer and flushes the buffer if a line + * separator is detected or if the buffer has reached its maximum size. + * + * @param cc data to log (byte). + * @exception IOException if the data cannot be written to the stream + */ + public void write(int cc) throws IOException { + final byte c = (byte) cc; + + BufferInfo bufferInfo = getBufferInfo(); + + if (c == '\n') { + // LF is always end of line (i.e. CRLF or single LF) + bufferInfo.buffer.write(cc); + processBuffer(bufferInfo.buffer); + } else { + if (bufferInfo.crSeen) { + // CR without LF - send buffer then add char + processBuffer(bufferInfo.buffer); + } + // add into buffer + bufferInfo.buffer.write(cc); + } + bufferInfo.crSeen = (c == '\r'); + if (!bufferInfo.crSeen && bufferInfo.buffer.size() > MAX_SIZE) { + processBuffer(bufferInfo.buffer); + } + } + + /** + * Converts the buffer to a string and sends it to the project. + * + * @param buffer the ByteArrayOutputStream used to collect the output + * until a line separator is seen. + * + * @see Project#demuxOutput(String,boolean) + */ + protected void processBuffer(ByteArrayOutputStream buffer) { + String output = buffer.toString(); + project.demuxOutput(output, isErrorStream); + resetBufferInfo(); + } + + /** + * Converts the buffer to a string and sends it to the project. + * + * @param buffer the ByteArrayOutputStream used to collect the output + * until a line separator is seen. + * + * @see Project#demuxOutput(String,boolean) + */ + protected void processFlush(ByteArrayOutputStream buffer) { + String output = buffer.toString(); + project.demuxFlush(output, isErrorStream); + resetBufferInfo(); + } + + /** + * Equivalent to flushing the stream. + * + * @exception IOException if there is a problem closing the stream. + * + * @see #flush + */ + public void close() throws IOException { + flush(); + removeBuffer(); + } + + /** + * Writes all remaining data in the buffer associated + * with the current thread to the project. + * + * @exception IOException if there is a problem flushing the stream. + */ + public void flush() throws IOException { + BufferInfo bufferInfo = getBufferInfo(); + if (bufferInfo.buffer.size() > 0) { + processFlush(bufferInfo.buffer); + } + } + + /** + * Write a block of characters to the output stream + * + * @param b the array containing the data + * @param off the offset into the array where data starts + * @param len the length of block + * + * @throws IOException if the data cannot be written into the stream. + */ + public void write(byte[] b, int off, int len) throws IOException { + // find the line breaks and pass other chars through in blocks + int offset = off; + int blockStartOffset = offset; + int remaining = len; + BufferInfo bufferInfo = getBufferInfo(); + while (remaining > 0) { + while (remaining > 0 && b[offset] != LF && b[offset] != CR) { + offset++; + remaining--; + } + // either end of buffer or a line separator char + int blockLength = offset - blockStartOffset; + if (blockLength > 0) { + bufferInfo.buffer.write(b, blockStartOffset, blockLength); + } + while (remaining > 0 && (b[offset] == LF || b[offset] == CR)) { + write(b[offset]); + offset++; + remaining--; + } + blockStartOffset = offset; + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Diagnostics.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Diagnostics.java new file mode 100644 index 00000000..6389f6ee --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Diagnostics.java @@ -0,0 +1,715 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.Calendar; +import java.util.Enumeration; +import java.util.Properties; +import java.util.TimeZone; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; + +import org.apache.tools.ant.launch.Launcher; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.JAXPUtils; +import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.util.ProxySetup; +import org.xml.sax.XMLReader; + +/** + * A little diagnostic helper that output some information that may help + * in support. It should quickly give correct information about the + * jar existing in ant.home/lib and the jar versions... + * + * @since Ant 1.5 + */ +public final class Diagnostics { + + /** the version number for java 1.5 returned from JavaEnvUtils */ + private static final int JAVA_1_5_NUMBER = 15; + + /** + * value for which a difference between clock and temp file time triggers + * a warning. + * {@value} + */ + private static final int BIG_DRIFT_LIMIT = 10000; + + /** + * How big a test file to write. + * {@value} + */ + private static final int TEST_FILE_SIZE = 32; + private static final int KILOBYTE = 1024; + private static final int SECONDS_PER_MILLISECOND = 1000; + private static final int SECONDS_PER_MINUTE = 60; + private static final int MINUTES_PER_HOUR = 60; + + /** + * The error text when a security manager blocks access to a property. + * {@value} + */ + protected static final String ERROR_PROPERTY_ACCESS_BLOCKED + = "Access to this property blocked by a security manager"; + + /** utility class */ + private Diagnostics() { + // hidden constructor + } + + /** + * Doesn't do anything. + * @deprecated Obsolete since Ant 1.8.2 + * @return true + */ + public static boolean isOptionalAvailable() { + return true; + } + + /** + * Doesn't do anything. + * @deprecated Obsolete since Ant 1.8.2 + */ + public static void validateVersion() throws BuildException { + } + + /** + * return the list of jar files existing in ANT_HOME/lib + * and that must have been picked up by Ant script. + * @return the list of jar files existing in ant.home/lib or + * null if an error occurs. + */ + public static File[] listLibraries() { + String home = System.getProperty(MagicNames.ANT_HOME); + if (home == null) { + return null; + } + File libDir = new File(home, "lib"); + return listJarFiles(libDir); + + } + + /** + * get a list of all JAR files in a directory + * @param libDir directory + * @return array of files (or null for no such directory) + */ + private static File[] listJarFiles(File libDir) { + FilenameFilter filter = new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.endsWith(".jar"); + } + }; + File[] files = libDir.listFiles(filter); + return files; + } + + /** + * main entry point for command line + * @param args command line arguments. + */ + public static void main(String[] args) { + doReport(System.out); + } + + /** + * Helper method to get the implementation version. + * @param clazz the class to get the information from. + * @return null if there is no package or implementation version. + * '?.?' for JDK 1.0 or 1.1. + */ + private static String getImplementationVersion(Class clazz) { + return clazz.getPackage().getImplementationVersion(); + } + + /** + * Helper method to get the location. + * @param clazz the class to get the information from. + * @since Ant 1.8.0 + */ + private static URL getClassLocation(Class clazz) { + if (clazz.getProtectionDomain().getCodeSource() == null) { + return null; + } + return clazz.getProtectionDomain().getCodeSource().getLocation(); + } + + /** + * what parser are we using. + * @return the classname of the parser + */ + private static String getXMLParserName() { + SAXParser saxParser = getSAXParser(); + if (saxParser == null) { + return "Could not create an XML Parser"; + } + // check to what is in the classname + String saxParserName = saxParser.getClass().getName(); + return saxParserName; + } + + /** + * what parser are we using. + * @return the classname of the parser + */ + private static String getXSLTProcessorName() { + Transformer transformer = getXSLTProcessor(); + if (transformer == null) { + return "Could not create an XSLT Processor"; + } + // check to what is in the classname + String processorName = transformer.getClass().getName(); + return processorName; + } + + /** + * Create a JAXP SAXParser + * @return parser or null for trouble + */ + private static SAXParser getSAXParser() { + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + if (saxParserFactory == null) { + return null; + } + SAXParser saxParser = null; + try { + saxParser = saxParserFactory.newSAXParser(); + } catch (Exception e) { + // ignore + ignoreThrowable(e); + } + return saxParser; + } + + /** + * Create a JAXP XSLT Transformer + * @return parser or null for trouble + */ + private static Transformer getXSLTProcessor() { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + if (transformerFactory == null) { + return null; + } + Transformer transformer = null; + try { + transformer = transformerFactory.newTransformer(); + } catch (Exception e) { + // ignore + ignoreThrowable(e); + } + return transformer; + } + + /** + * get the location of the parser + * @return path or null for trouble in tracking it down + */ + private static String getXMLParserLocation() { + SAXParser saxParser = getSAXParser(); + if (saxParser == null) { + return null; + } + URL location = getClassLocation(saxParser.getClass()); + return location != null ? location.toString() : null; + } + + private static String getNamespaceParserName() { + try { + XMLReader reader = JAXPUtils.getNamespaceXMLReader(); + return reader.getClass().getName(); + } catch (BuildException e) { + //ignore + ignoreThrowable(e); + return null; + } + } + + private static String getNamespaceParserLocation() { + try { + XMLReader reader = JAXPUtils.getNamespaceXMLReader(); + URL location = getClassLocation(reader.getClass()); + return location != null ? location.toString() : null; + } catch (BuildException e) { + //ignore + ignoreThrowable(e); + return null; + } + } + + /** + * get the location of the parser + * @return path or null for trouble in tracking it down + */ + private static String getXSLTProcessorLocation() { + Transformer transformer = getXSLTProcessor(); + if (transformer == null) { + return null; + } + URL location = getClassLocation(transformer.getClass()); + return location != null ? location.toString() : null; + } + + /** + * ignore exceptions. This is to allow future + * implementations to log at a verbose level + * @param thrown + */ + private static void ignoreThrowable(Throwable thrown) { + } + + + /** + * Print a report to the given stream. + * @param out the stream to print the report to. + */ + public static void doReport(PrintStream out) { + doReport(out, Project.MSG_INFO); + } + + /** + * Print a report to the given stream. + * @param out the stream to print the report to. + * @param logLevel denotes the level of detail requested as one of + * Project's MSG_* constants. + */ + public static void doReport(PrintStream out, int logLevel) { + out.println("------- Ant diagnostics report -------"); + out.println(Main.getAntVersion()); + header(out, "Implementation Version"); + + out.println("core tasks : " + getImplementationVersion(Main.class) + + " in " + getClassLocation(Main.class)); + + header(out, "ANT PROPERTIES"); + doReportAntProperties(out); + + header(out, "ANT_HOME/lib jar listing"); + doReportAntHomeLibraries(out); + + header(out, "USER_HOME/.ant/lib jar listing"); + doReportUserHomeLibraries(out); + + header(out, "Tasks availability"); + doReportTasksAvailability(out); + + header(out, "org.apache.env.Which diagnostics"); + doReportWhich(out); + + header(out, "XML Parser information"); + doReportParserInfo(out); + + header(out, "XSLT Processor information"); + doReportXSLTProcessorInfo(out); + + header(out, "System properties"); + doReportSystemProperties(out); + + header(out, "Temp dir"); + doReportTempDir(out); + + header(out, "Locale information"); + doReportLocale(out); + + header(out, "Proxy information"); + doReportProxy(out); + + out.println(); + } + + private static void header(PrintStream out, String section) { + out.println(); + out.println("-------------------------------------------"); + out.print(" "); + out.println(section); + out.println("-------------------------------------------"); + } + + /** + * Report a listing of system properties existing in the current vm. + * @param out the stream to print the properties to. + */ + private static void doReportSystemProperties(PrintStream out) { + Properties sysprops = null; + try { + sysprops = System.getProperties(); + } catch (SecurityException e) { + ignoreThrowable(e); + out.println("Access to System.getProperties() blocked " + "by a security manager"); + return; + } + for (Enumeration keys = sysprops.propertyNames(); + keys.hasMoreElements();) { + String key = (String) keys.nextElement(); + String value = getProperty(key); + out.println(key + " : " + value); + } + } + + /** + * Get the value of a system property. If a security manager + * blocks access to a property it fills the result in with an error + * @param key + * @return the system property's value or error text + * @see #ERROR_PROPERTY_ACCESS_BLOCKED + */ + private static String getProperty(String key) { + String value; + try { + value = System.getProperty(key); + } catch (SecurityException e) { + value = ERROR_PROPERTY_ACCESS_BLOCKED; + } + return value; + } + + /** + * Report the content of ANT_HOME/lib directory + * @param out the stream to print the content to + */ + private static void doReportAntProperties(PrintStream out) { + Project p = new Project(); + p.initProperties(); + out.println(MagicNames.ANT_VERSION + ": " + p.getProperty(MagicNames.ANT_VERSION)); + out.println(MagicNames.ANT_JAVA_VERSION + ": " + + p.getProperty(MagicNames.ANT_JAVA_VERSION)); + out.println("Is this the Apache Harmony VM? " + + (JavaEnvUtils.isApacheHarmony() ? "yes" : "no")); + out.println("Is this the Kaffe VM? " + + (JavaEnvUtils.isKaffe() ? "yes" : "no")); + out.println("Is this gij/gcj? " + + (JavaEnvUtils.isGij() ? "yes" : "no")); + out.println(MagicNames.ANT_LIB + ": " + p.getProperty(MagicNames.ANT_LIB)); + out.println(MagicNames.ANT_HOME + ": " + p.getProperty(MagicNames.ANT_HOME)); + } + + /** + * Report the content of ANT_HOME/lib directory + * @param out the stream to print the content to + */ + private static void doReportAntHomeLibraries(PrintStream out) { + out.println(MagicNames.ANT_HOME + ": " + System.getProperty(MagicNames.ANT_HOME)); + File[] libs = listLibraries(); + printLibraries(libs, out); + } + + /** + * Report the content of ~/.ant/lib directory + * + * @param out the stream to print the content to + */ + private static void doReportUserHomeLibraries(PrintStream out) { + String home = System.getProperty(Launcher.USER_HOMEDIR); + out.println("user.home: " + home); + File libDir = new File(home, Launcher.USER_LIBDIR); + File[] libs = listJarFiles(libDir); + printLibraries(libs, out); + } + + /** + * list the libraries + * @param libs array of libraries (can be null) + * @param out output stream + */ + private static void printLibraries(File[] libs, PrintStream out) { + if (libs == null) { + out.println("No such directory."); + return; + } + for (int i = 0; i < libs.length; i++) { + out.println(libs[i].getName() + " (" + libs[i].length() + " bytes)"); + } + } + + + /** + * Call org.apache.env.Which if available + * @param out the stream to print the content to. + */ + private static void doReportWhich(PrintStream out) { + Throwable error = null; + try { + Class which = Class.forName("org.apache.env.Which"); + Method method = which.getMethod( + "main", new Class[] {String[].class}); + method.invoke(null, new Object[]{new String[]{}}); + } catch (ClassNotFoundException e) { + out.println("Not available."); + out.println("Download it at http://xml.apache.org/commons/"); + } catch (InvocationTargetException e) { + error = e.getTargetException() == null ? e : e.getTargetException(); + } catch (Throwable e) { + error = e; + } + // report error if something weird happens...this is diagnostic. + if (error != null) { + out.println("Error while running org.apache.env.Which"); + error.printStackTrace(); + } + } + + /** + * Create a report about non-available tasks that are defined in the + * mapping but could not be found via lookup. It might generally happen + * because Ant requires multiple libraries to compile and one of them + * was missing when compiling Ant. + * @param out the stream to print the tasks report to + * null for a missing stream (ie mapping). + */ + private static void doReportTasksAvailability(PrintStream out) { + InputStream is = Main.class.getResourceAsStream( + MagicNames.TASKDEF_PROPERTIES_RESOURCE); + if (is == null) { + out.println("None available"); + } else { + Properties props = new Properties(); + try { + props.load(is); + for (Enumeration keys = props.keys(); keys.hasMoreElements();) { + String key = (String) keys.nextElement(); + String classname = props.getProperty(key); + try { + Class.forName(classname); + props.remove(key); + } catch (ClassNotFoundException e) { + out.println(key + " : Not Available " + + "(the implementation class is not present)"); + } catch (NoClassDefFoundError e) { + String pkg = e.getMessage().replace('/', '.'); + out.println(key + " : Missing dependency " + pkg); + } catch (LinkageError e) { + out.println(key + " : Initialization error"); + } + } + if (props.size() == 0) { + out.println("All defined tasks are available"); + } else { + out.println("A task being missing/unavailable should only " + + "matter if you are trying to use it"); + } + } catch (IOException e) { + out.println(e.getMessage()); + } + } + } + + /** + * tell the user about the XML parser + * @param out + */ + private static void doReportParserInfo(PrintStream out) { + String parserName = getXMLParserName(); + String parserLocation = getXMLParserLocation(); + printParserInfo(out, "XML Parser", parserName, parserLocation); + printParserInfo(out, "Namespace-aware parser", getNamespaceParserName(), + getNamespaceParserLocation()); + } + + /** + * tell the user about the XSLT processor + * @param out + */ + private static void doReportXSLTProcessorInfo(PrintStream out) { + String processorName = getXSLTProcessorName(); + String processorLocation = getXSLTProcessorLocation(); + printParserInfo(out, "XSLT Processor", processorName, processorLocation); + } + + private static void printParserInfo(PrintStream out, String parserType, String parserName, + String parserLocation) { + if (parserName == null) { + parserName = "unknown"; + } + if (parserLocation == null) { + parserLocation = "unknown"; + } + out.println(parserType + " : " + parserName); + out.println(parserType + " Location: " + parserLocation); + } + + /** + * try and create a temp file in our temp dir; this + * checks that it has space and access. + * We also do some clock reporting. + * @param out + */ + private static void doReportTempDir(PrintStream out) { + String tempdir = System.getProperty("java.io.tmpdir"); + if (tempdir == null) { + out.println("Warning: java.io.tmpdir is undefined"); + return; + } + out.println("Temp dir is " + tempdir); + File tempDirectory = new File(tempdir); + if (!tempDirectory.exists()) { + out.println("Warning, java.io.tmpdir directory does not exist: " + tempdir); + return; + } + //create the file + long now = System.currentTimeMillis(); + File tempFile = null; + FileOutputStream fileout = null; + FileInputStream filein = null; + try { + tempFile = File.createTempFile("diag", "txt", tempDirectory); + //do some writing to it + fileout = new FileOutputStream(tempFile); + byte[] buffer = new byte[KILOBYTE]; + for (int i = 0; i < TEST_FILE_SIZE; i++) { + fileout.write(buffer); + } + fileout.close(); + fileout = null; + + // read to make sure the file has been written completely + Thread.sleep(1000); + filein = new FileInputStream(tempFile); + int total = 0; + int read = 0; + while ((read = filein.read(buffer, 0, KILOBYTE)) > 0) { + total += read; + } + filein.close(); + filein = null; + + long filetime = tempFile.lastModified(); + long drift = filetime - now; + tempFile.delete(); + + out.print("Temp dir is writeable"); + if (total != TEST_FILE_SIZE * KILOBYTE) { + out.println(", but seems to be full. Wrote " + + (TEST_FILE_SIZE * KILOBYTE) + + "but could only read " + total + " bytes."); + } else { + out.println(); + } + + out.println("Temp dir alignment with system clock is " + drift + " ms"); + if (Math.abs(drift) > BIG_DRIFT_LIMIT) { + out.println("Warning: big clock drift -maybe a network filesystem"); + } + } catch (IOException e) { + ignoreThrowable(e); + out.println("Failed to create a temporary file in the temp dir " + tempdir); + out.println("File " + tempFile + " could not be created/written to"); + } catch (InterruptedException e) { + ignoreThrowable(e); + out.println("Failed to check whether tempdir is writable"); + } finally { + FileUtils.close(fileout); + FileUtils.close(filein); + if (tempFile != null && tempFile.exists()) { + tempFile.delete(); + } + } + } + + /** + * Report locale information + * @param out stream to print to + */ + private static void doReportLocale(PrintStream out) { + //calendar stuff. + Calendar cal = Calendar.getInstance(); + TimeZone tz = cal.getTimeZone(); + out.println("Timezone " + + tz.getDisplayName() + + " offset=" + + tz.getOffset(cal.get(Calendar.ERA), cal.get(Calendar.YEAR), cal + .get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal + .get(Calendar.DAY_OF_WEEK), ((cal.get(Calendar.HOUR_OF_DAY) + * MINUTES_PER_HOUR + cal.get(Calendar.MINUTE)) + * SECONDS_PER_MINUTE + cal.get(Calendar.SECOND)) + * SECONDS_PER_MILLISECOND + cal.get(Calendar.MILLISECOND))); + } + + /** + * print a property name="value" pair if the property is set; + * print nothing if it is null + * @param out stream to print on + * @param key property name + */ + private static void printProperty(PrintStream out, String key) { + String value = getProperty(key); + if (value != null) { + out.print(key); + out.print(" = "); + out.print('"'); + out.print(value); + out.println('"'); + } + } + + /** + * Report proxy information + * + * @param out stream to print to + * @since Ant1.7 + */ + private static void doReportProxy(PrintStream out) { + printProperty(out, ProxySetup.HTTP_PROXY_HOST); + printProperty(out, ProxySetup.HTTP_PROXY_PORT); + printProperty(out, ProxySetup.HTTP_PROXY_USERNAME); + printProperty(out, ProxySetup.HTTP_PROXY_PASSWORD); + printProperty(out, ProxySetup.HTTP_NON_PROXY_HOSTS); + printProperty(out, ProxySetup.HTTPS_PROXY_HOST); + printProperty(out, ProxySetup.HTTPS_PROXY_PORT); + printProperty(out, ProxySetup.HTTPS_NON_PROXY_HOSTS); + printProperty(out, ProxySetup.FTP_PROXY_HOST); + printProperty(out, ProxySetup.FTP_PROXY_PORT); + printProperty(out, ProxySetup.FTP_NON_PROXY_HOSTS); + printProperty(out, ProxySetup.SOCKS_PROXY_HOST); + printProperty(out, ProxySetup.SOCKS_PROXY_PORT); + printProperty(out, ProxySetup.SOCKS_PROXY_USERNAME); + printProperty(out, ProxySetup.SOCKS_PROXY_PASSWORD); + + if (JavaEnvUtils.getJavaVersionNumber() < JAVA_1_5_NUMBER) { + return; + } + printProperty(out, ProxySetup.USE_SYSTEM_PROXIES); + final String proxyDiagClassname = "org.apache.tools.ant.util.java15.ProxyDiagnostics"; + try { + Class proxyDiagClass = Class.forName(proxyDiagClassname); + Object instance = proxyDiagClass.newInstance(); + out.println("Java1.5+ proxy settings:"); + out.println(instance.toString()); + } catch (ClassNotFoundException e) { + //not included, do nothing + } catch (IllegalAccessException e) { + //not included, do nothing + } catch (InstantiationException e) { + //not included, do nothing + } catch (NoClassDefFoundError e) { + // not included, to nothing + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DirectoryScanner.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DirectoryScanner.java new file mode 100644 index 00000000..709779a7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DirectoryScanner.java @@ -0,0 +1,1900 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Map; +import java.util.Set; +import java.util.Vector; + +import org.apache.tools.ant.taskdefs.condition.Os; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.ResourceFactory; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.types.selectors.FileSelector; +import org.apache.tools.ant.types.selectors.SelectorScanner; +import org.apache.tools.ant.types.selectors.SelectorUtils; +import org.apache.tools.ant.types.selectors.TokenizedPath; +import org.apache.tools.ant.types.selectors.TokenizedPattern; +import org.apache.tools.ant.util.CollectionUtils; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.SymbolicLinkUtils; +import org.apache.tools.ant.util.VectorSet; + +/** + * Class for scanning a directory for files/directories which match certain + * criteria. + *

    + * These criteria consist of selectors and patterns which have been specified. + * With the selectors you can select which files you want to have included. + * Files which are not selected are excluded. With patterns you can include + * or exclude files based on their filename. + *

    + * The idea is simple. A given directory is recursively scanned for all files + * and directories. Each file/directory is matched against a set of selectors, + * including special support for matching against filenames with include and + * and exclude patterns. Only files/directories which match at least one + * pattern of the include pattern list or other file selector, and don't match + * any pattern of the exclude pattern list or fail to match against a required + * selector will be placed in the list of files/directories found. + *

    + * When no list of include patterns is supplied, "**" will be used, which + * means that everything will be matched. When no list of exclude patterns is + * supplied, an empty list is used, such that nothing will be excluded. When + * no selectors are supplied, none are applied. + *

    + * The filename pattern matching is done as follows: + * The name to be matched is split up in path segments. A path segment is the + * name of a directory or file, which is bounded by + * File.separator ('/' under UNIX, '\' under Windows). + * For example, "abc/def/ghi/xyz.java" is split up in the segments "abc", + * "def","ghi" and "xyz.java". + * The same is done for the pattern against which should be matched. + *

    + * The segments of the name and the pattern are then matched against each + * other. When '**' is used for a path segment in the pattern, it matches + * zero or more path segments of the name. + *

    + * There is a special case regarding the use of File.separators + * at the beginning of the pattern and the string to match:
    + * When a pattern starts with a File.separator, the string + * to match must also start with a File.separator. + * When a pattern does not start with a File.separator, the + * string to match may not start with a File.separator. + * When one of these rules is not obeyed, the string will not + * match. + *

    + * When a name path segment is matched against a pattern path segment, the + * following special characters can be used:
    + * '*' matches zero or more characters
    + * '?' matches one character. + *

    + * Examples: + *

    + * "**\*.class" matches all .class files/dirs in a directory tree. + *

    + * "test\a??.java" matches all files/dirs which start with an 'a', then two + * more characters and then ".java", in a directory called test. + *

    + * "**" matches everything in a directory tree. + *

    + * "**\test\**\XYZ*" matches all files/dirs which start with "XYZ" and where + * there is a parent directory called test (e.g. "abc\test\def\ghi\XYZ123"). + *

    + * Case sensitivity may be turned off if necessary. By default, it is + * turned on. + *

    + * Example of usage: + *

    + *   String[] includes = {"**\\*.class"};
    + *   String[] excludes = {"modules\\*\\**"};
    + *   ds.setIncludes(includes);
    + *   ds.setExcludes(excludes);
    + *   ds.setBasedir(new File("test"));
    + *   ds.setCaseSensitive(true);
    + *   ds.scan();
    + *
    + *   System.out.println("FILES:");
    + *   String[] files = ds.getIncludedFiles();
    + *   for (int i = 0; i < files.length; i++) {
    + *     System.out.println(files[i]);
    + *   }
    + * 
    + * This will scan a directory called test for .class files, but excludes all + * files in all proper subdirectories of a directory called "modules". + * + */ +public class DirectoryScanner + implements FileScanner, SelectorScanner, ResourceFactory { + + /** Is OpenVMS the operating system we're running on? */ + private static final boolean ON_VMS = Os.isFamily("openvms"); + + /** + * Patterns which should be excluded by default. + * + *

    Note that you can now add patterns to the list of default + * excludes. Added patterns will not become part of this array + * that has only been kept around for backwards compatibility + * reasons.

    + * + * @deprecated since 1.6.x. + * Use the {@link #getDefaultExcludes getDefaultExcludes} + * method instead. + */ + @Deprecated + protected static final String[] DEFAULTEXCLUDES = { + // Miscellaneous typical temporary files + SelectorUtils.DEEP_TREE_MATCH + "/*~", + SelectorUtils.DEEP_TREE_MATCH + "/#*#", + SelectorUtils.DEEP_TREE_MATCH + "/.#*", + SelectorUtils.DEEP_TREE_MATCH + "/%*%", + SelectorUtils.DEEP_TREE_MATCH + "/._*", + + // CVS + SelectorUtils.DEEP_TREE_MATCH + "/CVS", + SelectorUtils.DEEP_TREE_MATCH + "/CVS/" + SelectorUtils.DEEP_TREE_MATCH, + SelectorUtils.DEEP_TREE_MATCH + "/.cvsignore", + + // SCCS + SelectorUtils.DEEP_TREE_MATCH + "/SCCS", + SelectorUtils.DEEP_TREE_MATCH + "/SCCS/" + SelectorUtils.DEEP_TREE_MATCH, + + // Visual SourceSafe + SelectorUtils.DEEP_TREE_MATCH + "/vssver.scc", + + // Subversion + SelectorUtils.DEEP_TREE_MATCH + "/.svn", + SelectorUtils.DEEP_TREE_MATCH + "/.svn/" + SelectorUtils.DEEP_TREE_MATCH, + + // Git + SelectorUtils.DEEP_TREE_MATCH + "/.git", + SelectorUtils.DEEP_TREE_MATCH + "/.git/" + SelectorUtils.DEEP_TREE_MATCH, + SelectorUtils.DEEP_TREE_MATCH + "/.gitattributes", + SelectorUtils.DEEP_TREE_MATCH + "/.gitignore", + SelectorUtils.DEEP_TREE_MATCH + "/.gitmodules", + + // Mercurial + SelectorUtils.DEEP_TREE_MATCH + "/.hg", + SelectorUtils.DEEP_TREE_MATCH + "/.hg/" + SelectorUtils.DEEP_TREE_MATCH, + SelectorUtils.DEEP_TREE_MATCH + "/.hgignore", + SelectorUtils.DEEP_TREE_MATCH + "/.hgsub", + SelectorUtils.DEEP_TREE_MATCH + "/.hgsubstate", + SelectorUtils.DEEP_TREE_MATCH + "/.hgtags", + + // Bazaar + SelectorUtils.DEEP_TREE_MATCH + "/.bzr", + SelectorUtils.DEEP_TREE_MATCH + "/.bzr/" + SelectorUtils.DEEP_TREE_MATCH, + SelectorUtils.DEEP_TREE_MATCH + "/.bzrignore", + + // Mac + SelectorUtils.DEEP_TREE_MATCH + "/.DS_Store" + }; + + /** + * default value for {@link #maxLevelsOfSymlinks maxLevelsOfSymlinks} + * @since Ant 1.8.0 + */ + public static final int MAX_LEVELS_OF_SYMLINKS = 5; + /** + * The end of the exception message if something that should be + * there doesn't exist. + */ + public static final String DOES_NOT_EXIST_POSTFIX = " does not exist."; + + /** Helper. */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** Helper. */ + private static final SymbolicLinkUtils SYMLINK_UTILS = + SymbolicLinkUtils.getSymbolicLinkUtils(); + + /** + * Patterns which should be excluded by default. + * + * @see #addDefaultExcludes() + */ + private static final Set defaultExcludes = new HashSet(); + static { + resetDefaultExcludes(); + } + + // CheckStyle:VisibilityModifier OFF - bc + + /** The base directory to be scanned. */ + protected File basedir; + + /** The patterns for the files to be included. */ + protected String[] includes; + + /** The patterns for the files to be excluded. */ + protected String[] excludes; + + /** Selectors that will filter which files are in our candidate list. */ + protected FileSelector[] selectors = null; + + /** + * The files which matched at least one include and no excludes + * and were selected. + */ + protected Vector filesIncluded; + + /** The files which did not match any includes or selectors. */ + protected Vector filesNotIncluded; + + /** + * The files which matched at least one include and at least + * one exclude. + */ + protected Vector filesExcluded; + + /** + * The directories which matched at least one include and no excludes + * and were selected. + */ + protected Vector dirsIncluded; + + /** The directories which were found and did not match any includes. */ + protected Vector dirsNotIncluded; + + /** + * The directories which matched at least one include and at least one + * exclude. + */ + protected Vector dirsExcluded; + + /** + * The files which matched at least one include and no excludes and + * which a selector discarded. + */ + protected Vector filesDeselected; + + /** + * The directories which matched at least one include and no excludes + * but which a selector discarded. + */ + protected Vector dirsDeselected; + + /** Whether or not our results were built by a slow scan. */ + protected boolean haveSlowResults = false; + + /** + * Whether or not the file system should be treated as a case sensitive + * one. + */ + protected boolean isCaseSensitive = true; + + /** + * Whether a missing base directory is an error. + * @since Ant 1.7.1 + */ + protected boolean errorOnMissingDir = true; + + /** + * Whether or not symbolic links should be followed. + * + * @since Ant 1.5 + */ + private boolean followSymlinks = true; + + /** Whether or not everything tested so far has been included. */ + protected boolean everythingIncluded = true; + + // CheckStyle:VisibilityModifier ON + + /** + * List of all scanned directories. + * + * @since Ant 1.6 + */ + private final Set scannedDirs = new HashSet(); + + /** + * Map of all include patterns that are full file names and don't + * contain any wildcards. + * + *

    Maps pattern string to TokenizedPath.

    + * + *

    If this instance is not case sensitive, the file names get + * turned to upper case.

    + * + *

    Gets lazily initialized on the first invocation of + * isIncluded or isExcluded and cleared at the end of the scan + * method (cleared in clearCaches, actually).

    + * + * @since Ant 1.8.0 + */ + private final Map includeNonPatterns = new HashMap(); + + /** + * Map of all exclude patterns that are full file names and don't + * contain any wildcards. + * + *

    Maps pattern string to TokenizedPath.

    + * + *

    If this instance is not case sensitive, the file names get + * turned to upper case.

    + * + *

    Gets lazily initialized on the first invocation of + * isIncluded or isExcluded and cleared at the end of the scan + * method (cleared in clearCaches, actually).

    + * + * @since Ant 1.8.0 + */ + private final Map excludeNonPatterns = new HashMap(); + + /** + * Array of all include patterns that contain wildcards. + * + *

    Gets lazily initialized on the first invocation of + * isIncluded or isExcluded and cleared at the end of the scan + * method (cleared in clearCaches, actually).

    + */ + private TokenizedPattern[] includePatterns; + + /** + * Array of all exclude patterns that contain wildcards. + * + *

    Gets lazily initialized on the first invocation of + * isIncluded or isExcluded and cleared at the end of the scan + * method (cleared in clearCaches, actually).

    + */ + private TokenizedPattern[] excludePatterns; + + /** + * Have the non-pattern sets and pattern arrays for in- and + * excludes been initialized? + * + * @since Ant 1.6.3 + */ + private boolean areNonPatternSetsReady = false; + + /** + * Scanning flag. + * + * @since Ant 1.6.3 + */ + private boolean scanning = false; + + /** + * Scanning lock. + * + * @since Ant 1.6.3 + */ + private final Object scanLock = new Object(); + + /** + * Slow scanning flag. + * + * @since Ant 1.6.3 + */ + private boolean slowScanning = false; + + /** + * Slow scanning lock. + * + * @since Ant 1.6.3 + */ + private final Object slowScanLock = new Object(); + + /** + * Exception thrown during scan. + * + * @since Ant 1.6.3 + */ + private IllegalStateException illegal = null; + + /** + * The maximum number of times a symbolic link may be followed + * during a scan. + * + * @since Ant 1.8.0 + */ + private int maxLevelsOfSymlinks = MAX_LEVELS_OF_SYMLINKS; + + + /** + * Absolute paths of all symlinks that haven't been followed but + * would have been if followsymlinks had been true or + * maxLevelsOfSymlinks had been higher. + * + * @since Ant 1.8.0 + */ + private final Set notFollowedSymlinks = new HashSet(); + + /** + * Sole constructor. + */ + public DirectoryScanner() { + } + + /** + * Test whether or not a given path matches the start of a given + * pattern up to the first "**". + *

    + * This is not a general purpose test and should only be used if you + * can live with false positives. For example, pattern=**\a + * and str=b will yield true. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * + * @return whether or not a given path matches the start of a given + * pattern up to the first "**". + */ + protected static boolean matchPatternStart(final String pattern, final String str) { + return SelectorUtils.matchPatternStart(pattern, str); + } + + /** + * Test whether or not a given path matches the start of a given + * pattern up to the first "**". + *

    + * This is not a general purpose test and should only be used if you + * can live with false positives. For example, pattern=**\a + * and str=b will yield true. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * @param isCaseSensitive Whether or not matching should be performed + * case sensitively. + * + * @return whether or not a given path matches the start of a given + * pattern up to the first "**". + */ + protected static boolean matchPatternStart(final String pattern, final String str, + final boolean isCaseSensitive) { + return SelectorUtils.matchPatternStart(pattern, str, isCaseSensitive); + } + + /** + * Test whether or not a given path matches a given pattern. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * + * @return true if the pattern matches against the string, + * or false otherwise. + */ + protected static boolean matchPath(final String pattern, final String str) { + return SelectorUtils.matchPath(pattern, str); + } + + /** + * Test whether or not a given path matches a given pattern. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * @param isCaseSensitive Whether or not matching should be performed + * case sensitively. + * + * @return true if the pattern matches against the string, + * or false otherwise. + */ + protected static boolean matchPath(final String pattern, final String str, + final boolean isCaseSensitive) { + return SelectorUtils.matchPath(pattern, str, isCaseSensitive); + } + + /** + * Test whether or not a string matches against a pattern. + * The pattern may contain two special characters:
    + * '*' means zero or more characters
    + * '?' means one and only one character + * + * @param pattern The pattern to match against. + * Must not be null. + * @param str The string which must be matched against the pattern. + * Must not be null. + * + * @return true if the string matches against the pattern, + * or false otherwise. + */ + public static boolean match(final String pattern, final String str) { + return SelectorUtils.match(pattern, str); + } + + /** + * Test whether or not a string matches against a pattern. + * The pattern may contain two special characters:
    + * '*' means zero or more characters
    + * '?' means one and only one character + * + * @param pattern The pattern to match against. + * Must not be null. + * @param str The string which must be matched against the pattern. + * Must not be null. + * @param isCaseSensitive Whether or not matching should be performed + * case sensitively. + * + * + * @return true if the string matches against the pattern, + * or false otherwise. + */ + protected static boolean match(final String pattern, final String str, + final boolean isCaseSensitive) { + return SelectorUtils.match(pattern, str, isCaseSensitive); + } + + + /** + * Get the list of patterns that should be excluded by default. + * + * @return An array of String based on the current + * contents of the defaultExcludes + * Set. + * + * @since Ant 1.6 + */ + public static String[] getDefaultExcludes() { + synchronized (defaultExcludes) { + return defaultExcludes.toArray(new String[defaultExcludes + .size()]); + } + } + + /** + * Add a pattern to the default excludes unless it is already a + * default exclude. + * + * @param s A string to add as an exclude pattern. + * @return true if the string was added; + * false if it already existed. + * + * @since Ant 1.6 + */ + public static boolean addDefaultExclude(final String s) { + synchronized (defaultExcludes) { + return defaultExcludes.add(s); + } + } + + /** + * Remove a string if it is a default exclude. + * + * @param s The string to attempt to remove. + * @return true if s was a default + * exclude (and thus was removed); + * false if s was not + * in the default excludes list to begin with. + * + * @since Ant 1.6 + */ + public static boolean removeDefaultExclude(final String s) { + synchronized (defaultExcludes) { + return defaultExcludes.remove(s); + } + } + + /** + * Go back to the hardwired default exclude patterns. + * + * @since Ant 1.6 + */ + public static void resetDefaultExcludes() { + synchronized (defaultExcludes) { + defaultExcludes.clear(); + for (int i = 0; i < DEFAULTEXCLUDES.length; i++) { + defaultExcludes.add(DEFAULTEXCLUDES[i]); + } + } + } + + /** + * Set the base directory to be scanned. This is the directory which is + * scanned recursively. All '/' and '\' characters are replaced by + * File.separatorChar, so the separator used need not match + * File.separatorChar. + * + * @param basedir The base directory to scan. + */ + public void setBasedir(final String basedir) { + setBasedir(basedir == null ? (File) null + : new File(basedir.replace('/', File.separatorChar).replace( + '\\', File.separatorChar))); + } + + /** + * Set the base directory to be scanned. This is the directory which is + * scanned recursively. + * + * @param basedir The base directory for scanning. + */ + public synchronized void setBasedir(final File basedir) { + this.basedir = basedir; + } + + /** + * Return the base directory to be scanned. + * This is the directory which is scanned recursively. + * + * @return the base directory to be scanned. + */ + public synchronized File getBasedir() { + return basedir; + } + + /** + * Find out whether include exclude patterns are matched in a + * case sensitive way. + * @return whether or not the scanning is case sensitive. + * @since Ant 1.6 + */ + public synchronized boolean isCaseSensitive() { + return isCaseSensitive; + } + + /** + * Set whether or not include and exclude patterns are matched + * in a case sensitive way. + * + * @param isCaseSensitive whether or not the file system should be + * regarded as a case sensitive one. + */ + public synchronized void setCaseSensitive(final boolean isCaseSensitive) { + this.isCaseSensitive = isCaseSensitive; + } + + /** + * Sets whether or not a missing base directory is an error + * + * @param errorOnMissingDir whether or not a missing base directory + * is an error + * @since Ant 1.7.1 + */ + public void setErrorOnMissingDir(final boolean errorOnMissingDir) { + this.errorOnMissingDir = errorOnMissingDir; + } + + /** + * Get whether or not a DirectoryScanner follows symbolic links. + * + * @return flag indicating whether symbolic links should be followed. + * + * @since Ant 1.6 + */ + public synchronized boolean isFollowSymlinks() { + return followSymlinks; + } + + /** + * Set whether or not symbolic links should be followed. + * + * @param followSymlinks whether or not symbolic links should be followed. + */ + public synchronized void setFollowSymlinks(final boolean followSymlinks) { + this.followSymlinks = followSymlinks; + } + + /** + * The maximum number of times a symbolic link may be followed + * during a scan. + * + * @since Ant 1.8.0 + */ + public void setMaxLevelsOfSymlinks(final int max) { + maxLevelsOfSymlinks = max; + } + + /** + * Set the list of include patterns to use. All '/' and '\' characters + * are replaced by File.separatorChar, so the separator used + * need not match File.separatorChar. + *

    + * When a pattern ends with a '/' or '\', "**" is appended. + * + * @param includes A list of include patterns. + * May be null, indicating that all files + * should be included. If a non-null + * list is given, all elements must be + * non-null. + */ + public synchronized void setIncludes(final String[] includes) { + if (includes == null) { + this.includes = null; + } else { + this.includes = new String[includes.length]; + for (int i = 0; i < includes.length; i++) { + this.includes[i] = normalizePattern(includes[i]); + } + } + } + + /** + * Set the list of exclude patterns to use. All '/' and '\' characters + * are replaced by File.separatorChar, so the separator used + * need not match File.separatorChar. + *

    + * When a pattern ends with a '/' or '\', "**" is appended. + * + * @param excludes A list of exclude patterns. + * May be null, indicating that no files + * should be excluded. If a non-null list is + * given, all elements must be non-null. + */ + public synchronized void setExcludes(final String[] excludes) { + if (excludes == null) { + this.excludes = null; + } else { + this.excludes = new String[excludes.length]; + for (int i = 0; i < excludes.length; i++) { + this.excludes[i] = normalizePattern(excludes[i]); + } + } + } + + /** + * Add to the list of exclude patterns to use. All '/' and '\' + * characters are replaced by File.separatorChar, so + * the separator used need not match File.separatorChar. + *

    + * When a pattern ends with a '/' or '\', "**" is appended. + * + * @param excludes A list of exclude patterns. + * May be null, in which case the + * exclude patterns don't get changed at all. + * + * @since Ant 1.6.3 + */ + public synchronized void addExcludes(final String[] excludes) { + if (excludes != null && excludes.length > 0) { + if (this.excludes != null && this.excludes.length > 0) { + final String[] tmp = new String[excludes.length + + this.excludes.length]; + System.arraycopy(this.excludes, 0, tmp, 0, + this.excludes.length); + for (int i = 0; i < excludes.length; i++) { + tmp[this.excludes.length + i] = + normalizePattern(excludes[i]); + } + this.excludes = tmp; + } else { + setExcludes(excludes); + } + } + } + + /** + * All '/' and '\' characters are replaced by + * File.separatorChar, so the separator used need not + * match File.separatorChar. + * + *

    When a pattern ends with a '/' or '\', "**" is appended. + * + * @since Ant 1.6.3 + */ + private static String normalizePattern(final String p) { + String pattern = p.replace('/', File.separatorChar) + .replace('\\', File.separatorChar); + if (pattern.endsWith(File.separator)) { + pattern += SelectorUtils.DEEP_TREE_MATCH; + } + return pattern; + } + + /** + * Set the selectors that will select the filelist. + * + * @param selectors specifies the selectors to be invoked on a scan. + */ + public synchronized void setSelectors(final FileSelector[] selectors) { + this.selectors = selectors; + } + + /** + * Return whether or not the scanner has included all the files or + * directories it has come across so far. + * + * @return true if all files and directories which have + * been found so far have been included. + */ + public synchronized boolean isEverythingIncluded() { + return everythingIncluded; + } + + /** + * Scan for files which match at least one include pattern and don't match + * any exclude patterns. If there are selectors then the files must pass + * muster there, as well. Scans under basedir, if set; otherwise the + * include patterns without leading wildcards specify the absolute paths of + * the files that may be included. + * + * @exception IllegalStateException if the base directory was set + * incorrectly (i.e. if it doesn't exist or isn't a directory). + */ + public void scan() throws IllegalStateException { + synchronized (scanLock) { + if (scanning) { + while (scanning) { + try { + scanLock.wait(); + } catch (final InterruptedException e) { + continue; + } + } + if (illegal != null) { + throw illegal; + } + return; + } + scanning = true; + } + final File savedBase = basedir; + try { + synchronized (this) { + illegal = null; + clearResults(); + + // set in/excludes to reasonable defaults if needed: + final boolean nullIncludes = (includes == null); + includes = nullIncludes + ? new String[] {SelectorUtils.DEEP_TREE_MATCH} : includes; + final boolean nullExcludes = (excludes == null); + excludes = nullExcludes ? new String[0] : excludes; + + if (basedir != null && !followSymlinks + && SYMLINK_UTILS.isSymbolicLink(basedir)) { + notFollowedSymlinks.add(basedir.getAbsolutePath()); + basedir = null; + } + + if (basedir == null) { + // if no basedir and no includes, nothing to do: + if (nullIncludes) { + return; + } + } else { + if (!basedir.exists()) { + if (errorOnMissingDir) { + illegal = new IllegalStateException("basedir " + + basedir + + DOES_NOT_EXIST_POSTFIX); + } else { + // Nothing to do - basedir does not exist + return; + } + } else if (!basedir.isDirectory()) { + illegal = new IllegalStateException("basedir " + + basedir + + " is not a" + + " directory."); + } + if (illegal != null) { + throw illegal; + } + } + if (isIncluded(TokenizedPath.EMPTY_PATH)) { + if (!isExcluded(TokenizedPath.EMPTY_PATH)) { + if (isSelected("", basedir)) { + dirsIncluded.addElement(""); + } else { + dirsDeselected.addElement(""); + } + } else { + dirsExcluded.addElement(""); + } + } else { + dirsNotIncluded.addElement(""); + } + checkIncludePatterns(); + clearCaches(); + includes = nullIncludes ? null : includes; + excludes = nullExcludes ? null : excludes; + } + } catch (final IOException ex) { + throw new BuildException(ex); + } finally { + basedir = savedBase; + synchronized (scanLock) { + scanning = false; + scanLock.notifyAll(); + } + } + } + + /** + * This routine is actually checking all the include patterns in + * order to avoid scanning everything under base dir. + * @since Ant 1.6 + */ + private void checkIncludePatterns() { + ensureNonPatternSetsReady(); + final Map newroots = new HashMap(); + + // put in the newroots map the include patterns without + // wildcard tokens + for (int i = 0; i < includePatterns.length; i++) { + final String pattern = includePatterns[i].toString(); + if (!shouldSkipPattern(pattern)) { + newroots.put(includePatterns[i].rtrimWildcardTokens(), + pattern); + } + } + for (final Map.Entry entry : includeNonPatterns.entrySet()) { + final String pattern = entry.getKey(); + if (!shouldSkipPattern(pattern)) { + newroots.put(entry.getValue(), pattern); + } + } + + if (newroots.containsKey(TokenizedPath.EMPTY_PATH) + && basedir != null) { + // we are going to scan everything anyway + scandir(basedir, "", true); + } else { + File canonBase = null; + if (basedir != null) { + try { + canonBase = basedir.getCanonicalFile(); + } catch (final IOException ex) { + throw new BuildException(ex); + } + } + // only scan directories that can include matched files or + // directories + for (final Map.Entry entry : newroots.entrySet()) { + TokenizedPath currentPath = entry.getKey(); + String currentelement = currentPath.toString(); + if (basedir == null + && !FileUtils.isAbsolutePath(currentelement)) { + continue; + } + File myfile = new File(basedir, currentelement); + + if (myfile.exists()) { + // may be on a case insensitive file system. We want + // the results to show what's really on the disk, so + // we need to double check. + try { + final String path = (basedir == null) + ? myfile.getCanonicalPath() + : FILE_UTILS.removeLeadingPath(canonBase, + myfile.getCanonicalFile()); + if (!path.equals(currentelement) || ON_VMS) { + myfile = currentPath.findFile(basedir, true); + if (myfile != null && basedir != null) { + currentelement = FILE_UTILS.removeLeadingPath( + basedir, myfile); + if (!currentPath.toString() + .equals(currentelement)) { + currentPath = + new TokenizedPath(currentelement); + } + } + } + } catch (final IOException ex) { + throw new BuildException(ex); + } + } + + if ((myfile == null || !myfile.exists()) && !isCaseSensitive()) { + final File f = currentPath.findFile(basedir, false); + if (f != null && f.exists()) { + // adapt currentelement to the case we've + // actually found + currentelement = (basedir == null) + ? f.getAbsolutePath() + : FILE_UTILS.removeLeadingPath(basedir, f); + myfile = f; + currentPath = new TokenizedPath(currentelement); + } + } + + if (myfile != null && myfile.exists()) { + if (!followSymlinks && currentPath.isSymlink(basedir)) { + accountForNotFollowedSymlink(currentPath, myfile); + continue; + } + if (myfile.isDirectory()) { + if (isIncluded(currentPath) + && currentelement.length() > 0) { + accountForIncludedDir(currentPath, myfile, true); + } else { + scandir(myfile, currentPath, true); + } + } else if (myfile.isFile()) { + final String originalpattern = entry.getValue(); + final boolean included = isCaseSensitive() + ? originalpattern.equals(currentelement) + : originalpattern.equalsIgnoreCase(currentelement); + if (included) { + accountForIncludedFile(currentPath, myfile); + } + } + } + } + } + } + + /** + * true if the pattern specifies a relative path without basedir + * or an absolute path not inside basedir. + * + * @since Ant 1.8.0 + */ + private boolean shouldSkipPattern(final String pattern) { + if (FileUtils.isAbsolutePath(pattern)) { + //skip abs. paths not under basedir, if set: + if (basedir != null + && !SelectorUtils.matchPatternStart(pattern, + basedir.getAbsolutePath(), + isCaseSensitive())) { + return true; + } + } else if (basedir == null) { + //skip non-abs. paths if basedir == null: + return true; + } + return false; + } + + /** + * Clear the result caches for a scan. + */ + protected synchronized void clearResults() { + filesIncluded = new VectorSet(); + filesNotIncluded = new VectorSet(); + filesExcluded = new VectorSet(); + filesDeselected = new VectorSet(); + dirsIncluded = new VectorSet(); + dirsNotIncluded = new VectorSet(); + dirsExcluded = new VectorSet(); + dirsDeselected = new VectorSet(); + everythingIncluded = (basedir != null); + scannedDirs.clear(); + notFollowedSymlinks.clear(); + } + + /** + * Top level invocation for a slow scan. A slow scan builds up a full + * list of excluded/included files/directories, whereas a fast scan + * will only have full results for included files, as it ignores + * directories which can't possibly hold any included files/directories. + *

    + * Returns immediately if a slow scan has already been completed. + */ + protected void slowScan() { + synchronized (slowScanLock) { + if (haveSlowResults) { + return; + } + if (slowScanning) { + while (slowScanning) { + try { + slowScanLock.wait(); + } catch (final InterruptedException e) { + // Empty + } + } + return; + } + slowScanning = true; + } + try { + synchronized (this) { + + // set in/excludes to reasonable defaults if needed: + final boolean nullIncludes = (includes == null); + includes = nullIncludes + ? new String[] {SelectorUtils.DEEP_TREE_MATCH} : includes; + final boolean nullExcludes = (excludes == null); + excludes = nullExcludes ? new String[0] : excludes; + + final String[] excl = new String[dirsExcluded.size()]; + dirsExcluded.copyInto(excl); + + final String[] notIncl = new String[dirsNotIncluded.size()]; + dirsNotIncluded.copyInto(notIncl); + + ensureNonPatternSetsReady(); + + processSlowScan(excl); + processSlowScan(notIncl); + clearCaches(); + includes = nullIncludes ? null : includes; + excludes = nullExcludes ? null : excludes; + } + } finally { + synchronized (slowScanLock) { + haveSlowResults = true; + slowScanning = false; + slowScanLock.notifyAll(); + } + } + } + + private void processSlowScan(final String[] arr) { + for (int i = 0; i < arr.length; i++) { + final TokenizedPath path = new TokenizedPath(arr[i]); + if (!couldHoldIncluded(path) || contentsExcluded(path)) { + scandir(new File(basedir, arr[i]), path, false); + } + } + } + + /** + * Scan the given directory for files and directories. Found files and + * directories are placed in their respective collections, based on the + * matching of includes, excludes, and the selectors. When a directory + * is found, it is scanned recursively. + * + * @param dir The directory to scan. Must not be null. + * @param vpath The path relative to the base directory (needed to + * prevent problems with an absolute path when using + * dir). Must not be null. + * @param fast Whether or not this call is part of a fast scan. + * + * @see #filesIncluded + * @see #filesNotIncluded + * @see #filesExcluded + * @see #dirsIncluded + * @see #dirsNotIncluded + * @see #dirsExcluded + * @see #slowScan + */ + protected void scandir(final File dir, final String vpath, final boolean fast) { + scandir(dir, new TokenizedPath(vpath), fast); + } + + /** + * Scan the given directory for files and directories. Found files and + * directories are placed in their respective collections, based on the + * matching of includes, excludes, and the selectors. When a directory + * is found, it is scanned recursively. + * + * @param dir The directory to scan. Must not be null. + * @param path The path relative to the base directory (needed to + * prevent problems with an absolute path when using + * dir). Must not be null. + * @param fast Whether or not this call is part of a fast scan. + * + * @see #filesIncluded + * @see #filesNotIncluded + * @see #filesExcluded + * @see #dirsIncluded + * @see #dirsNotIncluded + * @see #dirsExcluded + * @see #slowScan + */ + private void scandir(final File dir, final TokenizedPath path, final boolean fast) { + if (dir == null) { + throw new BuildException("dir must not be null."); + } + final String[] newfiles = dir.list(); + if (newfiles == null) { + if (!dir.exists()) { + throw new BuildException(dir + DOES_NOT_EXIST_POSTFIX); + } else if (!dir.isDirectory()) { + throw new BuildException(dir + " is not a directory."); + } else { + throw new BuildException("IO error scanning directory '" + + dir.getAbsolutePath() + "'"); + } + } + scandir(dir, path, fast, newfiles, new LinkedList()); + } + + private void scandir(final File dir, final TokenizedPath path, final boolean fast, + String[] newfiles, final LinkedList directoryNamesFollowed) { + String vpath = path.toString(); + if (vpath.length() > 0 && !vpath.endsWith(File.separator)) { + vpath += File.separator; + } + + // avoid double scanning of directories, can only happen in fast mode + if (fast && hasBeenScanned(vpath)) { + return; + } + if (!followSymlinks) { + final ArrayList noLinks = new ArrayList(); + for (int i = 0; i < newfiles.length; i++) { + try { + if (SYMLINK_UTILS.isSymbolicLink(dir, newfiles[i])) { + final String name = vpath + newfiles[i]; + final File file = new File(dir, newfiles[i]); + if (file.isDirectory()) { + dirsExcluded.addElement(name); + } else if (file.isFile()) { + filesExcluded.addElement(name); + } + accountForNotFollowedSymlink(name, file); + } else { + noLinks.add(newfiles[i]); + } + } catch (final IOException ioe) { + final String msg = "IOException caught while checking " + + "for links, couldn't get canonical path!"; + // will be caught and redirected to Ant's logging system + System.err.println(msg); + noLinks.add(newfiles[i]); + } + } + newfiles = (noLinks.toArray(new String[noLinks.size()])); + } else { + directoryNamesFollowed.addFirst(dir.getName()); + } + + for (int i = 0; i < newfiles.length; i++) { + final String name = vpath + newfiles[i]; + final TokenizedPath newPath = new TokenizedPath(path, newfiles[i]); + final File file = new File(dir, newfiles[i]); + final String[] children = file.list(); + if (children == null || (children.length == 0 && file.isFile())) { + if (isIncluded(newPath)) { + accountForIncludedFile(newPath, file); + } else { + everythingIncluded = false; + filesNotIncluded.addElement(name); + } + } else if (file.isDirectory()) { // dir + + if (followSymlinks + && causesIllegalSymlinkLoop(newfiles[i], dir, + directoryNamesFollowed)) { + // will be caught and redirected to Ant's logging system + System.err.println("skipping symbolic link " + + file.getAbsolutePath() + + " -- too many levels of symbolic" + + " links."); + notFollowedSymlinks.add(file.getAbsolutePath()); + continue; + } + + if (isIncluded(newPath)) { + accountForIncludedDir(newPath, file, fast, children, + directoryNamesFollowed); + } else { + everythingIncluded = false; + dirsNotIncluded.addElement(name); + if (fast && couldHoldIncluded(newPath) + && !contentsExcluded(newPath)) { + scandir(file, newPath, fast, children, + directoryNamesFollowed); + } + } + if (!fast) { + scandir(file, newPath, fast, children, directoryNamesFollowed); + } + } + } + + if (followSymlinks) { + directoryNamesFollowed.removeFirst(); + } + } + + /** + * Process included file. + * @param name path of the file relative to the directory of the FileSet. + * @param file included File. + */ + private void accountForIncludedFile(final TokenizedPath name, final File file) { + processIncluded(name, file, filesIncluded, filesExcluded, + filesDeselected); + } + + /** + * Process included directory. + * @param name path of the directory relative to the directory of + * the FileSet. + * @param file directory as File. + * @param fast whether to perform fast scans. + */ + private void accountForIncludedDir(final TokenizedPath name, final File file, + final boolean fast) { + processIncluded(name, file, dirsIncluded, dirsExcluded, dirsDeselected); + if (fast && couldHoldIncluded(name) && !contentsExcluded(name)) { + scandir(file, name, fast); + } + } + + private void accountForIncludedDir(final TokenizedPath name, + final File file, final boolean fast, + final String[] children, + final LinkedList directoryNamesFollowed) { + processIncluded(name, file, dirsIncluded, dirsExcluded, dirsDeselected); + if (fast && couldHoldIncluded(name) && !contentsExcluded(name)) { + scandir(file, name, fast, children, directoryNamesFollowed); + } + } + + private void accountForNotFollowedSymlink(final String name, final File file) { + accountForNotFollowedSymlink(new TokenizedPath(name), file); + } + + private void accountForNotFollowedSymlink(final TokenizedPath name, final File file) { + if (!isExcluded(name) && + (isIncluded(name) + || (file.isDirectory() && couldHoldIncluded(name) + && !contentsExcluded(name)))) { + notFollowedSymlinks.add(file.getAbsolutePath()); + } + } + + private void processIncluded(final TokenizedPath path, + final File file, final Vector inc, final Vector exc, + final Vector des) { + final String name = path.toString(); + if (inc.contains(name) || exc.contains(name) || des.contains(name)) { + return; + } + + boolean included = false; + if (isExcluded(path)) { + exc.add(name); + } else if (isSelected(name, file)) { + included = true; + inc.add(name); + } else { + des.add(name); + } + everythingIncluded &= included; + } + + /** + * Test whether or not a name matches against at least one include + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against at least one + * include pattern, or false otherwise. + */ + protected boolean isIncluded(final String name) { + return isIncluded(new TokenizedPath(name)); + } + + /** + * Test whether or not a name matches against at least one include + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against at least one + * include pattern, or false otherwise. + */ + private boolean isIncluded(final TokenizedPath path) { + ensureNonPatternSetsReady(); + + if (isCaseSensitive() + ? includeNonPatterns.containsKey(path.toString()) + : includeNonPatterns.containsKey(path.toString().toUpperCase())) { + return true; + } + for (int i = 0; i < includePatterns.length; i++) { + if (includePatterns[i].matchPath(path, isCaseSensitive())) { + return true; + } + } + return false; + } + + /** + * Test whether or not a name matches the start of at least one include + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against the start of at + * least one include pattern, or false otherwise. + */ + protected boolean couldHoldIncluded(final String name) { + return couldHoldIncluded(new TokenizedPath(name)); + } + + /** + * Test whether or not a name matches the start of at least one include + * pattern. + * + * @param tokenizedName The name to match. Must not be null. + * @return true when the name matches against the start of at + * least one include pattern, or false otherwise. + */ + private boolean couldHoldIncluded(final TokenizedPath tokenizedName) { + for (int i = 0; i < includePatterns.length; i++) { + if (couldHoldIncluded(tokenizedName, includePatterns[i])) { + return true; + } + } + for (final Iterator iter = includeNonPatterns.values().iterator(); + iter.hasNext();) { + if (couldHoldIncluded(tokenizedName, + iter.next().toPattern())) { + return true; + } + } + return false; + } + + /** + * Test whether or not a name matches the start of the given + * include pattern. + * + * @param tokenizedName The name to match. Must not be null. + * @return true when the name matches against the start of the + * include pattern, or false otherwise. + */ + private boolean couldHoldIncluded(final TokenizedPath tokenizedName, + final TokenizedPattern tokenizedInclude) { + return tokenizedInclude.matchStartOf(tokenizedName, isCaseSensitive()) + && isMorePowerfulThanExcludes(tokenizedName.toString()) + && isDeeper(tokenizedInclude, tokenizedName); + } + + /** + * Verify that a pattern specifies files deeper + * than the level of the specified file. + * @param pattern the pattern to check. + * @param name the name to check. + * @return whether the pattern is deeper than the name. + * @since Ant 1.6.3 + */ + private boolean isDeeper(final TokenizedPattern pattern, final TokenizedPath name) { + return pattern.containsPattern(SelectorUtils.DEEP_TREE_MATCH) + || pattern.depth() > name.depth(); + } + + /** + * Find out whether one particular include pattern is more powerful + * than all the excludes. + * Note: the power comparison is based on the length of the include pattern + * and of the exclude patterns without the wildcards. + * Ideally the comparison should be done based on the depth + * of the match; that is to say how many file separators have been matched + * before the first ** or the end of the pattern. + * + * IMPORTANT : this function should return false "with care". + * + * @param name the relative path to test. + * @return true if there is no exclude pattern more powerful than + * this include pattern. + * @since Ant 1.6 + */ + private boolean isMorePowerfulThanExcludes(final String name) { + final String soughtexclude = + name + File.separatorChar + SelectorUtils.DEEP_TREE_MATCH; + for (int counter = 0; counter < excludePatterns.length; counter++) { + if (excludePatterns[counter].toString().equals(soughtexclude)) { + return false; + } + } + return true; + } + + /** + * Test whether all contents of the specified directory must be excluded. + * @param path the path to check. + * @return whether all the specified directory's contents are excluded. + */ + /* package */ boolean contentsExcluded(final TokenizedPath path) { + for (int i = 0; i < excludePatterns.length; i++) { + if (excludePatterns[i].endsWith(SelectorUtils.DEEP_TREE_MATCH) + && excludePatterns[i].withoutLastToken() + .matchPath(path, isCaseSensitive())) { + return true; + } + } + return false; + } + + /** + * Test whether or not a name matches against at least one exclude + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against at least one + * exclude pattern, or false otherwise. + */ + protected boolean isExcluded(final String name) { + return isExcluded(new TokenizedPath(name)); + } + + /** + * Test whether or not a name matches against at least one exclude + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against at least one + * exclude pattern, or false otherwise. + */ + private boolean isExcluded(final TokenizedPath name) { + ensureNonPatternSetsReady(); + + if (isCaseSensitive() + ? excludeNonPatterns.containsKey(name.toString()) + : excludeNonPatterns.containsKey(name.toString().toUpperCase())) { + return true; + } + for (int i = 0; i < excludePatterns.length; i++) { + if (excludePatterns[i].matchPath(name, isCaseSensitive())) { + return true; + } + } + return false; + } + + /** + * Test whether a file should be selected. + * + * @param name the filename to check for selecting. + * @param file the java.io.File object for this filename. + * @return false when the selectors says that the file + * should not be selected, true otherwise. + */ + protected boolean isSelected(final String name, final File file) { + if (selectors != null) { + for (int i = 0; i < selectors.length; i++) { + if (!selectors[i].isSelected(basedir, name, file)) { + return false; + } + } + } + return true; + } + + /** + * Return the names of the files which matched at least one of the + * include patterns and none of the exclude patterns. + * The names are relative to the base directory. + * + * @return the names of the files which matched at least one of the + * include patterns and none of the exclude patterns. + */ + public String[] getIncludedFiles() { + String[] files; + synchronized (this) { + if (filesIncluded == null) { + throw new IllegalStateException("Must call scan() first"); + } + files = new String[filesIncluded.size()]; + filesIncluded.copyInto(files); + } + Arrays.sort(files); + return files; + } + + /** + * Return the count of included files. + * @return int. + * @since Ant 1.6.3 + */ + public synchronized int getIncludedFilesCount() { + if (filesIncluded == null) { + throw new IllegalStateException("Must call scan() first"); + } + return filesIncluded.size(); + } + + /** + * Return the names of the files which matched none of the include + * patterns. The names are relative to the base directory. This involves + * performing a slow scan if one has not already been completed. + * + * @return the names of the files which matched none of the include + * patterns. + * + * @see #slowScan + */ + public synchronized String[] getNotIncludedFiles() { + slowScan(); + final String[] files = new String[filesNotIncluded.size()]; + filesNotIncluded.copyInto(files); + return files; + } + + /** + * Return the names of the files which matched at least one of the + * include patterns and at least one of the exclude patterns. + * The names are relative to the base directory. This involves + * performing a slow scan if one has not already been completed. + * + * @return the names of the files which matched at least one of the + * include patterns and at least one of the exclude patterns. + * + * @see #slowScan + */ + public synchronized String[] getExcludedFiles() { + slowScan(); + final String[] files = new String[filesExcluded.size()]; + filesExcluded.copyInto(files); + return files; + } + + /** + *

    Return the names of the files which were selected out and + * therefore not ultimately included.

    + * + *

    The names are relative to the base directory. This involves + * performing a slow scan if one has not already been completed.

    + * + * @return the names of the files which were deselected. + * + * @see #slowScan + */ + public synchronized String[] getDeselectedFiles() { + slowScan(); + final String[] files = new String[filesDeselected.size()]; + filesDeselected.copyInto(files); + return files; + } + + /** + * Return the names of the directories which matched at least one of the + * include patterns and none of the exclude patterns. + * The names are relative to the base directory. + * + * @return the names of the directories which matched at least one of the + * include patterns and none of the exclude patterns. + */ + public String[] getIncludedDirectories() { + String[] directories; + synchronized (this) { + if (dirsIncluded == null) { + throw new IllegalStateException("Must call scan() first"); + } + directories = new String[dirsIncluded.size()]; + dirsIncluded.copyInto(directories); + } + Arrays.sort(directories); + return directories; + } + + /** + * Return the count of included directories. + * @return int. + * @since Ant 1.6.3 + */ + public synchronized int getIncludedDirsCount() { + if (dirsIncluded == null) { + throw new IllegalStateException("Must call scan() first"); + } + return dirsIncluded.size(); + } + + /** + * Return the names of the directories which matched none of the include + * patterns. The names are relative to the base directory. This involves + * performing a slow scan if one has not already been completed. + * + * @return the names of the directories which matched none of the include + * patterns. + * + * @see #slowScan + */ + public synchronized String[] getNotIncludedDirectories() { + slowScan(); + final String[] directories = new String[dirsNotIncluded.size()]; + dirsNotIncluded.copyInto(directories); + return directories; + } + + /** + * Return the names of the directories which matched at least one of the + * include patterns and at least one of the exclude patterns. + * The names are relative to the base directory. This involves + * performing a slow scan if one has not already been completed. + * + * @return the names of the directories which matched at least one of the + * include patterns and at least one of the exclude patterns. + * + * @see #slowScan + */ + public synchronized String[] getExcludedDirectories() { + slowScan(); + final String[] directories = new String[dirsExcluded.size()]; + dirsExcluded.copyInto(directories); + return directories; + } + + /** + *

    Return the names of the directories which were selected out and + * therefore not ultimately included.

    + * + *

    The names are relative to the base directory. This involves + * performing a slow scan if one has not already been completed.

    + * + * @return the names of the directories which were deselected. + * + * @see #slowScan + */ + public synchronized String[] getDeselectedDirectories() { + slowScan(); + final String[] directories = new String[dirsDeselected.size()]; + dirsDeselected.copyInto(directories); + return directories; + } + + /** + * Absolute paths of all symbolic links that haven't been followed + * but would have been followed had followsymlinks been true or + * maxLevelsOfSymlinks been bigger. + * + * @return sorted array of not followed symlinks + * @since Ant 1.8.0 + * @see #notFollowedSymlinks + */ + public synchronized String[] getNotFollowedSymlinks() { + String[] links; + synchronized (this) { + links = notFollowedSymlinks + .toArray(new String[notFollowedSymlinks.size()]); + } + Arrays.sort(links); + return links; + } + + /** + * Add default exclusions to the current exclusions set. + */ + public synchronized void addDefaultExcludes() { + final int excludesLength = excludes == null ? 0 : excludes.length; + String[] newExcludes; + final String[] defaultExcludesTemp = getDefaultExcludes(); + newExcludes = new String[excludesLength + defaultExcludesTemp.length]; + if (excludesLength > 0) { + System.arraycopy(excludes, 0, newExcludes, 0, excludesLength); + } + for (int i = 0; i < defaultExcludesTemp.length; i++) { + newExcludes[i + excludesLength] = + defaultExcludesTemp[i].replace('/', File.separatorChar) + .replace('\\', File.separatorChar); + } + excludes = newExcludes; + } + + /** + * Get the named resource. + * @param name path name of the file relative to the dir attribute. + * + * @return the resource with the given name. + * @since Ant 1.5.2 + */ + public synchronized Resource getResource(final String name) { + return new FileResource(basedir, name); + } + + /** + * Has the directory with the given path relative to the base + * directory already been scanned? + * + *

    Registers the given directory as scanned as a side effect.

    + * + * @since Ant 1.6 + */ + private boolean hasBeenScanned(final String vpath) { + return !scannedDirs.add(vpath); + } + + /** + * This method is of interest for testing purposes. The returned + * Set is live and should not be modified. + * @return the Set of relative directory names that have been scanned. + */ + /* package-private */ Set getScannedDirs() { + return scannedDirs; + } + + /** + * Clear internal caches. + * + * @since Ant 1.6 + */ + private synchronized void clearCaches() { + includeNonPatterns.clear(); + excludeNonPatterns.clear(); + includePatterns = null; + excludePatterns = null; + areNonPatternSetsReady = false; + } + + /** + * Ensure that the in|exclude "patterns" + * have been properly divided up. + * + * @since Ant 1.6.3 + */ + /* package */ synchronized void ensureNonPatternSetsReady() { + if (!areNonPatternSetsReady) { + includePatterns = fillNonPatternSet(includeNonPatterns, includes); + excludePatterns = fillNonPatternSet(excludeNonPatterns, excludes); + areNonPatternSetsReady = true; + } + } + + /** + * Add all patterns that are not real patterns (do not contain + * wildcards) to the set and returns the real patterns. + * + * @param map Map to populate. + * @param patterns String[] of patterns. + * @since Ant 1.8.0 + */ + private TokenizedPattern[] fillNonPatternSet(final Map map, final String[] patterns) { + final ArrayList al = new ArrayList(patterns.length); + for (int i = 0; i < patterns.length; i++) { + if (!SelectorUtils.hasWildcards(patterns[i])) { + final String s = isCaseSensitive() + ? patterns[i] : patterns[i].toUpperCase(); + map.put(s, new TokenizedPath(s)); + } else { + al.add(new TokenizedPattern(patterns[i])); + } + } + return al.toArray(new TokenizedPattern[al.size()]); + } + + /** + * Would following the given directory cause a loop of symbolic + * links deeper than allowed? + * + *

    Can only happen if the given directory has been seen at + * least more often than allowed during the current scan and it is + * a symbolic link and enough other occurrences of the same name + * higher up are symbolic links that point to the same place.

    + * + * @since Ant 1.8.0 + */ + private boolean causesIllegalSymlinkLoop(final String dirName, final File parent, + final LinkedList directoryNamesFollowed) { + try { + if (directoryNamesFollowed.size() >= maxLevelsOfSymlinks + && CollectionUtils.frequency(directoryNamesFollowed, dirName) + >= maxLevelsOfSymlinks + && SYMLINK_UTILS.isSymbolicLink(parent, dirName)) { + + final ArrayList files = new ArrayList(); + File f = FILE_UTILS.resolveFile(parent, dirName); + final String target = f.getCanonicalPath(); + files.add(target); + + String relPath = ""; + for (final String dir : directoryNamesFollowed) { + relPath += "../"; + if (dirName.equals(dir)) { + f = FILE_UTILS.resolveFile(parent, relPath + dir); + files.add(f.getCanonicalPath()); + if (files.size() > maxLevelsOfSymlinks + && CollectionUtils.frequency(files, target) + > maxLevelsOfSymlinks) { + return true; + } + } + } + + } + return false; + } catch (final IOException ex) { + throw new BuildException("Caught error while checking for" + + " symbolic links", ex); + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttribute.java new file mode 100644 index 00000000..445c33ee --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttribute.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Enables a task to control unknown attributes + * + * @since Ant 1.5 + */ +public interface DynamicAttribute { + + /** + * Set a named attribute to the given value + * + * @param name the name of the attribute + * @param value the new value of the attribute + * @throws BuildException when any error occurs + */ + void setDynamicAttribute(String name, String value) + throws BuildException; + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttributeNS.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttributeNS.java new file mode 100644 index 00000000..7d6e84e5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicAttributeNS.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Enables a task to control unknown attributes. + * + * @since Ant 1.7 + */ +public interface DynamicAttributeNS { + + /** + * Set a named attribute to the given value + * + * @param uri The namespace uri for this attribute, "" is + * used if there is no namespace uri. + * @param localName The localname of this attribute. + * @param qName The qualified name for this attribute + * @param value The value of this attribute. + * @throws BuildException when any error occurs + */ + void setDynamicAttribute( + String uri, String localName, String qName, String value) + throws BuildException; + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfigurator.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfigurator.java new file mode 100644 index 00000000..e48062be --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfigurator.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Enables a task to control unknown attributes and elements. + * + * @since Ant 1.5 + */ +public interface DynamicConfigurator + extends DynamicAttribute, DynamicElement { +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfiguratorNS.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfiguratorNS.java new file mode 100644 index 00000000..40b3d656 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicConfiguratorNS.java @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Enables a task to control unknown attributes and elements. + * + * @since Ant 1.7 + */ +public interface DynamicConfiguratorNS + extends DynamicAttributeNS, DynamicElementNS { +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElement.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElement.java new file mode 100644 index 00000000..b9caf0c4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElement.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Enables a task to control unknown elements. + * + * @since Ant 1.5 + */ +public interface DynamicElement { + + /** + * Create an element with the given name + * + * @param name the element name + * @throws BuildException when any error occurs + * @return the element created + */ + Object createDynamicElement(String name) throws BuildException; +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElementNS.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElementNS.java new file mode 100644 index 00000000..57bfa530 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicElementNS.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Enables a task to control unknown elements. + * + * @since Ant 1.7 + */ +public interface DynamicElementNS { + /** + * Create an element with the given name + * + * @param uri The namespace uri for this attribute. + * @param localName The localname of this attribute. + * @param qName The qualified name for this element. + * @throws BuildException when any error occurs + * @return the element created for this element. + */ + Object createDynamicElement( + String uri, String localName, String qName) throws BuildException; +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicObjectAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicObjectAttribute.java new file mode 100644 index 00000000..9a9aca90 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/DynamicObjectAttribute.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Enables a task to control unknown attributes. + * Same as {@link DynamicAttribute} but authorize arbitrary Object as value + * rather than String + * + * @see DynamicAttribute + * @since Ant 1.9 + */ +public interface DynamicObjectAttribute { + + /** + * Set a named attribute to the given value + * + * @param name the name of the attribute + * @param value the new value of the attribute + * @throws BuildException when any error occurs + */ + void setDynamicAttribute(String name, Object value) + throws BuildException; + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Evaluable.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Evaluable.java new file mode 100644 index 00000000..47f09c73 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Evaluable.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Kind of task attribute that can be evaluated before being assigned + * + * @see RuntimeConfigurable + */ +public interface Evaluable { + + Object eval(); + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Executor.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Executor.java new file mode 100644 index 00000000..9aff1487 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Executor.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Target executor abstraction. + * @since Ant 1.6.3 + */ +public interface Executor { + + /** + * Execute the specified Targets for the specified Project. + * @param project the Ant Project. + * @param targetNames String[] of Target names as specified on the command line. + * @throws BuildException on error + */ + void executeTargets(Project project, String[] targetNames) + throws BuildException; + + /** + * Get the appropriate subproject Executor instance. + * + * This allows the top executor to control what type of executor is used to execute + * subprojects via <ant>/<antcall>/<subant> and task that extend these. + * All bundled Executors return a SingleCheckExecutor (running a merged set of + * depended targets for all targets called) to run sub-builds. + * + * @return an Executor instance. + */ + Executor getSubProjectExecutor(); + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitException.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitException.java new file mode 100644 index 00000000..11e1bc81 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitException.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Used to report exit status of classes which call System.exit(). + * + * @see org.apache.tools.ant.util.optional.NoExitSecurityManager + * @see org.apache.tools.ant.types.Permissions + * + */ +public class ExitException extends SecurityException { + + private static final long serialVersionUID = 2772487854280543363L; + + /** Status code */ + private int status; + + /** + * Constructs an exit exception. + * @param status the status code returned via System.exit() + */ + public ExitException(int status) { + super("ExitException: status " + status); + this.status = status; + } + + /** + * Constructs an exit exception. + * @param msg the message to be displayed. + * @param status the status code returned via System.exit() + */ + public ExitException(String msg, int status) { + super(msg); + this.status = status; + } + + /** + * The status code returned by System.exit() + * + * @return the status code returned by System.exit() + */ + public int getStatus() { + return status; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitStatusException.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitStatusException.java new file mode 100644 index 00000000..1eb5127b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExitStatusException.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * BuildException + exit status. + * + * @since Ant 1.7 + */ +public class ExitStatusException extends BuildException { + + private static final long serialVersionUID = 7760846806886585968L; + + /** Status code */ + private int status; + + /** + * Constructs an ExitStatusException. + * @param status the associated status code + */ + public ExitStatusException(int status) { + super(); + this.status = status; + } + + /** + * Constructs an ExitStatusException. + * @param msg the associated message + * @param status the associated status code + */ + public ExitStatusException(String msg, int status) { + super(msg); + this.status = status; + } + + /** + * Construct an exit status exception with location information too + * @param message error message + * @param status exit status + * @param location exit location + */ + public ExitStatusException(String message, int status, Location location) { + super(message, location); + this.status = status; + } + + /** + * Get the status code. + * @return int + */ + public int getStatus() { + return status; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExtensionPoint.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExtensionPoint.java new file mode 100644 index 00000000..32c8c55e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ExtensionPoint.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * An extension point build files can provide as a place where other + * build files can add new dependencies. + * + * @since Ant 1.8.0 + */ +public class ExtensionPoint extends Target { + + public ExtensionPoint() { + } + + /** + * Cloning constructor. + * @param other the Target to clone. + */ + public ExtensionPoint(Target other) { + //Should we have a clone constructor taking an ExtensionPoint as parameter? + super(other); + } + + + private static final String NO_CHILDREN_ALLOWED + = "you must not nest child elements into an extension-point"; + + /** + * Throws an exception. + */ + @Override + public final void addTask(Task task) { + throw new BuildException(NO_CHILDREN_ALLOWED); + } + + /** + * Throws an exception. + */ + @Override + public final void addDataType(RuntimeConfigurable r) { + throw new BuildException(NO_CHILDREN_ALLOWED); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/FileScanner.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/FileScanner.java new file mode 100644 index 00000000..a7cb9dea --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/FileScanner.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.File; + +/** + * An interface used to describe the actions required of any type of + * directory scanner. + * + */ +public interface FileScanner { + /** + * Adds default exclusions to the current exclusions set. + */ + void addDefaultExcludes(); + + /** + * Returns the base directory to be scanned. + * This is the directory which is scanned recursively. + * + * @return the base directory to be scanned + */ + File getBasedir(); + + /** + * Returns the names of the directories which matched at least one of the + * include patterns and at least one of the exclude patterns. + * The names are relative to the base directory. + * + * @return the names of the directories which matched at least one of the + * include patterns and at least one of the exclude patterns. + */ + String[] getExcludedDirectories(); + + /** + * Returns the names of the files which matched at least one of the + * include patterns and at least one of the exclude patterns. + * The names are relative to the base directory. + * + * @return the names of the files which matched at least one of the + * include patterns and at least one of the exclude patterns. + * + */ + String[] getExcludedFiles(); + + /** + * Returns the names of the directories which matched at least one of the + * include patterns and none of the exclude patterns. + * The names are relative to the base directory. + * + * @return the names of the directories which matched at least one of the + * include patterns and none of the exclude patterns. + */ + String[] getIncludedDirectories(); + + /** + * Returns the names of the files which matched at least one of the + * include patterns and none of the exclude patterns. + * The names are relative to the base directory. + * + * @return the names of the files which matched at least one of the + * include patterns and none of the exclude patterns. + */ + String[] getIncludedFiles(); + + /** + * Returns the names of the directories which matched none of the include + * patterns. The names are relative to the base directory. + * + * @return the names of the directories which matched none of the include + * patterns. + */ + String[] getNotIncludedDirectories(); + + /** + * Returns the names of the files which matched none of the include + * patterns. The names are relative to the base directory. + * + * @return the names of the files which matched none of the include + * patterns. + */ + String[] getNotIncludedFiles(); + + /** + * Scans the base directory for files which match at least one include + * pattern and don't match any exclude patterns. + * + * @exception IllegalStateException if the base directory was set + * incorrectly (i.e. if it is null, doesn't exist, + * or isn't a directory). + */ + void scan() throws IllegalStateException; + + /** + * Sets the base directory to be scanned. This is the directory which is + * scanned recursively. All '/' and '\' characters should be replaced by + * File.separatorChar, so the separator used need not match + * File.separatorChar. + * + * @param basedir The base directory to scan. + * Must not be null. + */ + void setBasedir(String basedir); + + /** + * Sets the base directory to be scanned. This is the directory which is + * scanned recursively. + * + * @param basedir The base directory for scanning. + * Should not be null. + */ + void setBasedir(File basedir); + + /** + * Sets the list of exclude patterns to use. + * + * @param excludes A list of exclude patterns. + * May be null, indicating that no files + * should be excluded. If a non-null list is + * given, all elements must be non-null. + */ + void setExcludes(String[] excludes); + + /** + * Sets the list of include patterns to use. + * + * @param includes A list of include patterns. + * May be null, indicating that all files + * should be included. If a non-null + * list is given, all elements must be + * non-null. + */ + void setIncludes(String[] includes); + + /** + * Sets whether or not the file system should be regarded as case sensitive. + * + * @param isCaseSensitive whether or not the file system should be + * regarded as a case sensitive one + */ + void setCaseSensitive(boolean isCaseSensitive); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/IntrospectionHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/IntrospectionHelper.java new file mode 100644 index 00000000..30086563 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/IntrospectionHelper.java @@ -0,0 +1,1745 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.apache.tools.ant.taskdefs.PreSetDef; +import org.apache.tools.ant.types.EnumeratedAttribute; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.FileProvider; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.util.StringUtils; + +/** + * Helper class that collects the methods a task or nested element + * holds to set attributes, create nested elements or hold PCDATA + * elements. + * + * It contains hashtables containing classes that use introspection + * to handle all the invocation of the project-component specific methods. + * + * This class is somewhat complex, as it implements the O/X mapping between + * Ant XML and Java class instances. This is not the best place for someone new + * to Ant to start contributing to the codebase, as a change here can break the + * entire system in interesting ways. Always run a full test of Ant before checking + * in/submitting changes to this file. + * + * The class is final and has a private constructor. + * To get an instance for a specific (class,project) combination, + * use {@link #getHelper(Project,Class)}. + * This may return an existing version, or a new one + * ...do not make any assumptions about its uniqueness, or its validity after the Project + * instance has finished its build. + * + */ +public final class IntrospectionHelper { + + /** + * Helper instances we've already created (Class.getName() to IntrospectionHelper). + */ + private static final Map HELPERS = new Hashtable(); + + /** + * Map from primitive types to wrapper classes for use in + * createAttributeSetter (Class to Class). Note that char + * and boolean are in here even though they get special treatment + * - this way we only need to test for the wrapper class. + */ + private static final Map, Class> PRIMITIVE_TYPE_MAP = new HashMap, Class>(8); + + // Set up PRIMITIVE_TYPE_MAP + static { + final Class[] primitives = {Boolean.TYPE, Byte.TYPE, Character.TYPE, Short.TYPE, + Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE}; + final Class[] wrappers = {Boolean.class, Byte.class, Character.class, Short.class, + Integer.class, Long.class, Float.class, Double.class}; + for (int i = 0; i < primitives.length; i++) { + PRIMITIVE_TYPE_MAP.put (primitives[i], wrappers[i]); + } + } + + private static final int MAX_REPORT_NESTED_TEXT = 20; + private static final String ELLIPSIS = "..."; + + /** + * Map from attribute names to attribute types + * (String to Class). + */ + private final Hashtable> attributeTypes = new Hashtable>(); + + /** + * Map from attribute names to attribute setter methods + * (String to AttributeSetter). + */ + private final Hashtable attributeSetters = new Hashtable(); + + /** + * Map from attribute names to nested types + * (String to Class). + */ + private final Hashtable> nestedTypes = new Hashtable>(); + + /** + * Map from attribute names to methods to create nested types + * (String to NestedCreator). + */ + private final Hashtable nestedCreators = new Hashtable(); + + /** + * Vector of methods matching add[Configured](Class) pattern. + */ + private final List addTypeMethods = new ArrayList(); + + /** + * The method to invoke to add PCDATA. + */ + private final Method addText; + + /** + * The class introspected by this instance. + */ + private final Class bean; + + /** + * Sole constructor, which is private to ensure that all + * IntrospectionHelpers are created via {@link #getHelper(Class) getHelper}. + * Introspects the given class for bean-like methods. + * Each method is examined in turn, and the following rules are applied: + *

    + *

      + *
    • If the method is Task.setLocation(Location), + * Task.setTaskType(String) + * or TaskContainer.addTask(Task), it is ignored. These + * methods are handled differently elsewhere. + *
    • void addText(String) is recognised as the method for + * adding PCDATA to a bean. + *
    • void setFoo(Bar) is recognised as a method for + * setting the value of attribute foo, so long as + * Bar is non-void and is not an array type. + * As of Ant 1.8, a Resource or FileProvider parameter overrides a java.io.File parameter; + * in practice the only effect of this is to allow objects rendered from + * the 1.8 PropertyHelper implementation to be used as Resource parameters, + * since Resources set from Strings are resolved as project-relative files + * to preserve backward compatibility. Beyond this, non-String + * parameter types always overload String parameter types; these are + * the only guarantees made in terms of priority. + *
    • Foo createBar() is recognised as a method for + * creating a nested element called bar of type + * Foo, so long as Foo is not a primitive or + * array type. + *
    • void addConfiguredFoo(Bar) is recognised as a + * method for storing a pre-configured element called + * foo and of type Bar, so long as + * Bar is not an array, primitive or String type. + * Bar must have an accessible constructor taking no + * arguments. + *
    • void addFoo(Bar) is recognised as a method for storing + * an element called foo and of type Bar, so + * long as Bar is not an array, primitive or String type. + * Bar must have an accessible constructor taking no + * arguments. This is distinct from the 'addConfigured' idiom in that + * the nested element is added to the parent immediately after it is + * constructed; in practice this means that addFoo(Bar) should + * do little or nothing with its argument besides storing it for later use. + *
    + * Note that only one method is retained to create/set/addConfigured/add + * any element or attribute. + * + * @param bean The bean type to introspect. + * Must not be null. + * + * @see #getHelper(Class) + */ + private IntrospectionHelper(final Class bean) { + this.bean = bean; + final Method[] methods = bean.getMethods(); + Method addTextMethod = null; + for (int i = 0; i < methods.length; i++) { + final Method m = methods[i]; + final String name = m.getName(); + final Class returnType = m.getReturnType(); + final Class[] args = m.getParameterTypes(); + + // check of add[Configured](Class) pattern + if (args.length == 1 && java.lang.Void.TYPE.equals(returnType) + && ("add".equals(name) || "addConfigured".equals(name))) { + insertAddTypeMethod(m); + continue; + } + // not really user settable properties on tasks/project components + if (org.apache.tools.ant.ProjectComponent.class.isAssignableFrom(bean) + && args.length == 1 && isHiddenSetMethod(name, args[0])) { + continue; + } + // hide addTask for TaskContainers + if (isContainer() && args.length == 1 && "addTask".equals(name) + && org.apache.tools.ant.Task.class.equals(args[0])) { + continue; + } + if ("addText".equals(name) && java.lang.Void.TYPE.equals(returnType) + && args.length == 1 && java.lang.String.class.equals(args[0])) { + addTextMethod = methods[i]; + } else if (name.startsWith("set") && java.lang.Void.TYPE.equals(returnType) + && args.length == 1 && !args[0].isArray()) { + final String propName = getPropertyName(name, "set"); + AttributeSetter as = attributeSetters.get(propName); + if (as != null) { + if (java.lang.String.class.equals(args[0])) { + /* + Ignore method m, as there is an overloaded + form of this method that takes in a + non-string argument, which gains higher + priority. + */ + continue; + } + if (java.io.File.class.equals(args[0])) { + // Ant Resources/FileProviders override java.io.File + if (Resource.class.equals(as.type) || FileProvider.class.equals(as.type)) { + continue; + } + } + /* + In cases other than those just explicitly covered, + we just override that with the new one. + This mechanism does not guarantee any specific order + in which the methods will be selected: so any code + that depends on the order in which "set" methods have + been defined, is not guaranteed to be selected in any + particular order. + */ + } + as = createAttributeSetter(m, args[0], propName); + if (as != null) { + attributeTypes.put(propName, args[0]); + attributeSetters.put(propName, as); + } + } else if (name.startsWith("create") && !returnType.isArray() + && !returnType.isPrimitive() && args.length == 0) { + + final String propName = getPropertyName(name, "create"); + // Check if a create of this property is already present + // add takes preference over create for CB purposes + if (nestedCreators.get(propName) == null) { + nestedTypes.put(propName, returnType); + nestedCreators.put(propName, new CreateNestedCreator(m)); + } + } else if (name.startsWith("addConfigured") + && java.lang.Void.TYPE.equals(returnType) && args.length == 1 + && !java.lang.String.class.equals(args[0]) + && !args[0].isArray() && !args[0].isPrimitive()) { + try { + Constructor constructor = null; + try { + constructor = args[0].getConstructor(); + } catch (final NoSuchMethodException ex) { + constructor = args[0].getConstructor(Project.class); + } + final String propName = getPropertyName(name, "addConfigured"); + nestedTypes.put(propName, args[0]); + nestedCreators.put(propName, new AddNestedCreator(m, + constructor, AddNestedCreator.ADD_CONFIGURED)); + } catch (final NoSuchMethodException nse) { + // ignore + } + } else if (name.startsWith("add") + && java.lang.Void.TYPE.equals(returnType) && args.length == 1 + && !java.lang.String.class.equals(args[0]) + && !args[0].isArray() && !args[0].isPrimitive()) { + try { + Constructor constructor = null; + try { + constructor = args[0].getConstructor(); + } catch (final NoSuchMethodException ex) { + constructor = args[0].getConstructor(Project.class); + } + final String propName = getPropertyName(name, "add"); + if (nestedTypes.get(propName) != null) { + /* + * Ignore this method as there is an addConfigured + * form of this method that has a higher + * priority + */ + continue; + } + nestedTypes.put(propName, args[0]); + nestedCreators.put(propName, new AddNestedCreator(m, + constructor, AddNestedCreator.ADD)); + } catch (final NoSuchMethodException nse) { + // ignore + } + } + } + addText = addTextMethod; + } + + /** + * Certain set methods are part of the Ant core interface to tasks and + * therefore not to be considered for introspection + * + * @param name the name of the set method + * @param type the type of the set method's parameter + * @return true if the given set method is to be hidden. + */ + private boolean isHiddenSetMethod(final String name, final Class type) { + if ("setLocation".equals(name) && org.apache.tools.ant.Location.class.equals(type)) { + return true; + } + if ("setTaskType".equals(name) && java.lang.String.class.equals(type)) { + return true; + } + return false; + } + + /** + * Returns a helper for the given class, either from the cache + * or by creating a new instance. + * + * @param c The class for which a helper is required. + * Must not be null. + * + * @return a helper for the specified class + */ + public static synchronized IntrospectionHelper getHelper(final Class c) { + return getHelper(null, c); + } + + /** + * Returns a helper for the given class, either from the cache + * or by creating a new instance. + * + * The method will make sure the helper will be cleaned up at the end of + * the project, and only one instance will be created for each class. + * + * @param p the project instance. Can be null, in which case the helper is not cached. + * @param c The class for which a helper is required. + * Must not be null. + * + * @return a helper for the specified class + */ + public static synchronized IntrospectionHelper getHelper(final Project p, final Class c) { + IntrospectionHelper ih = HELPERS.get(c.getName()); + // If a helper cannot be found, or if the helper is for another + // classloader, create a new IH + if (ih == null || ih.bean != c) { + ih = new IntrospectionHelper(c); + if (p != null) { + // #30162: do *not* cache this if there is no project, as we + // cannot guarantee that the cache will be cleared. + HELPERS.put(c.getName(), ih); + } + } + return ih; + } + + /** + * Sets the named attribute in the given element, which is part of the + * given project. + * + * @param p The project containing the element. This is used when files + * need to be resolved. Must not be null. + * @param element The element to set the attribute in. Must not be + * null. + * @param attributeName The name of the attribute to set. Must not be + * null. + * @param value The value to set the attribute to. This may be interpreted + * or converted to the necessary type if the setter method + * doesn't accept an object of the supplied type. + * + * @exception BuildException if the introspected class doesn't support + * the given attribute, or if the setting + * method fails. + */ + public void setAttribute(final Project p, final Object element, final String attributeName, + final Object value) throws BuildException { + final AttributeSetter as = attributeSetters.get( + attributeName.toLowerCase(Locale.ENGLISH)); + if (as == null && value != null) { + if (element instanceof DynamicAttributeNS) { + final DynamicAttributeNS dc = (DynamicAttributeNS) element; + final String uriPlusPrefix = ProjectHelper.extractUriFromComponentName(attributeName); + final String uri = ProjectHelper.extractUriFromComponentName(uriPlusPrefix); + final String localName = ProjectHelper.extractNameFromComponentName(attributeName); + final String qName = "".equals(uri) ? localName : uri + ":" + localName; + dc.setDynamicAttribute(uri, localName, qName, value.toString()); + return; + } + if (element instanceof DynamicObjectAttribute) { + final DynamicObjectAttribute dc = (DynamicObjectAttribute) element; + dc.setDynamicAttribute(attributeName.toLowerCase(Locale.ENGLISH), value); + return; + } + if (element instanceof DynamicAttribute) { + final DynamicAttribute dc = (DynamicAttribute) element; + dc.setDynamicAttribute(attributeName.toLowerCase(Locale.ENGLISH), value.toString()); + return; + } + if (attributeName.indexOf(':') >= 0) { + return; // Ignore attribute from unknown uri's + } + final String msg = getElementName(p, element) + + " doesn't support the \"" + attributeName + "\" attribute."; + throw new UnsupportedAttributeException(msg, attributeName); + } + try { + as.setObject(p, element, value); + } catch (final IllegalAccessException ie) { + // impossible as getMethods should only return public methods + throw new BuildException(ie); + } catch (final InvocationTargetException ite) { + throw extractBuildException(ite); + } + } + + /** + * Sets the named attribute in the given element, which is part of the + * given project. + * + * @param p The project containing the element. This is used when files + * need to be resolved. Must not be null. + * @param element The element to set the attribute in. Must not be + * null. + * @param attributeName The name of the attribute to set. Must not be + * null. + * @param value The value to set the attribute to. This may be interpreted + * or converted to the necessary type if the setter method + * doesn't just take a string. Must not be null. + * + * @exception BuildException if the introspected class doesn't support + * the given attribute, or if the setting + * method fails. + */ + public void setAttribute(final Project p, final Object element, final String attributeName, + final String value) throws BuildException { + setAttribute(p, element, attributeName, (Object) value); + } + + /** + * Adds PCDATA to an element, using the element's + * void addText(String) method, if it has one. If no + * such method is present, a BuildException is thrown if the + * given text contains non-whitespace. + * + * @param project The project which the element is part of. + * Must not be null. + * @param element The element to add the text to. + * Must not be null. + * @param text The text to add. + * Must not be null. + * + * @exception BuildException if non-whitespace text is provided and no + * method is available to handle it, or if + * the handling method fails. + */ + public void addText(final Project project, final Object element, String text) + throws BuildException { + if (addText == null) { + text = text.trim(); + // Element doesn't handle text content + if (text.length() == 0) { + // Only whitespace - ignore + return; + } + // Not whitespace - fail + throw new BuildException(project.getElementName(element) + + " doesn't support nested text data (\"" + condenseText(text) + "\")."); + } + try { + addText.invoke(element, new Object[] {text}); + } catch (final IllegalAccessException ie) { + // impossible as getMethods should only return public methods + throw new BuildException(ie); + } catch (final InvocationTargetException ite) { + throw extractBuildException(ite); + } + } + + /** + * part of the error message created by {@link #throwNotSupported + * throwNotSupported}. + * @since Ant 1.8.0 + */ + protected static final String NOT_SUPPORTED_CHILD_PREFIX = + " doesn't support the nested \""; + + /** + * part of the error message created by {@link #throwNotSupported + * throwNotSupported}. + * @since Ant 1.8.0 + */ + protected static final String NOT_SUPPORTED_CHILD_POSTFIX = "\" element."; + + /** + * Utility method to throw a NotSupported exception + * + * @param project the Project instance. + * @param parent the object which doesn't support a requested element + * @param elementName the name of the Element which is trying to be created. + */ + public void throwNotSupported(final Project project, final Object parent, final String elementName) { + final String msg = project.getElementName(parent) + + NOT_SUPPORTED_CHILD_PREFIX + elementName + + NOT_SUPPORTED_CHILD_POSTFIX; + throw new UnsupportedElementException(msg, elementName); + } + + /** + * Get the specific NestedCreator for a given project/parent/element combination + * @param project ant project + * @param parentUri URI of the parent. + * @param parent the parent class + * @param elementName element to work with. This can contain + * a URI,localname tuple of of the form uri:localname + * @param child the bit of XML to work with + * @return a nested creator that can handle the child elements. + * @throws BuildException if the parent does not support child elements of that name + */ + private NestedCreator getNestedCreator( + final Project project, String parentUri, final Object parent, + final String elementName, final UnknownElement child) throws BuildException { + + String uri = ProjectHelper.extractUriFromComponentName(elementName); + final String name = ProjectHelper.extractNameFromComponentName(elementName); + + if (uri.equals(ProjectHelper.ANT_CORE_URI)) { + uri = ""; + } + if (parentUri.equals(ProjectHelper.ANT_CORE_URI)) { + parentUri = ""; + } + NestedCreator nc = null; + if (uri.equals(parentUri) || uri.length() == 0) { + nc = nestedCreators.get(name.toLowerCase(Locale.ENGLISH)); + } + if (nc == null) { + nc = createAddTypeCreator(project, parent, elementName); + } + if (nc == null && + (parent instanceof DynamicElementNS + || parent instanceof DynamicElement) + ) { + final String qName = child == null ? name : child.getQName(); + final Object nestedElement = + createDynamicElement(parent, + child == null ? "" : child.getNamespace(), + name, qName); + if (nestedElement != null) { + nc = new NestedCreator(null) { + @Override + Object create(final Project project, final Object parent, final Object ignore) { + return nestedElement; + } + }; + } + } + if (nc == null) { + throwNotSupported(project, parent, elementName); + } + return nc; + } + + /** + * Invokes the "correct" createDynamicElement method on parent in + * order to obtain a child element by name. + * + * @since Ant 1.8.0. + */ + private Object createDynamicElement(final Object parent, final String ns, + final String localName, final String qName) { + Object nestedElement = null; + if (parent instanceof DynamicElementNS) { + final DynamicElementNS dc = (DynamicElementNS) parent; + nestedElement = dc.createDynamicElement(ns, localName, qName); + } + if (nestedElement == null && parent instanceof DynamicElement) { + final DynamicElement dc = (DynamicElement) parent; + nestedElement = + dc.createDynamicElement(localName.toLowerCase(Locale.ENGLISH)); + } + return nestedElement; + } + + /** + * Creates a named nested element. Depending on the results of the + * initial introspection, either a method in the given parent instance + * or a simple no-arg constructor is used to create an instance of the + * specified element type. + * + * @param project Project to which the parent object belongs. + * Must not be null. If the resulting + * object is an instance of ProjectComponent, its + * Project reference is set to this parameter value. + * @param parent Parent object used to create the instance. + * Must not be null. + * @param elementName Name of the element to create an instance of. + * Must not be null. + * + * @return an instance of the specified element type + * @deprecated since 1.6.x. + * This is not a namespace aware method. + * + * @exception BuildException if no method is available to create the + * element instance, or if the creating method fails. + */ + @Deprecated + public Object createElement(final Project project, final Object parent, final String elementName) + throws BuildException { + final NestedCreator nc = getNestedCreator(project, "", parent, elementName, null); + try { + final Object nestedElement = nc.create(project, parent, null); + if (project != null) { + project.setProjectReference(nestedElement); + } + return nestedElement; + } catch (final IllegalAccessException ie) { + // impossible as getMethods should only return public methods + throw new BuildException(ie); + } catch (final InstantiationException ine) { + // impossible as getMethods should only return public methods + throw new BuildException(ine); + } catch (final InvocationTargetException ite) { + throw extractBuildException(ite); + } + } + + /** + * returns an object that creates and stores an object + * for an element of a parent. + * + * @param project Project to which the parent object belongs. + * @param parentUri The namespace uri of the parent object. + * @param parent Parent object used to create the creator object to + * create and store and instance of a subelement. + * @param elementName Name of the element to create an instance of. + * @param ue The unknown element associated with the element. + * @return a creator object to create and store the element instance. + */ + public Creator getElementCreator( + final Project project, final String parentUri, final Object parent, final String elementName, final UnknownElement ue) { + final NestedCreator nc = getNestedCreator(project, parentUri, parent, elementName, ue); + return new Creator(project, parent, nc); + } + + /** + * Indicates whether the introspected class is a dynamic one, + * supporting arbitrary nested elements and/or attributes. + * + * @return
    true if the introspected class is dynamic; + * false otherwise.
    + * @since Ant 1.6.3 + * + * @see DynamicElement + * @see DynamicElementNS + */ + public boolean isDynamic() { + return DynamicElement.class.isAssignableFrom(bean) + || DynamicElementNS.class.isAssignableFrom(bean); + } + + /** + * Indicates whether the introspected class is a task container, + * supporting arbitrary nested tasks/types. + * + * @return true if the introspected class is a container; + * false otherwise. + * @since Ant 1.6.3 + * + * @see TaskContainer + */ + public boolean isContainer() { + return TaskContainer.class.isAssignableFrom(bean); + } + + /** + * Indicates if this element supports a nested element of the + * given name. + * + * @param elementName the name of the nested element being checked + * + * @return true if the given nested element is supported + */ + public boolean supportsNestedElement(final String elementName) { + return supportsNestedElement("", elementName); + } + + /** + * Indicate if this element supports a nested element of the + * given name. + * + *

    Note that this method will always return true if the + * introspected class is {@link #isDynamic dynamic} or contains a + * method named "add" with void return type and a single argument. + * To ge a more thorough answer, use the four-arg version of this + * method instead.

    + * + * @param parentUri the uri of the parent + * @param elementName the name of the nested element being checked + * + * @return true if the given nested element is supported + */ + public boolean supportsNestedElement(final String parentUri, final String elementName) { + if (isDynamic() || addTypeMethods.size() > 0) { + return true; + } + return supportsReflectElement(parentUri, elementName); + } + + /** + * Indicate if this element supports a nested element of the + * given name. + * + *

    Note that this method will always return true if the + * introspected class is {@link #isDynamic dynamic}, so be + * prepared to catch an exception about unsupported children when + * calling {@link #getElementCreator getElementCreator}.

    + * + * @param parentUri the uri of the parent + * @param elementName the name of the nested element being checked + * @param project currently executing project instance + * @param parent the parent element + * + * @return true if the given nested element is supported + * @since Ant 1.8.0. + */ + public boolean supportsNestedElement(final String parentUri, final String elementName, + final Project project, final Object parent) { + if (addTypeMethods.size() > 0 + && createAddTypeCreator(project, parent, elementName) != null) { + return true; + } + return isDynamic() || supportsReflectElement(parentUri, elementName); + } + + /** + * Check if this element supports a nested element from reflection. + * + * @param parentUri the uri of the parent + * @param elementName the name of the nested element being checked + * + * @return true if the given nested element is supported + * @since Ant 1.8.0 + */ + public boolean supportsReflectElement( + String parentUri, final String elementName) { + final String name = ProjectHelper.extractNameFromComponentName(elementName); + if (!nestedCreators.containsKey(name.toLowerCase(Locale.ENGLISH))) { + return false; + } + String uri = ProjectHelper.extractUriFromComponentName(elementName); + if (uri.equals(ProjectHelper.ANT_CORE_URI)) { + uri = ""; + } + if ("".equals(uri)) { + return true; + } + if (parentUri.equals(ProjectHelper.ANT_CORE_URI)) { + parentUri = ""; + } + return uri.equals(parentUri); + } + + /** + * Stores a named nested element using a storage method determined + * by the initial introspection. If no appropriate storage method + * is available, this method returns immediately. + * + * @param project Ignored in this implementation. + * May be null. + * + * @param parent Parent instance to store the child in. + * Must not be null. + * + * @param child Child instance to store in the parent. + * Should not be null. + * + * @param elementName Name of the child element to store. + * May be null, in which case + * this method returns immediately. + * + * @exception BuildException if the storage method fails. + */ + public void storeElement(final Project project, final Object parent, final Object child, + final String elementName) throws BuildException { + if (elementName == null) { + return; + } + final NestedCreator ns = nestedCreators.get(elementName.toLowerCase(Locale.ENGLISH)); + if (ns == null) { + return; + } + try { + ns.store(parent, child); + } catch (final IllegalAccessException ie) { + // impossible as getMethods should only return public methods + throw new BuildException(ie); + } catch (final InstantiationException ine) { + // impossible as getMethods should only return public methods + throw new BuildException(ine); + } catch (final InvocationTargetException ite) { + throw extractBuildException(ite); + } + } + + /** + * Helper method to extract the inner fault from an {@link InvocationTargetException}, and turn + * it into a BuildException. If it is already a BuildException, it is type cast and returned; if + * not a new BuildException is created containing the child as nested text. + * @param ite + * @return the nested exception + */ + private static BuildException extractBuildException(final InvocationTargetException ite) { + final Throwable t = ite.getTargetException(); + if (t instanceof BuildException) { + return (BuildException) t; + } + return new BuildException(t); + } + + /** + * Returns the type of a named nested element. + * + * @param elementName The name of the element to find the type of. + * Must not be null. + * + * @return the type of the nested element with the specified name. + * This will never be null. + * + * @exception BuildException if the introspected class does not + * support the named nested element. + */ + public Class getElementType(final String elementName) throws BuildException { + final Class nt = nestedTypes.get(elementName); + if (nt == null) { + throw new UnsupportedElementException("Class " + + bean.getName() + " doesn't support the nested \"" + + elementName + "\" element.", elementName); + } + return nt; + } + + /** + * Returns the type of a named attribute. + * + * @param attributeName The name of the attribute to find the type of. + * Must not be null. + * + * @return the type of the attribute with the specified name. + * This will never be null. + * + * @exception BuildException if the introspected class does not + * support the named attribute. + */ + public Class getAttributeType(final String attributeName) throws BuildException { + final Class at = attributeTypes.get(attributeName); + if (at == null) { + throw new UnsupportedAttributeException("Class " + + bean.getName() + " doesn't support the \"" + + attributeName + "\" attribute.", attributeName); + } + return at; + } + + /** + * Returns the addText method when the introspected + * class supports nested text. + * + * @return the method on this introspected class that adds nested text. + * Cannot be null. + * @throws BuildException if the introspected class does not + * support the nested text. + * @since Ant 1.6.3 + */ + public Method getAddTextMethod() throws BuildException { + if (!supportsCharacters()) { + throw new BuildException("Class " + bean.getName() + + " doesn't support nested text data."); + } + return addText; + } + + /** + * Returns the adder or creator method of a named nested element. + * + * @param elementName The name of the attribute to find the setter + * method of. Must not be null. + * @return the method on this introspected class that adds or creates this + * nested element. Can be null when the introspected + * class is a dynamic configurator! + * @throws BuildException if the introspected class does not + * support the named nested element. + * @since Ant 1.6.3 + */ + public Method getElementMethod(final String elementName) throws BuildException { + final Object creator = nestedCreators.get(elementName); + if (creator == null) { + throw new UnsupportedElementException("Class " + + bean.getName() + " doesn't support the nested \"" + + elementName + "\" element.", elementName); + } + return ((NestedCreator) creator).method; + } + + /** + * Returns the setter method of a named attribute. + * + * @param attributeName The name of the attribute to find the setter + * method of. Must not be null. + * @return the method on this introspected class that sets this attribute. + * This will never be null. + * @throws BuildException if the introspected class does not + * support the named attribute. + * @since Ant 1.6.3 + */ + public Method getAttributeMethod(final String attributeName) throws BuildException { + final Object setter = attributeSetters.get(attributeName); + if (setter == null) { + throw new UnsupportedAttributeException("Class " + + bean.getName() + " doesn't support the \"" + + attributeName + "\" attribute.", attributeName); + } + return ((AttributeSetter) setter).method; + } + + /** + * Returns whether or not the introspected class supports PCDATA. + * + * @return whether or not the introspected class supports PCDATA. + */ + public boolean supportsCharacters() { + return addText != null; + } + + /** + * Returns an enumeration of the names of the attributes supported by the introspected class. + * + * @return an enumeration of the names of the attributes supported by the introspected class. + * @see #getAttributeMap + */ + public Enumeration getAttributes() { + return attributeSetters.keys(); + } + + /** + * Returns a read-only map of attributes supported by the introspected class. + * + * @return an attribute name to attribute Class + * unmodifiable map. Can be empty, but never null. + * @since Ant 1.6.3 + */ + public Map> getAttributeMap() { + return attributeTypes.isEmpty() + ? Collections.> emptyMap() : Collections.unmodifiableMap(attributeTypes); + } + + /** + * Returns an enumeration of the names of the nested elements supported + * by the introspected class. + * + * @return an enumeration of the names of the nested elements supported + * by the introspected class. + * @see #getNestedElementMap + */ + public Enumeration getNestedElements() { + return nestedTypes.keys(); + } + + /** + * Returns a read-only map of nested elements supported + * by the introspected class. + * + * @return a nested-element name to nested-element Class + * unmodifiable map. Can be empty, but never null. + * @since Ant 1.6.3 + */ + public Map> getNestedElementMap() { + return nestedTypes.isEmpty() + ? Collections.> emptyMap() : Collections.unmodifiableMap(nestedTypes); + } + + /** + * Returns a read-only list of extension points supported + * by the introspected class. + *

    + * A task/type or nested element with void methods named add() + * or addConfigured(), taking a single class or interface + * argument, supports extensions point. This method returns the list of + * all these void add[Configured](type) methods. + * + * @return a list of void, single argument add() or addConfigured() + * Methods of all supported extension points. + * These methods are sorted such that if the argument type of a + * method derives from another type also an argument of a method + * of this list, the method with the most derived argument will + * always appear first. Can be empty, but never null. + * @since Ant 1.6.3 + */ + public List getExtensionPoints() { + return addTypeMethods.isEmpty() + ? Collections. emptyList() : Collections.unmodifiableList(addTypeMethods); + } + + /** + * Creates an implementation of AttributeSetter for the given + * attribute type. Conversions (where necessary) are automatically + * made for the following types: + *

      + *
    • String (left as it is) + *
    • Character/char (first character is used) + *
    • Boolean/boolean + * ({@link Project#toBoolean(String) Project.toBoolean(String)} is used) + *
    • Class (Class.forName is used) + *
    • File (resolved relative to the appropriate project) + *
    • Path (resolve relative to the appropriate project) + *
    • Resource (resolved as a FileResource relative to the appropriate project) + *
    • FileProvider (resolved as a FileResource relative to the appropriate project) + *
    • EnumeratedAttribute (uses its own + * {@link EnumeratedAttribute#setValue(String) setValue} method) + *
    • Other primitive types (wrapper classes are used with constructors + * taking String) + *
    + * + * If none of the above covers the given parameters, a constructor for the + * appropriate class taking a String parameter is used if it is available. + * + * @param m The method to invoke on the bean when the setter is invoked. + * Must not be null. + * @param arg The type of the single argument of the bean's method. + * Must not be null. + * @param attrName the name of the attribute for which the setter is being + * created. + * + * @return an appropriate AttributeSetter instance, or null + * if no appropriate conversion is available. + */ + private AttributeSetter createAttributeSetter(final Method m, + final Class arg, + final String attrName) { + // use wrappers for primitive classes, e.g. int and + // Integer are treated identically + final Class reflectedArg = PRIMITIVE_TYPE_MAP.containsKey(arg) + ? PRIMITIVE_TYPE_MAP.get(arg) : arg; + + // Object.class - it gets handled differently by AttributeSetter + if (java.lang.Object.class == reflectedArg) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, + IllegalAccessException { + throw new BuildException( + "Internal ant problem - this should not get called"); + } + }; + } + // simplest case - setAttribute expects String + if (java.lang.String.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException { + m.invoke(parent, (Object[]) new String[] {value}); + } + }; + } + // char and Character get special treatment - take the first character + if (java.lang.Character.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException { + if (value.length() == 0) { + throw new BuildException("The value \"\" is not a " + + "legal value for attribute \"" + attrName + "\""); + } + m.invoke(parent, (Object[]) new Character[] {new Character(value.charAt(0))}); + } + }; + } + // boolean and Boolean get special treatment because we have a nice method in Project + if (java.lang.Boolean.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException { + m.invoke(parent, (Object[]) new Boolean[] { + Project.toBoolean(value) ? Boolean.TRUE : Boolean.FALSE }); + } + }; + } + // Class doesn't have a String constructor but a decent factory method + if (java.lang.Class.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException, BuildException { + try { + m.invoke(parent, new Object[] {Class.forName(value)}); + } catch (final ClassNotFoundException ce) { + throw new BuildException(ce); + } + } + }; + } + // resolve relative paths through Project + if (java.io.File.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException { + m.invoke(parent, new Object[] {p.resolveFile(value)}); + } + }; + } + // resolve Resources/FileProviders as FileResources relative to Project: + if (Resource.class.equals(reflectedArg) || FileProvider.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + void set(final Project p, final Object parent, final String value) throws InvocationTargetException, + IllegalAccessException, BuildException { + m.invoke(parent, new Object[] {new FileResource(p, p.resolveFile(value))}); + }; + }; + } + // EnumeratedAttributes have their own helper class + if (EnumeratedAttribute.class.isAssignableFrom(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException, BuildException { + try { + final EnumeratedAttribute ea = (EnumeratedAttribute) reflectedArg.newInstance(); + ea.setValue(value); + m.invoke(parent, new Object[] {ea}); + } catch (final InstantiationException ie) { + throw new BuildException(ie); + } + } + }; + } + + final AttributeSetter setter = getEnumSetter(reflectedArg, m, arg); + if (setter != null) { + return setter; + } + + if (java.lang.Long.class.equals(reflectedArg)) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException, BuildException { + try { + m.invoke(parent, new Object[] { + new Long(StringUtils.parseHumanSizes(value)) }); + } catch (final NumberFormatException e) { + throw new BuildException("Can't assign non-numeric" + + " value '" + value + "' to" + + " attribute " + attrName); + } catch (final InvocationTargetException e) { + throw e; + } catch (final IllegalAccessException e) { + throw e; + } catch (final Exception e) { + throw new BuildException(e); + } + } + }; + } + // worst case. look for a public String constructor and use it + // also supports new Whatever(Project, String) as for Path or Reference + // This is used (deliberately) for all primitives/wrappers other than + // char, boolean, and long. + boolean includeProject; + Constructor c; + try { + // First try with Project. + c = reflectedArg.getConstructor(Project.class, String.class); + includeProject = true; + } catch (final NoSuchMethodException nme) { + // OK, try without. + try { + c = reflectedArg.getConstructor(String.class); + includeProject = false; + } catch (final NoSuchMethodException nme2) { + // Well, no matching constructor. + return null; + } + } + final boolean finalIncludeProject = includeProject; + final Constructor finalConstructor = c; + + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException, BuildException { + try { + final Object[] args = finalIncludeProject + ? new Object[] {p, value} : new Object[] {value}; + + final Object attribute = finalConstructor.newInstance(args); + if (p != null) { + p.setProjectReference(attribute); + } + m.invoke(parent, new Object[] {attribute}); + } catch (final InvocationTargetException e) { + final Throwable cause = e.getCause(); + if (cause instanceof IllegalArgumentException) { + throw new BuildException("Can't assign value '" + value + + "' to attribute " + attrName + + ", reason: " + + cause.getClass() + + " with message '" + + cause.getMessage() + "'"); + } + throw e; + } catch (final InstantiationException ie) { + throw new BuildException(ie); + } + } + }; + } + + private AttributeSetter getEnumSetter( + final Class reflectedArg, final Method m, final Class arg) { + if (reflectedArg.isEnum()) { + return new AttributeSetter(m, arg) { + @Override + public void set(final Project p, final Object parent, final String value) + throws InvocationTargetException, IllegalAccessException, + BuildException { + Enum setValue; + try { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final Enum enumValue = Enum.valueOf((Class) reflectedArg, + value); + setValue = enumValue; + } catch (final IllegalArgumentException e) { + //there is specific logic here for the value + // being out of the allowed set of enumerations. + throw new BuildException("'" + value + "' is not a permitted value for " + + reflectedArg.getName()); + } + m.invoke(parent, setValue); + } + }; + } + return null; + } + + /** + * Returns a description of the type of the given element in + * relation to a given project. This is used for logging purposes + * when the element is asked to cope with some data it has no way of handling. + * + * @param project The project the element is defined in. Must not be null. + * + * @param element The element to describe. Must not be null. + * + * @return a description of the element type + */ + private String getElementName(final Project project, final Object element) { + return project.getElementName(element); + } + + /** + * Extracts the name of a property from a method name by subtracting + * a given prefix and converting into lower case. It is up to calling + * code to make sure the method name does actually begin with the + * specified prefix - no checking is done in this method. + * + * @param methodName The name of the method in question. Must not be null. + * @param prefix The prefix to remove. Must not be null. + * + * @return the lower-cased method name with the prefix removed. + */ + private static String getPropertyName(final String methodName, final String prefix) { + return methodName.substring(prefix.length()).toLowerCase(Locale.ENGLISH); + } + + /** + * creator - allows use of create/store external + * to IntrospectionHelper. + * The class is final as it has a private constructor. + */ + public static final class Creator { + private final NestedCreator nestedCreator; + private final Object parent; + private final Project project; + private Object nestedObject; + private String polyType; + + /** + * Creates a new Creator instance. + * This object is given to the UnknownElement to create + * objects for sub-elements. UnknownElement calls + * create to create an object, the object then gets + * configured and then UnknownElement calls store. + * SetPolyType may be used to override the type used + * to create the object with. SetPolyType gets called before create. + * + * @param project the current project + * @param parent the parent object to create the object in + * @param nestedCreator the nested creator object to use + */ + private Creator(final Project project, final Object parent, final NestedCreator nestedCreator) { + this.project = project; + this.parent = parent; + this.nestedCreator = nestedCreator; + } + + /** + * Used to override the class used to create the object. + * + * @param polyType a ant component type name + */ + public void setPolyType(final String polyType) { + this.polyType = polyType; + } + + /** + * Create an object using this creator, which is determined by introspection. + * + * @return the created object + */ + public Object create() { + if (polyType != null) { + if (!nestedCreator.isPolyMorphic()) { + throw new BuildException( + "Not allowed to use the polymorphic form for this element"); + } + final ComponentHelper helper = ComponentHelper.getComponentHelper(project); + nestedObject = helper.createComponent(polyType); + if (nestedObject == null) { + throw new BuildException("Unable to create object of type " + polyType); + } + } + try { + nestedObject = nestedCreator.create(project, parent, nestedObject); + if (project != null) { + project.setProjectReference(nestedObject); + } + return nestedObject; + } catch (final IllegalAccessException ex) { + throw new BuildException(ex); + } catch (final InstantiationException ex) { + throw new BuildException(ex); + } catch (final IllegalArgumentException ex) { + if (polyType == null) { + throw ex; + } + throw new BuildException("Invalid type used " + polyType); + } catch (final InvocationTargetException ex) { + throw extractBuildException(ex); + } + } + + /** + * @return the real object (used currently only for presetdef). + */ + public Object getRealObject() { + return nestedCreator.getRealObject(); + } + + /** + * Stores the nested element object using a storage method determined by introspection. + * + */ + public void store() { + try { + nestedCreator.store(parent, nestedObject); + } catch (final IllegalAccessException ex) { + throw new BuildException(ex); + } catch (final InstantiationException ex) { + throw new BuildException(ex); + } catch (final IllegalArgumentException ex) { + if (polyType == null) { + throw ex; + } + throw new BuildException("Invalid type used " + polyType); + } catch (final InvocationTargetException ex) { + throw extractBuildException(ex); + } + } + } + + /** + * Internal interface used to create nested elements. Not documented + * in detail for reasons of source code readability. + */ + private abstract static class NestedCreator { + private final Method method; // the method called to add/create the nested element + + protected NestedCreator(final Method m) { + method = m; + } + Method getMethod() { + return method; + } + boolean isPolyMorphic() { + return false; + } + Object getRealObject() { + return null; + } + abstract Object create(Project project, Object parent, Object child) + throws InvocationTargetException, IllegalAccessException, InstantiationException; + + void store(final Object parent, final Object child) + throws InvocationTargetException, IllegalAccessException, InstantiationException { + // DO NOTHING + } + } + + private static class CreateNestedCreator extends NestedCreator { + CreateNestedCreator(final Method m) { + super(m); + } + + @Override + Object create(final Project project, final Object parent, final Object ignore) + throws InvocationTargetException, IllegalAccessException { + return getMethod().invoke(parent, new Object[] {}); + } + } + + /** Version to use for addXXX and addConfiguredXXX */ + private static class AddNestedCreator extends NestedCreator { + + static final int ADD = 1; + static final int ADD_CONFIGURED = 2; + + private final Constructor constructor; + private final int behavior; // ADD or ADD_CONFIGURED + + AddNestedCreator(final Method m, final Constructor c, final int behavior) { + super(m); + this.constructor = c; + this.behavior = behavior; + } + + @Override + boolean isPolyMorphic() { + return true; + } + + @Override + Object create(final Project project, final Object parent, Object child) + throws InvocationTargetException, IllegalAccessException, InstantiationException { + if (child == null) { + child = constructor.newInstance( + constructor.getParameterTypes().length == 0 + ? new Object[] {} : new Object[] {project}); + } + if (child instanceof PreSetDef.PreSetDefinition) { + child = ((PreSetDef.PreSetDefinition) child).createObject(project); + } + if (behavior == ADD) { + istore(parent, child); + } + return child; + } + + @Override + void store(final Object parent, final Object child) + throws InvocationTargetException, IllegalAccessException, InstantiationException { + if (behavior == ADD_CONFIGURED) { + istore(parent, child); + } + } + + private void istore(final Object parent, final Object child) + throws InvocationTargetException, IllegalAccessException, InstantiationException { + getMethod().invoke(parent, new Object[] {child}); + } + } + + /** + * Internal interface used to setting element attributes. Not documented + * in detail for reasons of source code readability. + */ + private abstract static class AttributeSetter { + private final Method method; // the method called to set the attribute + private final Class type; + protected AttributeSetter(final Method m, final Class type) { + method = m; + this.type = type; + } + void setObject(final Project p, final Object parent, final Object value) + throws InvocationTargetException, IllegalAccessException, BuildException { + if (type != null) { + Class useType = type; + if (type.isPrimitive()) { + if (value == null) { + throw new BuildException( + "Attempt to set primitive " + + getPropertyName(method.getName(), "set") + + " to null on " + parent); + } + useType = PRIMITIVE_TYPE_MAP.get(type); + } + if (value == null || useType.isInstance(value)) { + method.invoke(parent, new Object[] {value}); + return; + } + } + set(p, parent, value.toString()); + } + abstract void set(Project p, Object parent, String value) + throws InvocationTargetException, IllegalAccessException, BuildException; + } + + /** + * Clears the static cache of on build finished. + */ + public static synchronized void clearCache() { + HELPERS.clear(); + } + + /** + * Create a NestedCreator for the given element. + * @param project owning project + * @param parent Parent object used to create the instance. + * @param elementName name of the element + * @return a nested creator, or null if there is no component of the given name, or it + * has no matching add type methods + * @throws BuildException + */ + private NestedCreator createAddTypeCreator( + final Project project, final Object parent, final String elementName) throws BuildException { + if (addTypeMethods.size() == 0) { + return null; + } + final ComponentHelper helper = ComponentHelper.getComponentHelper(project); + + final MethodAndObject restricted = createRestricted( + helper, elementName, addTypeMethods); + final MethodAndObject topLevel = createTopLevel( + helper, elementName, addTypeMethods); + + if (restricted == null && topLevel == null) { + return null; + } + + if (restricted != null && topLevel != null) { + throw new BuildException( + "ambiguous: type and component definitions for " + + elementName); + } + + final MethodAndObject methodAndObject + = restricted != null ? restricted : topLevel; + + Object rObject = methodAndObject.object; + if (methodAndObject.object instanceof PreSetDef.PreSetDefinition) { + rObject = ((PreSetDef.PreSetDefinition) methodAndObject.object) + .createObject(project); + } + final Object nestedObject = methodAndObject.object; + final Object realObject = rObject; + + return new NestedCreator(methodAndObject.method) { + @Override + Object create(final Project project, final Object parent, final Object ignore) + throws InvocationTargetException, IllegalAccessException { + if (!getMethod().getName().endsWith("Configured")) { + getMethod().invoke(parent, new Object[] {realObject}); + } + return nestedObject; + } + + @Override + Object getRealObject() { + return realObject; + } + + @Override + void store(final Object parent, final Object child) throws InvocationTargetException, + IllegalAccessException, InstantiationException { + if (getMethod().getName().endsWith("Configured")) { + getMethod().invoke(parent, new Object[] {realObject}); + } + } + }; + } + + /** + * Inserts an add or addConfigured method into + * the addTypeMethods array. The array is + * ordered so that the more derived classes are first. + * If both add and addConfigured are present, the addConfigured will take priority. + * @param method the Method to insert. + */ + private void insertAddTypeMethod(final Method method) { + final Class argClass = method.getParameterTypes()[0]; + final int size = addTypeMethods.size(); + for (int c = 0; c < size; ++c) { + final Method current = addTypeMethods.get(c); + if (current.getParameterTypes()[0].equals(argClass)) { + if (method.getName().equals("addConfigured")) { + // add configured replaces the add method + addTypeMethods.set(c, method); + } + return; // Already present + } + if (current.getParameterTypes()[0].isAssignableFrom(argClass)) { + addTypeMethods.add(c, method); + return; // higher derived + } + } + addTypeMethods.add(method); + } + + /** + * Search the list of methods to find the first method + * that has a parameter that accepts the nested element object. + * @param paramClass the Class type to search for. + * @param methods the List of methods to search. + * @return a matching Method; null if none found. + */ + private Method findMatchingMethod(final Class paramClass, final List methods) { + if (paramClass == null) { + return null; + } + Class matchedClass = null; + Method matchedMethod = null; + + final int size = methods.size(); + for (int i = 0; i < size; ++i) { + final Method method = methods.get(i); + final Class methodClass = method.getParameterTypes()[0]; + if (methodClass.isAssignableFrom(paramClass)) { + if (matchedClass == null) { + matchedClass = methodClass; + matchedMethod = method; + } else if (!methodClass.isAssignableFrom(matchedClass)) { + throw new BuildException("ambiguous: types " + matchedClass.getName() + " and " + + methodClass.getName() + " match " + paramClass.getName()); + } + } + } + return matchedMethod; + } + + private String condenseText(final String text) { + if (text.length() <= MAX_REPORT_NESTED_TEXT) { + return text; + } + final int ends = (MAX_REPORT_NESTED_TEXT - ELLIPSIS.length()) / 2; + return new StringBuffer(text).replace(ends, text.length() - ends, ELLIPSIS).toString(); + } + + + private static class MethodAndObject { + private final Method method; + private final Object object; + public MethodAndObject(final Method method, final Object object) { + this.method = method; + this.object = object; + } + } + + /** + * + */ + private AntTypeDefinition findRestrictedDefinition( + final ComponentHelper helper, final String componentName, final List methods) { + AntTypeDefinition definition = null; + Class matchedDefinitionClass = null; + + final List definitions = helper.getRestrictedDefinitions(componentName); + if (definitions == null) { + return null; + } + synchronized (definitions) { + final int size = definitions.size(); + for (int i = 0; i < size; ++i) { + final AntTypeDefinition d = definitions.get(i); + final Class exposedClass = d.getExposedClass(helper.getProject()); + if (exposedClass == null) { + continue; + } + final Method method = findMatchingMethod(exposedClass, methods); + if (method == null) { + continue; + } + if (matchedDefinitionClass != null) { + throw new BuildException( + "ambiguous: restricted definitions for " + + componentName + " " + + matchedDefinitionClass + " and " + exposedClass); + } + matchedDefinitionClass = exposedClass; + definition = d; + } + } + return definition; + } + + private MethodAndObject createRestricted( + final ComponentHelper helper, final String elementName, final List addTypeMethods) { + + final Project project = helper.getProject(); + + final AntTypeDefinition restrictedDefinition = + findRestrictedDefinition(helper, elementName, addTypeMethods); + + if (restrictedDefinition == null) { + return null; + } + + final Method addMethod = findMatchingMethod( + restrictedDefinition.getExposedClass(project), addTypeMethods); + if (addMethod == null) { + throw new BuildException( + "Ant Internal Error - contract mismatch for " + + elementName); + } + final Object addedObject = restrictedDefinition.create(project); + if (addedObject == null) { + throw new BuildException( + "Failed to create object " + elementName + + " of type " + restrictedDefinition.getTypeClass(project)); + } + return new MethodAndObject(addMethod, addedObject); + } + + private MethodAndObject createTopLevel( + final ComponentHelper helper, final String elementName, final List methods) { + final Class clazz = helper.getComponentClass(elementName); + if (clazz == null) { + return null; + } + final Method addMethod = findMatchingMethod(clazz, addTypeMethods); + if (addMethod == null) { + return null; + } + final Object addedObject = helper.createComponent(elementName); + return new MethodAndObject(addMethod, addedObject); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Location.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Location.java new file mode 100644 index 00000000..8e25d107 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Location.java @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.Serializable; + +import org.apache.tools.ant.util.FileUtils; +import org.xml.sax.Locator; + +/** + * Stores the location of a piece of text within a file (file name, + * line number and column number). Note that the column number is + * currently ignored. + * + */ +public class Location implements Serializable { + private static final long serialVersionUID = 1L; + + /** Name of the file. */ + private final String fileName; + /** Line number within the file. */ + private final int lineNumber; + /** Column number within the file. */ + private final int columnNumber; + + /** Location to use when one is needed but no information is available */ + public static final Location UNKNOWN_LOCATION = new Location(); + + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** + * Creates an "unknown" location. + */ + private Location() { + this(null, 0, 0); + } + + /** + * Creates a location consisting of a file name but no line number or + * column number. + * + * @param fileName The name of the file. May be null, + * in which case the location is equivalent to + * {@link #UNKNOWN_LOCATION UNKNOWN_LOCATION}. + */ + public Location(String fileName) { + this(fileName, 0, 0); + } + + /** + * Creates a location from the SAX locator using the system ID as + * the filename. + * + * @param loc Must not be null. + * + * @since Ant 1.6 + */ + public Location(Locator loc) { + this(loc.getSystemId(), loc.getLineNumber(), loc.getColumnNumber()); + } + + /** + * Creates a location consisting of a file name, line number and + * column number. + * + * @param fileName The name of the file. May be null, + * in which case the location is equivalent to + * {@link #UNKNOWN_LOCATION UNKNOWN_LOCATION}. + * + * @param lineNumber Line number within the file. Use 0 for unknown + * positions within a file. + * @param columnNumber Column number within the line. + */ + public Location(String fileName, int lineNumber, int columnNumber) { + if (fileName != null && fileName.startsWith("file:")) { + this.fileName = FILE_UTILS.fromURI(fileName); + } else { + this.fileName = fileName; + } + this.lineNumber = lineNumber; + this.columnNumber = columnNumber; + } + + /** + * @return the filename portion of the location + * @since Ant 1.6 + */ + public String getFileName() { + return fileName; + } + + /** + * @return the line number + * @since Ant 1.6 + */ + public int getLineNumber() { + return lineNumber; + } + + /** + * @return the column number + * @since Ant 1.7 + */ + public int getColumnNumber() { + return columnNumber; + } + + /** + * Returns the file name, line number, a colon and a trailing space. + * An error message can be appended easily. For unknown locations, an + * empty string is returned. + * + * @return a String of the form "fileName:lineNumber: " + * if both file name and line number are known, + * "fileName: " if only the file name is known, + * and the empty string for unknown locations. + */ + public String toString() { + StringBuffer buf = new StringBuffer(); + + if (fileName != null) { + buf.append(fileName); + + if (lineNumber != 0) { + buf.append(":"); + buf.append(lineNumber); + } + + buf.append(": "); + } + + return buf.toString(); + } + + /** + * Equality operation. + * @param other the object to compare to. + * @return true if the other object contains the same information + * as this object. + * @since Ant 1.6.3 + */ + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null) { + return false; + } + if (!(other.getClass() == getClass())) { + return false; + } + return toString().equals(other.toString()); + } + + /** + * Hash operation. + * @return a hash code value for this location. + * @since Ant 1.6.3 + */ + public int hashCode() { + return toString().hashCode(); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/MagicNames.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/MagicNames.java new file mode 100644 index 00000000..bc39a257 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/MagicNames.java @@ -0,0 +1,293 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import org.apache.tools.ant.launch.Launcher; + +/** + * Magic names used within Ant. + * + * Not all magic names are here yet. + * + * @since Ant 1.6 + */ +public final class MagicNames { + + private MagicNames() { + } + + /** + * prefix for antlib URIs: + * {@value} + */ + public static final String ANTLIB_PREFIX = "antlib:"; + + /** + * Ant version property. + * Value: {@value} + */ + public static final String ANT_VERSION = "ant.version"; + + /** + * System classpath policy. + * Value: {@value} + */ + public static final String BUILD_SYSCLASSPATH = "build.sysclasspath"; + + /** + * The name of the script repository used by the script repo task. + * Value {@value} + */ + public static final String SCRIPT_REPOSITORY = "org.apache.ant.scriptrepo"; + + /** + * The name of the reference to the System Class Loader. + * Value {@value} + **/ + public static final String SYSTEM_LOADER_REF = "ant.coreLoader"; + + /** + * Name of the property which can provide an override of the repository dir. + * for the libraries task + * Value {@value} + */ + public static final String REPOSITORY_DIR_PROPERTY = "ant.maven.repository.dir"; + + /** + * Name of the property which can provide an override of the repository URL. + * for the libraries task + * Value {@value} + */ + public static final String REPOSITORY_URL_PROPERTY = "ant.maven.repository.url"; + + /** + * name of the resource that taskdefs are stored under. + * Value: {@value} + */ + public static final String TASKDEF_PROPERTIES_RESOURCE = + "/org/apache/tools/ant/taskdefs/defaults.properties"; + + /** + * name of the resource that typedefs are stored under. + * Value: {@value} + */ + public static final String TYPEDEFS_PROPERTIES_RESOURCE = + "/org/apache/tools/ant/types/defaults.properties"; + + /** + * Reference to the current Ant executor. + * Value: {@value} + */ + public static final String ANT_EXECUTOR_REFERENCE = "ant.executor"; + + /** + * Property defining the classname of an executor. + * Value: {@value} + */ + public static final String ANT_EXECUTOR_CLASSNAME = "ant.executor.class"; + + /** + * property name for basedir of the project. + * Value: {@value} + */ + public static final String PROJECT_BASEDIR = "basedir"; + + /** + * property for ant file name. + * Value: {@value} + */ + public static final String ANT_FILE = "ant.file"; + + /** + * property for type of ant build file (either file or url) + * Value: {@value} + * @since Ant 1.8.0 + */ + public static final String ANT_FILE_TYPE = "ant.file.type"; + + /** + * ant build file of type file + * Value: {@value} + * @since Ant 1.8.0 + */ + public static final String ANT_FILE_TYPE_FILE = "file"; + + /** + * ant build file of type url + * Value: {@value} + * @since Ant 1.8.0 + */ + public static final String ANT_FILE_TYPE_URL = "url"; + + /** + * Property used to store the java version ant is running in. + * Value: {@value} + * @since Ant 1.7 + */ + public static final String ANT_JAVA_VERSION = "ant.java.version"; + + /** + * Property used to store the location of ant. + * Value: {@value} + * @since Ant 1.7 + */ + public static final String ANT_HOME = Launcher.ANTHOME_PROPERTY; + + /** + * Property used to store the location of the ant library (typically the ant.jar file.) + * Value: {@value} + * @since Ant 1.7 + */ + public static final String ANT_LIB = "ant.core.lib"; + + /** + * property for regular expression implementation. + * Value: {@value} + */ + public static final String REGEXP_IMPL = "ant.regexp.regexpimpl"; + + /** + * property that provides the default value for javac's and + * javadoc's source attribute. + * Value: {@value} + * @since Ant 1.7 + */ + public static final String BUILD_JAVAC_SOURCE = "ant.build.javac.source"; + + /** + * property that provides the default value for javac's target attribute. + * Value: {@value} + * @since Ant 1.7 + */ + public static final String BUILD_JAVAC_TARGET = "ant.build.javac.target"; + + /** + * Name of the magic property that controls classloader reuse. + * Value: {@value} + * @since Ant 1.4. + */ + public static final String REFID_CLASSPATH_REUSE_LOADER = "ant.reuse.loader"; + + /** + * Prefix used to store classloader references. + * Value: {@value} + */ + public static final String REFID_CLASSPATH_LOADER_PREFIX = "ant.loader."; + + /** + * Reference used to store the property helper. + * Value: {@value} + */ + public static final String REFID_PROPERTY_HELPER = "ant.PropertyHelper"; + + /** + * Reference used to store the local properties. + * Value: {@value} + */ + public static final String REFID_LOCAL_PROPERTIES = "ant.LocalProperties"; + + /** + * Name of JVM system property which provides the name of the ProjectHelper class to use. + * Value: {@value} + */ + public static final String PROJECT_HELPER_CLASS = "org.apache.tools.ant.ProjectHelper"; + + /** + * The service identifier in jars which provide ProjectHelper implementations. + * Value: {@value} + */ + public static final String PROJECT_HELPER_SERVICE = + "META-INF/services/org.apache.tools.ant.ProjectHelper"; + + /** + * Name of ProjectHelper reference that we add to a project. + * Value: {@value} + */ + public static final String REFID_PROJECT_HELPER = "ant.projectHelper"; + + /** + * Name of the property holding the name of the currently + * executing project, if one has been specified. + * + * Value: {@value} + * @since Ant 1.8.0 + */ + public static final String PROJECT_NAME = "ant.project.name"; + + /** + * Name of the property holding the default target of the + * currently executing project, if one has been specified. + * + * Value: {@value} + * @since Ant 1.8.0 + */ + public static final String PROJECT_DEFAULT_TARGET + = "ant.project.default-target"; + + /** + * Name of the property holding a comma separated list of targets + * that have been invoked (from the command line). + * + * Value: {@value} + * @since Ant 1.8.0 + */ + public static final String PROJECT_INVOKED_TARGETS + = "ant.project.invoked-targets"; + + /** + * Name of the project reference holding an instance of {@link + * org.apache.tools.ant.taskdefs.launcher.CommandLauncher} to use + * when executing commands with the help of an external skript. + * + *

    Alternatively this is the name of a system property holding + * the fully qualified class name of a {@link + * org.apache.tools.ant.taskdefs.launcher.CommandLauncher}.

    + * + * Value: {@value} + * @since Ant 1.9.0 + */ + public static final String ANT_SHELL_LAUNCHER_REF_ID = "ant.shellLauncher"; + + /** + * Name of the project reference holding an instance of {@link + * org.apache.tools.ant.taskdefs.launcher.CommandLauncher} to use + * when executing commands without the help of an external skript. + * + *

    Alternatively this is the name of a system property holding + * the fully qualified class name of a {@link + * org.apache.tools.ant.taskdefs.launcher.CommandLauncher}.

    + * + * Value: {@value} + * @since Ant 1.9.0 + */ + public static final String ANT_VM_LAUNCHER_REF_ID = "ant.vmLauncher"; + /** + * Name of the namespace "type". + * (Note: cannot be used as an element.) + * @since Ant 1.9.1 + */ + public static final String ATTRIBUTE_NAMESPACE = "attribute namespace"; + + /** + * Name of the property which can provide an override of the + * User-Agent used in <get> tasks. + * Value {@value} + */ + public static final String HTTP_AGENT_PROPERTY = "ant.http.agent"; +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Main.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Main.java new file mode 100644 index 00000000..a9c23a53 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Main.java @@ -0,0 +1,1317 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.Set; +import java.util.Vector; + +import org.apache.tools.ant.input.DefaultInputHandler; +import org.apache.tools.ant.input.InputHandler; +import org.apache.tools.ant.launch.AntMain; +import org.apache.tools.ant.listener.SilentLogger; +import org.apache.tools.ant.property.GetProperty; +import org.apache.tools.ant.property.ResolvePropertyMap; +import org.apache.tools.ant.util.ClasspathUtils; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.ProxySetup; + + +/** + * Command line entry point into Ant. This class is entered via the + * canonical `public static void main` entry point and reads the + * command line arguments. It then assembles and executes an Ant + * project. + *

    + * If you integrating Ant into some other tool, this is not the class + * to use as an entry point. Please see the source code of this + * class to see how it manipulates the Ant project classes. + * + */ +public class Main implements AntMain { + + /** + * A Set of args that are handled by the launcher and should + * not be seen by Main. + */ + private static final Set LAUNCH_COMMANDS = Collections + .unmodifiableSet(new HashSet(Arrays.asList("-lib", "-cp", "-noclasspath", + "--noclasspath", "-nouserlib", "-main"))); + + /** The default build file name. {@value} */ + public static final String DEFAULT_BUILD_FILENAME = "build.xml"; + + /** Our current message output status. Follows Project.MSG_XXX. */ + private int msgOutputLevel = Project.MSG_INFO; + + /** File that we are using for configuration. */ + private File buildFile; /* null */ + + /** Stream to use for logging. */ + private static PrintStream out = System.out; + + /** Stream that we are using for logging error messages. */ + private static PrintStream err = System.err; + + /** The build targets. */ + private final Vector targets = new Vector(); + + /** Set of properties that can be used by tasks. */ + private final Properties definedProps = new Properties(); + + /** Names of classes to add as listeners to project. */ + private final Vector listeners = new Vector(1); + + /** File names of property files to load on startup. */ + private final Vector propertyFiles = new Vector(1); + + /** Indicates whether this build is to support interactive input */ + private boolean allowInput = true; + + /** keep going mode */ + private boolean keepGoingMode = false; + + /** + * The Ant logger class. There may be only one logger. It will have + * the right to use the 'out' PrintStream. The class must implements the + * BuildLogger interface. + */ + private String loggerClassname = null; + + /** + * The Ant InputHandler class. There may be only one input + * handler. + */ + private String inputHandlerClassname = null; + + /** + * Whether or not output to the log is to be unadorned. + */ + private boolean emacsMode = false; + + /** + * Whether or not log output should be reduced to the minimum + */ + private boolean silent = false; + + /** + * Whether or not this instance has successfully been + * constructed and is ready to run. + */ + private boolean readyToRun = false; + + /** + * Whether or not we should only parse and display the project help + * information. + */ + private boolean projectHelp = false; + + /** + * Whether or not a logfile is being used. This is used to + * check if the output streams must be closed. + */ + private static boolean isLogFileUsed = false; + + /** + * optional thread priority + */ + private Integer threadPriority = null; + + /** + * proxy flag: default is false + */ + private boolean proxy = false; + + private final Map, List> extraArguments = new HashMap, List>(); + + private static final GetProperty NOPROPERTIES = new GetProperty() { + public Object getProperty(final String aName) { + // No existing property takes precedence + return null; + } + }; + + + + + /** + * Prints the message of the Throwable if it (the message) is not + * null. + * + * @param t Throwable to print the message of. + * Must not be null. + */ + private static void printMessage(final Throwable t) { + final String message = t.getMessage(); + if (message != null) { + System.err.println(message); + } + } + + /** + * Creates a new instance of this class using the + * arguments specified, gives it any extra user properties which have been + * specified, and then runs the build using the classloader provided. + * + * @param args Command line arguments. Must not be null. + * @param additionalUserProperties Any extra properties to use in this + * build. May be null, which is the equivalent to + * passing in an empty set of properties. + * @param coreLoader Classloader used for core classes. May be + * null in which case the system classloader is used. + */ + public static void start(final String[] args, final Properties additionalUserProperties, + final ClassLoader coreLoader) { + final Main m = new Main(); + m.startAnt(args, additionalUserProperties, coreLoader); + } + + /** + * Start Ant + * @param args command line args + * @param additionalUserProperties properties to set beyond those that + * may be specified on the args list + * @param coreLoader - not used + * + * @since Ant 1.6 + */ + public void startAnt(final String[] args, final Properties additionalUserProperties, + final ClassLoader coreLoader) { + + try { + processArgs(args); + } catch (final Throwable exc) { + handleLogfile(); + printMessage(exc); + exit(1); + return; + } + + if (additionalUserProperties != null) { + for (final Enumeration e = additionalUserProperties.keys(); + e.hasMoreElements();) { + final String key = (String) e.nextElement(); + final String property = additionalUserProperties.getProperty(key); + definedProps.put(key, property); + } + } + + // expect the worst + int exitCode = 1; + try { + try { + runBuild(coreLoader); + exitCode = 0; + } catch (final ExitStatusException ese) { + exitCode = ese.getStatus(); + if (exitCode != 0) { + throw ese; + } + } + } catch (final BuildException be) { + if (err != System.err) { + printMessage(be); + } + } catch (final Throwable exc) { + exc.printStackTrace(); + printMessage(exc); + } finally { + handleLogfile(); + } + exit(exitCode); + } + + /** + * This operation is expected to call {@link System#exit(int)}, which + * is what the base version does. + * However, it is possible to do something else. + * @param exitCode code to exit with + */ + protected void exit(final int exitCode) { + System.exit(exitCode); + } + + /** + * Close logfiles, if we have been writing to them. + * + * @since Ant 1.6 + */ + private static void handleLogfile() { + if (isLogFileUsed) { + FileUtils.close(out); + FileUtils.close(err); + } + } + + /** + * Command line entry point. This method kicks off the building + * of a project object and executes a build using either a given + * target or the default target. + * + * @param args Command line arguments. Must not be null. + */ + public static void main(final String[] args) { + start(args, null, null); + } + + /** + * Constructor used when creating Main for later arg processing + * and startup + */ + public Main() { + } + + /** + * Sole constructor, which parses and deals with command line + * arguments. + * + * @param args Command line arguments. Must not be null. + * + * @exception BuildException if the specified build file doesn't exist + * or is a directory. + * + * @deprecated since 1.6.x + */ + @Deprecated + protected Main(final String[] args) throws BuildException { + processArgs(args); + } + + /** + * Process command line arguments. + * When ant is started from Launcher, launcher-only arguments do not get + * passed through to this routine. + * + * @param args the command line arguments. + * + * @since Ant 1.6 + */ + private void processArgs(final String[] args) { + String searchForThis = null; + boolean searchForFile = false; + PrintStream logTo = null; + + // cycle through given args + + boolean justPrintUsage = false; + boolean justPrintVersion = false; + boolean justPrintDiagnostics = false; + + final ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance(); + + for (int i = 0; i < args.length; i++) { + final String arg = args[i]; + + if (arg.equals("-help") || arg.equals("-h")) { + justPrintUsage = true; + } else if (arg.equals("-version")) { + justPrintVersion = true; + } else if (arg.equals("-diagnostics")) { + justPrintDiagnostics = true; + } else if (arg.equals("-quiet") || arg.equals("-q")) { + msgOutputLevel = Project.MSG_WARN; + } else if (arg.equals("-verbose") || arg.equals("-v")) { + msgOutputLevel = Project.MSG_VERBOSE; + } else if (arg.equals("-debug") || arg.equals("-d")) { + msgOutputLevel = Project.MSG_DEBUG; + } else if (arg.equals("-silent") || arg.equals("-S")) { + silent = true; + } else if (arg.equals("-noinput")) { + allowInput = false; + } else if (arg.equals("-logfile") || arg.equals("-l")) { + try { + final File logFile = new File(args[i + 1]); + i++; + logTo = new PrintStream(new FileOutputStream(logFile)); + isLogFileUsed = true; + } catch (final IOException ioe) { + final String msg = "Cannot write on the specified log file. " + + "Make sure the path exists and you have write " + + "permissions."; + throw new BuildException(msg); + } catch (final ArrayIndexOutOfBoundsException aioobe) { + final String msg = "You must specify a log file when " + + "using the -log argument"; + throw new BuildException(msg); + } + } else if (arg.equals("-buildfile") || arg.equals("-file") + || arg.equals("-f")) { + i = handleArgBuildFile(args, i); + } else if (arg.equals("-listener")) { + i = handleArgListener(args, i); + } else if (arg.startsWith("-D")) { + i = handleArgDefine(args, i); + } else if (arg.equals("-logger")) { + i = handleArgLogger(args, i); + } else if (arg.equals("-inputhandler")) { + i = handleArgInputHandler(args, i); + } else if (arg.equals("-emacs") || arg.equals("-e")) { + emacsMode = true; + } else if (arg.equals("-projecthelp") || arg.equals("-p")) { + // set the flag to display the targets and quit + projectHelp = true; + } else if (arg.equals("-find") || arg.equals("-s")) { + searchForFile = true; + // eat up next arg if present, default to build.xml + if (i < args.length - 1) { + searchForThis = args[++i]; + } + } else if (arg.startsWith("-propertyfile")) { + i = handleArgPropertyFile(args, i); + } else if (arg.equals("-k") || arg.equals("-keep-going")) { + keepGoingMode = true; + } else if (arg.equals("-nice")) { + i = handleArgNice(args, i); + } else if (LAUNCH_COMMANDS.contains(arg)) { + //catch script/ant mismatch with a meaningful message + //we could ignore it, but there are likely to be other + //version problems, so we stamp down on the configuration now + final String msg = "Ant's Main method is being handed " + + "an option " + arg + " that is only for the launcher class." + + "\nThis can be caused by a version mismatch between " + + "the ant script/.bat file and Ant itself."; + throw new BuildException(msg); + } else if (arg.equals("-autoproxy")) { + proxy = true; + } else if (arg.startsWith("-")) { + boolean processed = false; + for (final ArgumentProcessor processor : processorRegistry.getProcessors()) { + final int newI = processor.readArguments(args, i); + if (newI != -1) { + List extraArgs = extraArguments.get(processor.getClass()); + if (extraArgs == null) { + extraArgs = new ArrayList(); + extraArguments.put(processor.getClass(), extraArgs); + } + for (; i < newI && i < args.length; i++) { + extraArgs.add(args[i]); + } + processed = true; + break; + } + } + if (!processed) { + // we don't have any more args to recognize! + final String msg = "Unknown argument: " + arg; + System.err.println(msg); + printUsage(); + throw new BuildException(""); + } + } else { + // if it's no other arg, it may be the target + targets.addElement(arg); + } + } + + if (msgOutputLevel >= Project.MSG_VERBOSE || justPrintVersion) { + printVersion(msgOutputLevel); + } + + if (justPrintUsage || justPrintVersion || justPrintDiagnostics) { + if (justPrintUsage) { + printUsage(); + } + if (justPrintDiagnostics) { + Diagnostics.doReport(System.out, msgOutputLevel); + } + return; + } + + // if buildFile was not specified on the command line, + if (buildFile == null) { + // but -find then search for it + if (searchForFile) { + if (searchForThis != null) { + buildFile = findBuildFile(System.getProperty("user.dir"), searchForThis); + if (buildFile == null) { + throw new BuildException("Could not locate a build file!"); + } + } else { + // no search file specified: so search an existing default file + final Iterator it = ProjectHelperRepository.getInstance().getHelpers(); + do { + final ProjectHelper helper = it.next(); + searchForThis = helper.getDefaultBuildFile(); + if (msgOutputLevel >= Project.MSG_VERBOSE) { + System.out.println("Searching the default build file: " + searchForThis); + } + buildFile = findBuildFile(System.getProperty("user.dir"), searchForThis); + } while (buildFile == null && it.hasNext()); + if (buildFile == null) { + throw new BuildException("Could not locate a build file!"); + } + } + } else { + // no build file specified: so search an existing default file + final Iterator it = ProjectHelperRepository.getInstance().getHelpers(); + do { + final ProjectHelper helper = it.next(); + buildFile = new File(helper.getDefaultBuildFile()); + if (msgOutputLevel >= Project.MSG_VERBOSE) { + System.out.println("Trying the default build file: " + buildFile); + } + } while (!buildFile.exists() && it.hasNext()); + } + } + + // make sure buildfile exists + if (!buildFile.exists()) { + System.out.println("Buildfile: " + buildFile + " does not exist!"); + throw new BuildException("Build failed"); + } + + if (buildFile.isDirectory()) { + final File whatYouMeant = new File(buildFile, "build.xml"); + if (whatYouMeant.isFile()) { + buildFile = whatYouMeant; + } else { + System.out.println("What? Buildfile: " + buildFile + " is a dir!"); + throw new BuildException("Build failed"); + } + } + + // Normalize buildFile for re-import detection + buildFile = + FileUtils.getFileUtils().normalize(buildFile.getAbsolutePath()); + + // Load the property files specified by -propertyfile + loadPropertyFiles(); + + if (msgOutputLevel >= Project.MSG_INFO) { + System.out.println("Buildfile: " + buildFile); + } + + if (logTo != null) { + out = logTo; + err = logTo; + System.setOut(out); + System.setErr(err); + } + readyToRun = true; + } + + // -------------------------------------------------------- + // Methods for handling the command line arguments + // -------------------------------------------------------- + + /** Handle the -buildfile, -file, -f argument */ + private int handleArgBuildFile(final String[] args, int pos) { + try { + buildFile = new File( + args[++pos].replace('/', File.separatorChar)); + } catch (final ArrayIndexOutOfBoundsException aioobe) { + throw new BuildException( + "You must specify a buildfile when using the -buildfile argument"); + } + return pos; + } + + /** Handle -listener argument */ + private int handleArgListener(final String[] args, int pos) { + try { + listeners.addElement(args[pos + 1]); + pos++; + } catch (final ArrayIndexOutOfBoundsException aioobe) { + final String msg = "You must specify a classname when " + + "using the -listener argument"; + throw new BuildException(msg); + } + return pos; + } + + /** Handler -D argument */ + private int handleArgDefine(final String[] args, int argPos) { + /* Interestingly enough, we get to here when a user + * uses -Dname=value. However, in some cases, the OS + * goes ahead and parses this out to args + * {"-Dname", "value"} + * so instead of parsing on "=", we just make the "-D" + * characters go away and skip one argument forward. + * + * I don't know how to predict when the JDK is going + * to help or not, so we simply look for the equals sign. + */ + final String arg = args[argPos]; + String name = arg.substring(2, arg.length()); + String value = null; + final int posEq = name.indexOf("="); + if (posEq > 0) { + value = name.substring(posEq + 1); + name = name.substring(0, posEq); + } else if (argPos < args.length - 1) { + value = args[++argPos]; + } else { + throw new BuildException("Missing value for property " + + name); + } + definedProps.put(name, value); + return argPos; + } + + /** Handle the -logger argument. */ + private int handleArgLogger(final String[] args, int pos) { + if (loggerClassname != null) { + throw new BuildException( + "Only one logger class may be specified."); + } + try { + loggerClassname = args[++pos]; + } catch (final ArrayIndexOutOfBoundsException aioobe) { + throw new BuildException( + "You must specify a classname when using the -logger argument"); + } + return pos; + } + + /** Handle the -inputhandler argument. */ + private int handleArgInputHandler(final String[] args, int pos) { + if (inputHandlerClassname != null) { + throw new BuildException("Only one input handler class may " + + "be specified."); + } + try { + inputHandlerClassname = args[++pos]; + } catch (final ArrayIndexOutOfBoundsException aioobe) { + throw new BuildException("You must specify a classname when" + + " using the -inputhandler" + + " argument"); + } + return pos; + } + + /** Handle the -propertyfile argument. */ + private int handleArgPropertyFile(final String[] args, int pos) { + try { + propertyFiles.addElement(args[++pos]); + } catch (final ArrayIndexOutOfBoundsException aioobe) { + final String msg = "You must specify a property filename when " + + "using the -propertyfile argument"; + throw new BuildException(msg); + } + return pos; + } + + /** Handle the -nice argument. */ + private int handleArgNice(final String[] args, int pos) { + try { + threadPriority = Integer.decode(args[++pos]); + } catch (final ArrayIndexOutOfBoundsException aioobe) { + throw new BuildException( + "You must supply a niceness value (1-10)" + + " after the -nice option"); + } catch (final NumberFormatException e) { + throw new BuildException("Unrecognized niceness value: " + + args[pos]); + } + + if (threadPriority.intValue() < Thread.MIN_PRIORITY + || threadPriority.intValue() > Thread.MAX_PRIORITY) { + throw new BuildException( + "Niceness value is out of the range 1-10"); + } + return pos; + } + + // -------------------------------------------------------- + // other methods + // -------------------------------------------------------- + + /** Load the property files specified by -propertyfile */ + private void loadPropertyFiles() { + for (final String filename : propertyFiles) { + final Properties props = new Properties(); + FileInputStream fis = null; + try { + fis = new FileInputStream(filename); + props.load(fis); + } catch (final IOException e) { + System.out.println("Could not load property file " + + filename + ": " + e.getMessage()); + } finally { + FileUtils.close(fis); + } + + // ensure that -D properties take precedence + final Enumeration propertyNames = props.propertyNames(); + while (propertyNames.hasMoreElements()) { + final String name = (String) propertyNames.nextElement(); + if (definedProps.getProperty(name) == null) { + definedProps.put(name, props.getProperty(name)); + } + } + } + } + + /** + * Helper to get the parent file for a given file. + *

    + * Added to simulate File.getParentFile() from JDK 1.2. + * @deprecated since 1.6.x + * + * @param file File to find parent of. Must not be null. + * @return Parent file or null if none + */ + @Deprecated + private File getParentFile(final File file) { + final File parent = file.getParentFile(); + + if (parent != null && msgOutputLevel >= Project.MSG_VERBOSE) { + System.out.println("Searching in " + parent.getAbsolutePath()); + } + + return parent; + } + + /** + * Search parent directories for the build file. + *

    + * Takes the given target as a suffix to append to each + * parent directory in search of a build file. Once the + * root of the file-system has been reached null + * is returned. + * + * @param start Leaf directory of search. + * Must not be null. + * @param suffix Suffix filename to look for in parents. + * Must not be null. + * + * @return A handle to the build file if one is found, null if not + */ + private File findBuildFile(final String start, final String suffix) { + if (msgOutputLevel >= Project.MSG_INFO) { + System.out.println("Searching for " + suffix + " ..."); + } + + File parent = new File(new File(start).getAbsolutePath()); + File file = new File(parent, suffix); + + // check if the target file exists in the current directory + while (!file.exists()) { + // change to parent directory + parent = getParentFile(parent); + + // if parent is null, then we are at the root of the fs, + // complain that we can't find the build file. + if (parent == null) { + return null; + } + + // refresh our file handle + file = new File(parent, suffix); + } + + return file; + } + + /** + * Executes the build. If the constructor for this instance failed + * (e.g. returned after issuing a warning), this method returns + * immediately. + * + * @param coreLoader The classloader to use to find core classes. + * May be null, in which case the + * system classloader is used. + * + * @exception BuildException if the build fails + */ + private void runBuild(final ClassLoader coreLoader) throws BuildException { + + if (!readyToRun) { + return; + } + + final ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance(); + + for (final ArgumentProcessor processor : processorRegistry.getProcessors()) { + final List extraArgs = extraArguments.get(processor.getClass()); + if (extraArgs != null) { + if (processor.handleArg(extraArgs)) { + return; + } + } + } + + final Project project = new Project(); + project.setCoreLoader(coreLoader); + + Throwable error = null; + + try { + addBuildListeners(project); + addInputHandler(project); + + final PrintStream savedErr = System.err; + final PrintStream savedOut = System.out; + final InputStream savedIn = System.in; + + // use a system manager that prevents from System.exit() + SecurityManager oldsm = null; + oldsm = System.getSecurityManager(); + + //SecurityManager can not be installed here for backwards + //compatibility reasons (PD). Needs to be loaded prior to + //ant class if we are going to implement it. + //System.setSecurityManager(new NoExitSecurityManager()); + try { + if (allowInput) { + project.setDefaultInputStream(System.in); + } + System.setIn(new DemuxInputStream(project)); + System.setOut(new PrintStream(new DemuxOutputStream(project, false))); + System.setErr(new PrintStream(new DemuxOutputStream(project, true))); + + + if (!projectHelp) { + project.fireBuildStarted(); + } + + // set the thread priorities + if (threadPriority != null) { + try { + project.log("Setting Ant's thread priority to " + + threadPriority, Project.MSG_VERBOSE); + Thread.currentThread().setPriority(threadPriority.intValue()); + } catch (final SecurityException swallowed) { + //we cannot set the priority here. + project.log("A security manager refused to set the -nice value"); + } + } + + setProperties(project); + + project.setKeepGoingMode(keepGoingMode); + if (proxy) { + //proxy setup if enabled + final ProxySetup proxySetup = new ProxySetup(project); + proxySetup.enableProxies(); + } + + for (final ArgumentProcessor processor : processorRegistry.getProcessors()) { + final List extraArgs = extraArguments.get(processor.getClass()); + if (extraArgs != null) { + processor.prepareConfigure(project, extraArgs); + } + } + + ProjectHelper.configureProject(project, buildFile); + + for (final ArgumentProcessor processor : processorRegistry.getProcessors()) { + final List extraArgs = extraArguments.get(processor.getClass()); + if (extraArgs != null) { + if (processor.handleArg(project, extraArgs)) { + return; + } + } + } + + if (projectHelp) { + printDescription(project); + printTargets(project, msgOutputLevel > Project.MSG_INFO, + msgOutputLevel > Project.MSG_VERBOSE); + return; + } + + // make sure that we have a target to execute + if (targets.size() == 0) { + if (project.getDefaultTarget() != null) { + targets.addElement(project.getDefaultTarget()); + } + } + + project.executeTargets(targets); + } finally { + // put back the original security manager + //The following will never eval to true. (PD) + if (oldsm != null) { + System.setSecurityManager(oldsm); + } + + System.setOut(savedOut); + System.setErr(savedErr); + System.setIn(savedIn); + } + } catch (final RuntimeException exc) { + error = exc; + throw exc; + } catch (final Error e) { + error = e; + throw e; + } finally { + if (!projectHelp) { + try { + project.fireBuildFinished(error); + } catch (final Throwable t) { + // yes, I know it is bad style to catch Throwable, + // but if we don't, we lose valuable information + System.err.println("Caught an exception while logging the" + + " end of the build. Exception was:"); + t.printStackTrace(); + if (error != null) { + System.err.println("There has been an error prior to" + + " that:"); + error.printStackTrace(); + } + throw new BuildException(t); + } + } else if (error != null) { + project.log(error.toString(), Project.MSG_ERR); + } + } + } + + private void setProperties(final Project project) { + + project.init(); + + // resolve properties + final PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper(project); + @SuppressWarnings({ "rawtypes", "unchecked" }) + final Map raw = new HashMap(definedProps); + @SuppressWarnings("unchecked") + final Map props = raw; + + final ResolvePropertyMap resolver = new ResolvePropertyMap(project, + NOPROPERTIES, propertyHelper.getExpanders()); + resolver.resolveAllProperties(props, null, false); + + // set user-define properties + for (final Entry ent : props.entrySet()) { + final String arg = ent.getKey(); + final Object value = ent.getValue(); + project.setUserProperty(arg, String.valueOf(value)); + } + + project.setUserProperty(MagicNames.ANT_FILE, + buildFile.getAbsolutePath()); + project.setUserProperty(MagicNames.ANT_FILE_TYPE, + MagicNames.ANT_FILE_TYPE_FILE); + } + + /** + * Adds the listeners specified in the command line arguments, + * along with the default listener, to the specified project. + * + * @param project The project to add listeners to. + * Must not be null. + */ + protected void addBuildListeners(final Project project) { + + // Add the default listener + project.addBuildListener(createLogger()); + + final int count = listeners.size(); + for (int i = 0; i < count; i++) { + final String className = listeners.elementAt(i); + final BuildListener listener = + (BuildListener) ClasspathUtils.newInstance(className, + Main.class.getClassLoader(), BuildListener.class); + project.setProjectReference(listener); + + project.addBuildListener(listener); + } + } + + /** + * Creates the InputHandler and adds it to the project. + * + * @param project the project instance. + * + * @exception BuildException if a specified InputHandler + * implementation could not be loaded. + */ + private void addInputHandler(final Project project) throws BuildException { + InputHandler handler = null; + if (inputHandlerClassname == null) { + handler = new DefaultInputHandler(); + } else { + handler = (InputHandler) ClasspathUtils.newInstance( + inputHandlerClassname, Main.class.getClassLoader(), + InputHandler.class); + project.setProjectReference(handler); + } + project.setInputHandler(handler); + } + + // TODO: (Jon Skeet) Any reason for writing a message and then using a bare + // RuntimeException rather than just using a BuildException here? Is it + // in case the message could end up being written to no loggers (as the + // loggers could have failed to be created due to this failure)? + /** + * Creates the default build logger for sending build events to the ant + * log. + * + * @return the logger instance for this build. + */ + private BuildLogger createLogger() { + BuildLogger logger = null; + if (silent) { + logger = new SilentLogger(); + msgOutputLevel = Project.MSG_WARN; + emacsMode = true; + } else if (loggerClassname != null) { + try { + logger = (BuildLogger) ClasspathUtils.newInstance( + loggerClassname, Main.class.getClassLoader(), + BuildLogger.class); + } catch (final BuildException e) { + System.err.println("The specified logger class " + + loggerClassname + + " could not be used because " + e.getMessage()); + throw new RuntimeException(); + } + } else { + logger = new DefaultLogger(); + } + + logger.setMessageOutputLevel(msgOutputLevel); + logger.setOutputPrintStream(out); + logger.setErrorPrintStream(err); + logger.setEmacsMode(emacsMode); + + return logger; + } + + /** + * Prints the usage information for this class to System.out. + */ + private static void printUsage() { + System.out.println("ant [options] [target [target2 [target3] ...]]"); + System.out.println("Options: "); + System.out.println(" -help, -h print this message and exit"); + System.out.println(" -projecthelp, -p print project help information and exit"); + System.out.println(" -version print the version information and exit"); + System.out.println(" -diagnostics print information that might be helpful to"); + System.out.println(" diagnose or report problems and exit"); + System.out.println(" -quiet, -q be extra quiet"); + System.out.println(" -silent, -S print nothing but task outputs and build failures"); + System.out.println(" -verbose, -v be extra verbose"); + System.out.println(" -debug, -d print debugging information"); + System.out.println(" -emacs, -e produce logging information without adornments"); + System.out.println(" -lib specifies a path to search for jars and classes"); + System.out.println(" -logfile use given file for log"); + System.out.println(" -l ''"); + System.out.println(" -logger the class which is to perform logging"); + System.out.println(" -listener add an instance of class as a project listener"); + System.out.println(" -noinput do not allow interactive input"); + System.out.println(" -buildfile use given buildfile"); + System.out.println(" -file ''"); + System.out.println(" -f ''"); + System.out.println(" -D= use value for given property"); + System.out.println(" -keep-going, -k execute all targets that do not depend"); + System.out.println(" on failed target(s)"); + System.out.println(" -propertyfile load all properties from file with -D"); + System.out.println(" properties taking precedence"); + System.out.println(" -inputhandler the class which will handle input requests"); + System.out.println(" -find (s)earch for buildfile towards the root of"); + System.out.println(" -s the filesystem and use it"); + System.out.println(" -nice number A niceness value for the main thread:" + + " 1 (lowest) to 10 (highest); 5 is the default"); + System.out.println(" -nouserlib Run ant without using the jar files from" + + " ${user.home}/.ant/lib"); + System.out.println(" -noclasspath Run ant without using CLASSPATH"); + System.out.println(" -autoproxy Java1.5+: use the OS proxy settings"); + System.out.println(" -main override Ant's normal entry point"); + for (final ArgumentProcessor processor : ArgumentProcessorRegistry.getInstance().getProcessors()) { + processor.printUsage(System.out); + } + } + + /** + * Prints the Ant version information to System.out. + * + * @exception BuildException if the version information is unavailable + */ + private static void printVersion(final int logLevel) throws BuildException { + System.out.println(getAntVersion()); + } + + /** + * Cache of the Ant version information when it has been loaded. + */ + private static String antVersion = null; + + /** + * Cache of the short Ant version information when it has been loaded. + */ + private static String shortAntVersion = null; + + /** + * Returns the Ant version information, if available. Once the information + * has been loaded once, it's cached and returned from the cache on future + * calls. + * + * @return the Ant version information as a String + * (always non-null) + * + * @exception BuildException if the version information is unavailable + */ + public static synchronized String getAntVersion() throws BuildException { + if (antVersion == null) { + try { + final Properties props = new Properties(); + final InputStream in = + Main.class.getResourceAsStream("/org/apache/tools/ant/version.txt"); + props.load(in); + in.close(); + shortAntVersion = props.getProperty("VERSION"); + + final StringBuffer msg = new StringBuffer(); + msg.append("Apache Ant(TM) version "); + msg.append(shortAntVersion); + msg.append(" compiled on "); + msg.append(props.getProperty("DATE")); + antVersion = msg.toString(); + } catch (final IOException ioe) { + throw new BuildException("Could not load the version information:" + + ioe.getMessage()); + } catch (final NullPointerException npe) { + throw new BuildException("Could not load the version information."); + } + } + return antVersion; + } + + /** + * Returns the short Ant version information, if available. Once the information + * has been loaded once, it's cached and returned from the cache on future + * calls. + * + * @return the short Ant version information as a String + * (always non-null) + * + * @throws BuildException BuildException if the version information is unavailable + * @since Ant 1.9.3 + */ + public static String getShortAntVersion() throws BuildException { + if (shortAntVersion == null) { + getAntVersion(); + } + return shortAntVersion; + } + + /** + * Prints the description of a project (if there is one) to + * System.out. + * + * @param project The project to display a description of. + * Must not be null. + */ + private static void printDescription(final Project project) { + if (project.getDescription() != null) { + project.log(project.getDescription()); + } + } + + /** + * Targets in imported files with a project name + * and not overloaded by the main build file will + * be in the target map twice. This method + * removes the duplicate target. + * @param targets the targets to filter. + * @return the filtered targets. + */ + private static Map removeDuplicateTargets(final Map targets) { + final Map locationMap = new HashMap(); + for (final Entry entry : targets.entrySet()) { + final String name = entry.getKey(); + final Target target = entry.getValue(); + final Target otherTarget = locationMap.get(target.getLocation()); + // Place this entry in the location map if + // a) location is not in the map + // b) location is in map, but its name is longer + // (an imported target will have a name. prefix) + if (otherTarget == null + || otherTarget.getName().length() > name.length()) { + locationMap.put( + target.getLocation(), target); // Smallest name wins + } + } + final Map ret = new HashMap(); + for (final Target target : locationMap.values()) { + ret.put(target.getName(), target); + } + return ret; + } + + /** + * Prints a list of all targets in the specified project to + * System.out, optionally including subtargets. + * + * @param project The project to display a description of. + * Must not be null. + * @param printSubTargets Whether or not subtarget names should also be + * printed. + */ + private static void printTargets(final Project project, boolean printSubTargets, + final boolean printDependencies) { + // find the target with the longest name + int maxLength = 0; + final Map ptargets = removeDuplicateTargets(project.getTargets()); + // split the targets in top-level and sub-targets depending + // on the presence of a description + final Vector topNames = new Vector(); + final Vector topDescriptions = new Vector(); + final Vector> topDependencies = new Vector>(); + final Vector subNames = new Vector(); + final Vector> subDependencies = new Vector>(); + + for (final Target currentTarget : ptargets.values()) { + final String targetName = currentTarget.getName(); + if (targetName.equals("")) { + continue; + } + final String targetDescription = currentTarget.getDescription(); + // maintain a sorted list of targets + if (targetDescription == null) { + final int pos = findTargetPosition(subNames, targetName); + subNames.insertElementAt(targetName, pos); + if (printDependencies) { + subDependencies.insertElementAt(currentTarget.getDependencies(), pos); + } + } else { + final int pos = findTargetPosition(topNames, targetName); + topNames.insertElementAt(targetName, pos); + topDescriptions.insertElementAt(targetDescription, pos); + if (targetName.length() > maxLength) { + maxLength = targetName.length(); + } + if (printDependencies) { + topDependencies.insertElementAt(currentTarget.getDependencies(), pos); + } + } + } + + printTargets(project, topNames, topDescriptions, topDependencies, + "Main targets:", maxLength); + //if there were no main targets, we list all subtargets + //as it means nothing has a description + if (topNames.size() == 0) { + printSubTargets = true; + } + if (printSubTargets) { + printTargets(project, subNames, null, subDependencies, "Other targets:", 0); + } + + final String defaultTarget = project.getDefaultTarget(); + if (defaultTarget != null && !"".equals(defaultTarget)) { + // shouldn't need to check but... + project.log("Default target: " + defaultTarget); + } + } + + /** + * Searches for the correct place to insert a name into a list so as + * to keep the list sorted alphabetically. + * + * @param names The current list of names. Must not be null. + * @param name The name to find a place for. + * Must not be null. + * + * @return the correct place in the list for the given name + */ + private static int findTargetPosition(final Vector names, final String name) { + final int size = names.size(); + int res = size; + for (int i = 0; i < size && res == size; i++) { + if (name.compareTo(names.elementAt(i)) < 0) { + res = i; + } + } + return res; + } + + /** + * Writes a formatted list of target names to System.out + * with an optional description. + * + * + * @param project the project instance. + * @param names The names to be printed. + * Must not be null. + * @param descriptions The associated target descriptions. + * May be null, in which case + * no descriptions are displayed. + * If non-null, this should have + * as many elements as names. + * @param topDependencies The list of dependencies for each target. + * The dependencies are listed as a non null + * enumeration of String. + * @param heading The heading to display. + * Should not be null. + * @param maxlen The maximum length of the names of the targets. + * If descriptions are given, they are padded to this + * position so they line up (so long as the names really + * are shorter than this). + */ + private static void printTargets(final Project project, final Vector names, + final Vector descriptions, final Vector> dependencies, + final String heading, + final int maxlen) { + // now, start printing the targets and their descriptions + final String lSep = System.getProperty("line.separator"); + // got a bit annoyed that I couldn't find a pad function + String spaces = " "; + while (spaces.length() <= maxlen) { + spaces += spaces; + } + final StringBuilder msg = new StringBuilder(); + msg.append(heading + lSep + lSep); + final int size = names.size(); + for (int i = 0; i < size; i++) { + msg.append(" "); + msg.append(names.elementAt(i)); + if (descriptions != null) { + msg.append( + spaces.substring(0, maxlen - names.elementAt(i).length() + 2)); + msg.append(descriptions.elementAt(i)); + } + msg.append(lSep); + if (!dependencies.isEmpty()) { + final Enumeration deps = dependencies.elementAt(i); + if (deps.hasMoreElements()) { + msg.append(" depends on: "); + while (deps.hasMoreElements()) { + msg.append(deps.nextElement()); + if (deps.hasMoreElements()) { + msg.append(", "); + } + } + msg.append(lSep); + } + } + } + project.log(msg.toString(), Project.MSG_WARN); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/NoBannerLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/NoBannerLogger.java new file mode 100644 index 00000000..a086bf5e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/NoBannerLogger.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import org.apache.tools.ant.util.StringUtils; + +/** + * Extends DefaultLogger to strip out empty targets. + * + */ +public class NoBannerLogger extends DefaultLogger { + + // CheckStyle:VisibilityModifier OFF - bc + /** + * Name of the current target, if it should + * be displayed on the next message. This is + * set when a target starts building, and reset + * to null after the first message for + * the target is logged. + */ + protected String targetName; + // CheckStyle:VisibilityModifier ON + + /** Sole constructor. */ + public NoBannerLogger() { + } + + /** + * Notes the name of the target so it can be logged + * if it generates any messages. + * + * @param event A BuildEvent containing target information. + * Must not be null. + */ + public synchronized void targetStarted(BuildEvent event) { + targetName = extractTargetName(event); + } + + /** + * Override point, extract the target name + * @param event the event to work on + * @return the target name to print + * @since Ant1.7.1 + */ + protected String extractTargetName(BuildEvent event) { + return event.getTarget().getName(); + } + + /** + * Resets the current target name to null. + * + * @param event Ignored in this implementation. + */ + public synchronized void targetFinished(BuildEvent event) { + targetName = null; + } + + /** + * Logs a message for a target if it is of an appropriate + * priority, also logging the name of the target if this + * is the first message which needs to be logged for the + * target. + * + * @param event A BuildEvent containing message information. + * Must not be null. + */ + public void messageLogged(BuildEvent event) { + + if (event.getPriority() > msgOutputLevel + || null == event.getMessage() + || "".equals(event.getMessage().trim())) { + return; + } + + synchronized (this) { + if (null != targetName) { + out.println(StringUtils.LINE_SEP + targetName + ":"); + targetName = null; + } + } + + super.messageLogged(event); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PathTokenizer.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PathTokenizer.java new file mode 100644 index 00000000..6e6bea62 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PathTokenizer.java @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.File; +import java.util.NoSuchElementException; +import java.util.StringTokenizer; + +import org.apache.tools.ant.taskdefs.condition.Os; + +/** + * A Path tokenizer takes a path and returns the components that make up + * that path. + * + * The path can use path separators of either ':' or ';' and file separators + * of either '/' or '\'. + * + */ +public class PathTokenizer { + /** + * A tokenizer to break the string up based on the ':' or ';' separators. + */ + private StringTokenizer tokenizer; + + /** + * A String which stores any path components which have been read ahead + * due to DOS filesystem compensation. + */ + private String lookahead = null; + + /** + * A boolean that determines if we are running on Novell NetWare, which + * exhibits slightly different path name characteristics (multi-character + * volume / drive names) + */ + private boolean onNetWare = Os.isFamily("netware"); + + /** + * Flag to indicate whether or not we are running on a platform with a + * DOS style filesystem + */ + private boolean dosStyleFilesystem; + + /** + * Constructs a path tokenizer for the specified path. + * + * @param path The path to tokenize. Must not be null. + */ + public PathTokenizer(String path) { + if (onNetWare) { + // For NetWare, use the boolean=true mode, so we can use delimiter + // information to make a better decision later. + tokenizer = new StringTokenizer(path, ":;", true); + } else { + // on Windows and Unix, we can ignore delimiters and still have + // enough information to tokenize correctly. + tokenizer = new StringTokenizer(path, ":;", false); + } + dosStyleFilesystem = File.pathSeparatorChar == ';'; + } + + /** + * Tests if there are more path elements available from this tokenizer's + * path. If this method returns true, then a subsequent call + * to nextToken will successfully return a token. + * + * @return true if and only if there is at least one token + * in the string after the current position; false otherwise. + */ + public boolean hasMoreTokens() { + if (lookahead != null) { + return true; + } + + return tokenizer.hasMoreTokens(); + } + + /** + * Returns the next path element from this tokenizer. + * + * @return the next path element from this tokenizer. + * + * @exception NoSuchElementException if there are no more elements in this + * tokenizer's path. + */ + public String nextToken() throws NoSuchElementException { + String token = null; + if (lookahead != null) { + token = lookahead; + lookahead = null; + } else { + token = tokenizer.nextToken().trim(); + } + + if (!onNetWare) { + if (token.length() == 1 && Character.isLetter(token.charAt(0)) + && dosStyleFilesystem + && tokenizer.hasMoreTokens()) { + // we are on a dos style system so this path could be a drive + // spec. We look at the next token + String nextToken = tokenizer.nextToken().trim(); + if (nextToken.startsWith("\\") || nextToken.startsWith("/")) { + // we know we are on a DOS style platform and the next path + // starts with a slash or backslash, so we know this is a + // drive spec + token += ":" + nextToken; + } else { + // store the token just read for next time + lookahead = nextToken; + } + } + } else { + // we are on NetWare, tokenizing is handled a little differently, + // due to the fact that NetWare has multiple-character volume names. + if (token.equals(File.pathSeparator) || token.equals(":")) { + // ignore ";" and get the next token + token = tokenizer.nextToken().trim(); + } + + if (tokenizer.hasMoreTokens()) { + // this path could be a drive spec, so look at the next token + String nextToken = tokenizer.nextToken().trim(); + + // make sure we aren't going to get the path separator next + if (!nextToken.equals(File.pathSeparator)) { + if (nextToken.equals(":")) { + if (!token.startsWith("/") && !token.startsWith("\\") + && !token.startsWith(".") + && !token.startsWith("..")) { + // it indeed is a drive spec, get the next bit + String oneMore = tokenizer.nextToken().trim(); + if (!oneMore.equals(File.pathSeparator)) { + token += ":" + oneMore; + } else { + token += ":"; + lookahead = oneMore; + } + } + // implicit else: ignore the ':' since we have either a + // UNIX or a relative path + } else { + // store the token just read for next time + lookahead = nextToken; + } + } + } + } + return token; + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Project.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Project.java new file mode 100644 index 00000000..3a0c4b82 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Project.java @@ -0,0 +1,2494 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.EOFException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.Stack; +import java.util.Vector; +import java.util.WeakHashMap; + +import org.apache.tools.ant.helper.DefaultExecutor; +import org.apache.tools.ant.input.DefaultInputHandler; +import org.apache.tools.ant.input.InputHandler; +import org.apache.tools.ant.types.Description; +import org.apache.tools.ant.types.FilterSet; +import org.apache.tools.ant.types.FilterSetCollection; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.ResourceFactory; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.util.CollectionUtils; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.JavaEnvUtils; +import org.apache.tools.ant.util.StringUtils; +import org.apache.tools.ant.util.VectorSet; + +/** + * Central representation of an Ant project. This class defines an + * Ant project with all of its targets, tasks and various other + * properties. It also provides the mechanism to kick off a build using + * a particular target name. + *

    + * This class also encapsulates methods which allow files to be referred + * to using abstract path names which are translated to native system + * file paths at runtime. + * + */ +public class Project implements ResourceFactory { + /** Message priority of "error". */ + public static final int MSG_ERR = 0; + /** Message priority of "warning". */ + public static final int MSG_WARN = 1; + /** Message priority of "information". */ + public static final int MSG_INFO = 2; + /** Message priority of "verbose". */ + public static final int MSG_VERBOSE = 3; + /** Message priority of "debug". */ + public static final int MSG_DEBUG = 4; + + /** + * Constant for the "visiting" state, used when + * traversing a DFS of target dependencies. + */ + private static final String VISITING = "VISITING"; + /** + * Constant for the "visited" state, used when + * traversing a DFS of target dependencies. + */ + private static final String VISITED = "VISITED"; + + /** + * Version constant for Java 1.0 . + * + * @deprecated since 1.5.x. + * Use {@link JavaEnvUtils#JAVA_1_0} instead. + */ + @Deprecated + public static final String JAVA_1_0 = JavaEnvUtils.JAVA_1_0; + /** + * Version constant for Java 1.1 . + * + * @deprecated since 1.5.x. + * Use {@link JavaEnvUtils#JAVA_1_1} instead. + */ + @Deprecated + public static final String JAVA_1_1 = JavaEnvUtils.JAVA_1_1; + /** + * Version constant for Java 1.2 . + * + * @deprecated since 1.5.x. + * Use {@link JavaEnvUtils#JAVA_1_2} instead. + */ + @Deprecated + public static final String JAVA_1_2 = JavaEnvUtils.JAVA_1_2; + /** + * Version constant for Java 1.3 . + * + * @deprecated since 1.5.x. + * Use {@link JavaEnvUtils#JAVA_1_3} instead. + */ + @Deprecated + public static final String JAVA_1_3 = JavaEnvUtils.JAVA_1_3; + /** + * Version constant for Java 1.4 . + * + * @deprecated since 1.5.x. + * Use {@link JavaEnvUtils#JAVA_1_4} instead. + */ + @Deprecated + public static final String JAVA_1_4 = JavaEnvUtils.JAVA_1_4; + + /** Default filter start token. */ + public static final String TOKEN_START = FilterSet.DEFAULT_TOKEN_START; + /** Default filter end token. */ + public static final String TOKEN_END = FilterSet.DEFAULT_TOKEN_END; + + /** Instance of a utility class to use for file operations. */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** Name of this project. */ + private String name; + /** Description for this project (if any). */ + private String description; + + + /** Map of references within the project (paths etc) (String to Object). */ + private final Hashtable references = new AntRefTable(); + + /** Map of id references - used for indicating broken build files */ + private final HashMap idReferences = new HashMap(); + + /** Name of the project's default target. */ + private String defaultTarget; + + /** Map from target names to targets (String to Target). */ + private final Hashtable targets = new Hashtable(); + + /** Set of global filters. */ + private final FilterSet globalFilterSet = new FilterSet(); + { + // Initialize the globalFileSet's project + globalFilterSet.setProject(this); + } + + /** + * Wrapper around globalFilterSet. This collection only ever + * contains one FilterSet, but the wrapper is needed in order to + * make it easier to use the FileUtils interface. + */ + private final FilterSetCollection globalFilters + = new FilterSetCollection(globalFilterSet); + + /** Project base directory. */ + private File baseDir; + + /** lock object used when adding/removing listeners */ + private final Object listenersLock = new Object(); + + /** List of listeners to notify of build events. */ + private volatile BuildListener[] listeners = new BuildListener[0]; + + /** for each thread, record whether it is currently executing + messageLogged */ + private final ThreadLocal isLoggingMessage = new ThreadLocal() { + @Override + protected Boolean initialValue() { + return Boolean.FALSE; + } + }; + + /** + * The Ant core classloader--may be null if using + * parent classloader. + */ + private ClassLoader coreLoader = null; + + /** Records the latest task to be executed on a thread. */ + private final Map threadTasks = + Collections.synchronizedMap(new WeakHashMap()); + + /** Records the latest task to be executed on a thread group. */ + private final Map threadGroupTasks + = Collections.synchronizedMap(new WeakHashMap()); + + /** + * Called to handle any input requests. + */ + private InputHandler inputHandler = null; + + /** + * The default input stream used to read any input. + */ + private InputStream defaultInputStream = null; + + /** + * Keep going flag. + */ + private boolean keepGoingMode = false; + + /** + * Set the input handler. + * + * @param handler the InputHandler instance to use for gathering input. + */ + public void setInputHandler(final InputHandler handler) { + inputHandler = handler; + } + + /** + * Set the default System input stream. Normally this stream is set to + * System.in. This inputStream is used when no task input redirection is + * being performed. + * + * @param defaultInputStream the default input stream to use when input + * is requested. + * @since Ant 1.6 + */ + public void setDefaultInputStream(final InputStream defaultInputStream) { + this.defaultInputStream = defaultInputStream; + } + + /** + * Get this project's input stream. + * + * @return the InputStream instance in use by this Project instance to + * read input. + */ + public InputStream getDefaultInputStream() { + return defaultInputStream; + } + + /** + * Retrieve the current input handler. + * + * @return the InputHandler instance currently in place for the project + * instance. + */ + public InputHandler getInputHandler() { + return inputHandler; + } + + /** + * Create a new Ant project. + */ + public Project() { + inputHandler = new DefaultInputHandler(); + } + + /** + * Create and initialize a subproject. By default the subproject will be of + * the same type as its parent. If a no-arg constructor is unavailable, the + * Project class will be used. + * @return a Project instance configured as a subproject of this Project. + * @since Ant 1.7 + */ + public Project createSubProject() { + Project subProject = null; + try { + subProject = (getClass().newInstance()); + } catch (final Exception e) { + subProject = new Project(); + } + initSubProject(subProject); + return subProject; + } + + /** + * Initialize a subproject. + * @param subProject the subproject to initialize. + */ + public void initSubProject(final Project subProject) { + ComponentHelper.getComponentHelper(subProject) + .initSubProject(ComponentHelper.getComponentHelper(this)); + subProject.setDefaultInputStream(getDefaultInputStream()); + subProject.setKeepGoingMode(this.isKeepGoingMode()); + subProject.setExecutor(getExecutor().getSubProjectExecutor()); + } + + /** + * Initialise the project. + * + * This involves setting the default task definitions and loading the + * system properties. + * + * @exception BuildException if the default task list cannot be loaded. + */ + public void init() throws BuildException { + initProperties(); + + ComponentHelper.getComponentHelper(this).initDefaultDefinitions(); + } + + /** + * Initializes the properties. + * @exception BuildException if an vital property could not be set. + * @since Ant 1.7 + */ + public void initProperties() throws BuildException { + setJavaVersionProperty(); + setSystemProperties(); + setPropertyInternal(MagicNames.ANT_VERSION, Main.getAntVersion()); + setAntLib(); + } + + /** + * Set a property to the location of ant.jar. + * Use the locator to find the location of the Project.class, and + * if this is not null, set the property {@link MagicNames#ANT_LIB} + * to the result + */ + private void setAntLib() { + final File antlib = org.apache.tools.ant.launch.Locator.getClassSource( + Project.class); + if (antlib != null) { + setPropertyInternal(MagicNames.ANT_LIB, antlib.getAbsolutePath()); + } + } + /** + * Factory method to create a class loader for loading classes from + * a given path. + * + * @param path the path from which classes are to be loaded. + * + * @return an appropriate classloader. + */ + public AntClassLoader createClassLoader(final Path path) { + return AntClassLoader + .newAntClassLoader(getClass().getClassLoader(), this, path, true); + } + + /** + * Factory method to create a class loader for loading classes from + * a given path. + * + * @param parent the parent classloader for the new loader. + * @param path the path from which classes are to be loaded. + * + * @return an appropriate classloader. + */ + public AntClassLoader createClassLoader( + final ClassLoader parent, final Path path) { + return AntClassLoader.newAntClassLoader(parent, this, path, true); + } + + /** + * Set the core classloader for the project. If a null + * classloader is specified, the parent classloader should be used. + * + * @param coreLoader The classloader to use for the project. + * May be null. + */ + public void setCoreLoader(final ClassLoader coreLoader) { + this.coreLoader = coreLoader; + } + + /** + * Return the core classloader to use for this project. + * This may be null, indicating that + * the parent classloader should be used. + * + * @return the core classloader to use for this project. + * + */ + public ClassLoader getCoreLoader() { + return coreLoader; + } + + /** + * Add a build listener to the list. This listener will + * be notified of build events for this project. + * + * @param listener The listener to add to the list. + * Must not be null. + */ + public void addBuildListener(final BuildListener listener) { + synchronized (listenersLock) { + // If the listeners already has this listener, do nothing + for (int i = 0; i < listeners.length; i++) { + if (listeners[i] == listener) { + return; + } + } + // copy on write semantics + final BuildListener[] newListeners = + new BuildListener[listeners.length + 1]; + System.arraycopy(listeners, 0, newListeners, 0, listeners.length); + newListeners[listeners.length] = listener; + listeners = newListeners; + } + } + + /** + * Remove a build listener from the list. This listener + * will no longer be notified of build events for this project. + * + * @param listener The listener to remove from the list. + * Should not be null. + */ + public void removeBuildListener(final BuildListener listener) { + synchronized (listenersLock) { + // copy on write semantics + for (int i = 0; i < listeners.length; i++) { + if (listeners[i] == listener) { + final BuildListener[] newListeners = + new BuildListener[listeners.length - 1]; + System.arraycopy(listeners, 0, newListeners, 0, i); + System.arraycopy(listeners, i + 1, newListeners, i, + listeners.length - i - 1); + listeners = newListeners; + break; + } + } + } + } + + /** + * Return a copy of the list of build listeners for the project. + * + * @return a list of build listeners for the project + */ + public Vector getBuildListeners() { + synchronized (listenersLock) { + final Vector r = new Vector(listeners.length); + for (int i = 0; i < listeners.length; i++) { + r.add(listeners[i]); + } + return r; + } + } + + /** + * Write a message to the log with the default log level + * of MSG_INFO . + * @param message The text to log. Should not be null. + */ + + public void log(final String message) { + log(message, MSG_INFO); + } + + /** + * Write a project level message to the log with the given log level. + * @param message The text to log. Should not be null. + * @param msgLevel The log priority level to use. + */ + public void log(final String message, final int msgLevel) { + log(message, null, msgLevel); + } + + /** + * Write a project level message to the log with the given log level. + * @param message The text to log. Should not be null. + * @param throwable The exception causing this log, may be null. + * @param msgLevel The log priority level to use. + * @since 1.7 + */ + public void log(final String message, final Throwable throwable, final int msgLevel) { + fireMessageLogged(this, message, throwable, msgLevel); + } + + /** + * Write a task level message to the log with the given log level. + * @param task The task to use in the log. Must not be null. + * @param message The text to log. Should not be null. + * @param msgLevel The log priority level to use. + */ + public void log(final Task task, final String message, final int msgLevel) { + fireMessageLogged(task, message, null, msgLevel); + } + + /** + * Write a task level message to the log with the given log level. + * @param task The task to use in the log. Must not be null. + * @param message The text to log. Should not be null. + * @param throwable The exception causing this log, may be null. + * @param msgLevel The log priority level to use. + * @since 1.7 + */ + public void log(final Task task, final String message, final Throwable throwable, final int msgLevel) { + fireMessageLogged(task, message, throwable, msgLevel); + } + + /** + * Write a target level message to the log with the given log level. + * @param target The target to use in the log. + * Must not be null. + * @param message The text to log. Should not be null. + * @param msgLevel The log priority level to use. + */ + public void log(final Target target, final String message, final int msgLevel) { + log(target, message, null, msgLevel); + } + + /** + * Write a target level message to the log with the given log level. + * @param target The target to use in the log. + * Must not be null. + * @param message The text to log. Should not be null. + * @param throwable The exception causing this log, may be null. + * @param msgLevel The log priority level to use. + * @since 1.7 + */ + public void log(final Target target, final String message, final Throwable throwable, + final int msgLevel) { + fireMessageLogged(target, message, throwable, msgLevel); + } + + /** + * Return the set of global filters. + * + * @return the set of global filters. + */ + public FilterSet getGlobalFilterSet() { + return globalFilterSet; + } + + /** + * Set a property. Any existing property of the same name + * is overwritten, unless it is a user property. + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + */ + public void setProperty(final String name, final String value) { + PropertyHelper.getPropertyHelper(this).setProperty(name, value, true); + } + + /** + * Set a property if no value currently exists. If the property + * exists already, a message is logged and the method returns with + * no other effect. + * + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @since 1.5 + */ + public void setNewProperty(final String name, final String value) { + PropertyHelper.getPropertyHelper(this).setNewProperty(name, value); + } + + /** + * Set a user property, which cannot be overwritten by + * set/unset property calls. Any previous value is overwritten. + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @see #setProperty(String,String) + */ + public void setUserProperty(final String name, final String value) { + PropertyHelper.getPropertyHelper(this).setUserProperty(name, value); + } + + /** + * Set a user property, which cannot be overwritten by set/unset + * property calls. Any previous value is overwritten. Also marks + * these properties as properties that have not come from the + * command line. + * + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @see #setProperty(String,String) + */ + public void setInheritedProperty(final String name, final String value) { + PropertyHelper.getPropertyHelper(this).setInheritedProperty(name, value); + } + + /** + * Set a property unless it is already defined as a user property + * (in which case the method returns silently). + * + * @param name The name of the property. + * Must not be null. + * @param value The property value. Must not be null. + */ + private void setPropertyInternal(final String name, final String value) { + PropertyHelper.getPropertyHelper(this).setProperty(name, value, false); + } + + /** + * Return the value of a property, if it is set. + * + * @param propertyName The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + */ + public String getProperty(final String propertyName) { + final Object value = PropertyHelper.getPropertyHelper(this).getProperty(propertyName); + return value == null ? null : String.valueOf(value); + } + + /** + * Replace ${} style constructions in the given value with the + * string value of the corresponding data types. + * + * @param value The string to be scanned for property references. + * May be null. + * + * @return the given string with embedded property names replaced + * by values, or null if the given string is + * null. + * + * @exception BuildException if the given value has an unclosed + * property name, e.g. ${xxx. + */ + public String replaceProperties(final String value) throws BuildException { + return PropertyHelper.getPropertyHelper(this).replaceProperties(null, value, null); + } + + /** + * Return the value of a user property, if it is set. + * + * @param propertyName The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + */ + public String getUserProperty(final String propertyName) { + return (String) PropertyHelper.getPropertyHelper(this).getUserProperty(propertyName); + } + + /** + * Return a copy of the properties table. + * @return a hashtable containing all properties + * (including user properties). + */ + public Hashtable getProperties() { + return PropertyHelper.getPropertyHelper(this).getProperties(); + } + + /** + * Return a copy of the user property hashtable. + * @return a hashtable containing just the user properties. + */ + public Hashtable getUserProperties() { + return PropertyHelper.getPropertyHelper(this).getUserProperties(); + } + + /** + * Return a copy of the inherited property hashtable. + * @return a hashtable containing just the inherited properties. + * @since Ant 1.8.0 + */ + public Hashtable getInheritedProperties() { + return PropertyHelper.getPropertyHelper(this).getInheritedProperties(); + } + + /** + * Copy all user properties that have been set on the command + * line or a GUI tool from this instance to the Project instance + * given as the argument. + * + *

    To copy all "user" properties, you will also have to call + * {@link #copyInheritedProperties copyInheritedProperties}.

    + * + * @param other the project to copy the properties to. Must not be null. + * + * @since Ant 1.5 + */ + public void copyUserProperties(final Project other) { + PropertyHelper.getPropertyHelper(this).copyUserProperties(other); + } + + /** + * Copy all user properties that have not been set on the + * command line or a GUI tool from this instance to the Project + * instance given as the argument. + * + *

    To copy all "user" properties, you will also have to call + * {@link #copyUserProperties copyUserProperties}.

    + * + * @param other the project to copy the properties to. Must not be null. + * + * @since Ant 1.5 + */ + public void copyInheritedProperties(final Project other) { + PropertyHelper.getPropertyHelper(this).copyInheritedProperties(other); + } + + /** + * Set the default target of the project. + * + * @param defaultTarget The name of the default target for this project. + * May be null, indicating that there is + * no default target. + * + * @deprecated since 1.5.x. + * Use setDefault. + * @see #setDefault(String) + */ + @Deprecated + public void setDefaultTarget(final String defaultTarget) { + setDefault(defaultTarget); + } + + /** + * Return the name of the default target of the project. + * @return name of the default target or + * null if no default has been set. + */ + public String getDefaultTarget() { + return defaultTarget; + } + + /** + * Set the default target of the project. + * + * @param defaultTarget The name of the default target for this project. + * May be null, indicating that there is + * no default target. + */ + public void setDefault(final String defaultTarget) { + if (defaultTarget != null) { + setUserProperty(MagicNames.PROJECT_DEFAULT_TARGET, defaultTarget); + } + this.defaultTarget = defaultTarget; + } + + /** + * Set the name of the project, also setting the user + * property ant.project.name. + * + * @param name The name of the project. + * Must not be null. + */ + public void setName(final String name) { + setUserProperty(MagicNames.PROJECT_NAME, name); + this.name = name; + } + + /** + * Return the project name, if one has been set. + * + * @return the project name, or null if it hasn't been set. + */ + public String getName() { + return name; + } + + /** + * Set the project description. + * + * @param description The description of the project. + * May be null. + */ + public void setDescription(final String description) { + this.description = description; + } + + /** + * Return the project description, if one has been set. + * + * @return the project description, or null if it hasn't + * been set. + */ + public String getDescription() { + if (description == null) { + description = Description.getDescription(this); + } + return description; + } + + /** + * Add a filter to the set of global filters. + * + * @param token The token to filter. + * Must not be null. + * @param value The replacement value. + * Must not be null. + * @deprecated since 1.4.x. + * Use getGlobalFilterSet().addFilter(token,value) + * + * @see #getGlobalFilterSet() + * @see FilterSet#addFilter(String,String) + */ + @Deprecated + public void addFilter(final String token, final String value) { + if (token == null) { + return; + } + globalFilterSet.addFilter(new FilterSet.Filter(token, value)); + } + + /** + * Return a hashtable of global filters, mapping tokens to values. + * + * @return a hashtable of global filters, mapping tokens to values + * (String to String). + * + * @deprecated since 1.4.x + * Use getGlobalFilterSet().getFilterHash(). + * + * @see #getGlobalFilterSet() + * @see FilterSet#getFilterHash() + */ + @Deprecated + public Hashtable getFilters() { + // we need to build the hashtable dynamically + return globalFilterSet.getFilterHash(); + } + + /** + * Set the base directory for the project, checking that + * the given filename exists and is a directory. + * + * @param baseD The project base directory. + * Must not be null. + * + * @exception BuildException if the directory if invalid. + */ + public void setBasedir(final String baseD) throws BuildException { + setBaseDir(new File(baseD)); + } + + /** + * Set the base directory for the project, checking that + * the given file exists and is a directory. + * + * @param baseDir The project base directory. + * Must not be null. + * @exception BuildException if the specified file doesn't exist or + * isn't a directory. + */ + public void setBaseDir(File baseDir) throws BuildException { + baseDir = FILE_UTILS.normalize(baseDir.getAbsolutePath()); + if (!baseDir.exists()) { + throw new BuildException("Basedir " + baseDir.getAbsolutePath() + + " does not exist"); + } + if (!baseDir.isDirectory()) { + throw new BuildException("Basedir " + baseDir.getAbsolutePath() + + " is not a directory"); + } + this.baseDir = baseDir; + setPropertyInternal(MagicNames.PROJECT_BASEDIR, this.baseDir.getPath()); + final String msg = "Project base dir set to: " + this.baseDir; + log(msg, MSG_VERBOSE); + } + + /** + * Return the base directory of the project as a file object. + * + * @return the project base directory, or null if the + * base directory has not been successfully set to a valid value. + */ + public File getBaseDir() { + if (baseDir == null) { + try { + setBasedir("."); + } catch (final BuildException ex) { + ex.printStackTrace(); + } + } + return baseDir; + } + + /** + * Set "keep-going" mode. In this mode Ant will try to execute + * as many targets as possible. All targets that do not depend + * on failed target(s) will be executed. If the keepGoing settor/getter + * methods are used in conjunction with the ant.executor.class + * property, they will have no effect. + * @param keepGoingMode "keep-going" mode + * @since Ant 1.6 + */ + public void setKeepGoingMode(final boolean keepGoingMode) { + this.keepGoingMode = keepGoingMode; + } + + /** + * Return the keep-going mode. If the keepGoing settor/getter + * methods are used in conjunction with the ant.executor.class + * property, they will have no effect. + * @return "keep-going" mode + * @since Ant 1.6 + */ + public boolean isKeepGoingMode() { + return this.keepGoingMode; + } + + /** + * Return the version of Java this class is running under. + * @return the version of Java as a String, e.g. "1.1" . + * @see org.apache.tools.ant.util.JavaEnvUtils#getJavaVersion + * @deprecated since 1.5.x. + * Use org.apache.tools.ant.util.JavaEnvUtils instead. + */ + @Deprecated + public static String getJavaVersion() { + return JavaEnvUtils.getJavaVersion(); + } + + /** + * Set the ant.java.version property and tests for + * unsupported JVM versions. If the version is supported, + * verbose log messages are generated to record the Java version + * and operating system name. + * + * @exception BuildException if this Java version is not supported. + * + * @see org.apache.tools.ant.util.JavaEnvUtils#getJavaVersion + */ + public void setJavaVersionProperty() throws BuildException { + final String javaVersion = JavaEnvUtils.getJavaVersion(); + setPropertyInternal(MagicNames.ANT_JAVA_VERSION, javaVersion); + + // sanity check + if (!JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_1_5)) { + throw new BuildException("Ant cannot work on Java prior to 1.5"); + } + log("Detected Java version: " + javaVersion + " in: " + + System.getProperty("java.home"), MSG_VERBOSE); + + log("Detected OS: " + System.getProperty("os.name"), MSG_VERBOSE); + } + + /** + * Add all system properties which aren't already defined as + * user properties to the project properties. + */ + public void setSystemProperties() { + final Properties systemP = System.getProperties(); + final Enumeration e = systemP.propertyNames(); + while (e.hasMoreElements()) { + final String propertyName = (String) e.nextElement(); + final String value = systemP.getProperty(propertyName); + if (value != null) { + this.setPropertyInternal(propertyName, value); + } + } + } + + /** + * Add a new task definition to the project. + * Attempting to override an existing definition with an + * equivalent one (i.e. with the same classname) results in + * a verbose log message. Attempting to override an existing definition + * with a different one results in a warning log message and + * invalidates any tasks which have already been created with the + * old definition. + * + * @param taskName The name of the task to add. + * Must not be null. + * @param taskClass The full name of the class implementing the task. + * Must not be null. + * + * @exception BuildException if the class is unsuitable for being an Ant + * task. An error level message is logged before + * this exception is thrown. + * + * @see #checkTaskClass(Class) + */ + public void addTaskDefinition(final String taskName, final Class taskClass) + throws BuildException { + ComponentHelper.getComponentHelper(this).addTaskDefinition(taskName, + taskClass); + } + + /** + * Check whether or not a class is suitable for serving as Ant task. + * Ant task implementation classes must be public, concrete, and have + * a no-arg constructor. + * + * @param taskClass The class to be checked. + * Must not be null. + * + * @exception BuildException if the class is unsuitable for being an Ant + * task. An error level message is logged before + * this exception is thrown. + */ + public void checkTaskClass(final Class taskClass) throws BuildException { + ComponentHelper.getComponentHelper(this).checkTaskClass(taskClass); + + if (!Modifier.isPublic(taskClass.getModifiers())) { + final String message = taskClass + " is not public"; + log(message, Project.MSG_ERR); + throw new BuildException(message); + } + if (Modifier.isAbstract(taskClass.getModifiers())) { + final String message = taskClass + " is abstract"; + log(message, Project.MSG_ERR); + throw new BuildException(message); + } + try { + taskClass.getConstructor(); + // don't have to check for public, since + // getConstructor finds public constructors only. + } catch (final NoSuchMethodException e) { + final String message = "No public no-arg constructor in " + + taskClass; + log(message, Project.MSG_ERR); + throw new BuildException(message); + } catch (final LinkageError e) { + final String message = "Could not load " + taskClass + ": " + e; + log(message, Project.MSG_ERR); + throw new BuildException(message, e); + } + if (!Task.class.isAssignableFrom(taskClass)) { + TaskAdapter.checkTaskClass(taskClass, this); + } + } + + /** + * Return the current task definition hashtable. The returned hashtable is + * "live" and so should not be modified. + * + * @return a map of from task name to implementing class + * (String to Class). + */ + public Hashtable> getTaskDefinitions() { + return ComponentHelper.getComponentHelper(this).getTaskDefinitions(); + } + + /** + * Return the current task definition map. The returned map is a + * copy of the "live" definitions. + * + * @return a map of from task name to implementing class + * (String to Class). + * + * @since Ant 1.8.1 + */ + public Map> getCopyOfTaskDefinitions() { + return new HashMap>(getTaskDefinitions()); + } + + /** + * Add a new datatype definition. + * Attempting to override an existing definition with an + * equivalent one (i.e. with the same classname) results in + * a verbose log message. Attempting to override an existing definition + * with a different one results in a warning log message, but the + * definition is changed. + * + * @param typeName The name of the datatype. + * Must not be null. + * @param typeClass The full name of the class implementing the datatype. + * Must not be null. + */ + public void addDataTypeDefinition(final String typeName, final Class typeClass) { + ComponentHelper.getComponentHelper(this).addDataTypeDefinition(typeName, + typeClass); + } + + /** + * Return the current datatype definition hashtable. The returned + * hashtable is "live" and so should not be modified. + * + * @return a map of from datatype name to implementing class + * (String to Class). + */ + public Hashtable> getDataTypeDefinitions() { + return ComponentHelper.getComponentHelper(this).getDataTypeDefinitions(); + } + + /** + * Return the current datatype definition map. The returned + * map is a copy pf the "live" definitions. + * + * @return a map of from datatype name to implementing class + * (String to Class). + * + * @since Ant 1.8.1 + */ + public Map> getCopyOfDataTypeDefinitions() { + return new HashMap>(getDataTypeDefinitions()); + } + + /** + * Add a new target to the project. + * + * @param target The target to be added to the project. + * Must not be null. + * + * @exception BuildException if the target already exists in the project + * + * @see Project#addOrReplaceTarget(Target) + */ + public void addTarget(final Target target) throws BuildException { + addTarget(target.getName(), target); + } + + /** + * Add a new target to the project. + * + * @param targetName The name to use for the target. + * Must not be null. + * @param target The target to be added to the project. + * Must not be null. + * + * @exception BuildException if the target already exists in the project. + * + * @see Project#addOrReplaceTarget(String, Target) + */ + public void addTarget(final String targetName, final Target target) + throws BuildException { + if (targets.get(targetName) != null) { + throw new BuildException("Duplicate target: `" + targetName + "'"); + } + addOrReplaceTarget(targetName, target); + } + + /** + * Add a target to the project, or replaces one with the same + * name. + * + * @param target The target to be added or replaced in the project. + * Must not be null. + */ + public void addOrReplaceTarget(final Target target) { + addOrReplaceTarget(target.getName(), target); + } + + /** + * Add a target to the project, or replaces one with the same + * name. + * + * @param targetName The name to use for the target. + * Must not be null. + * @param target The target to be added or replaced in the project. + * Must not be null. + */ + public void addOrReplaceTarget(final String targetName, final Target target) { + final String msg = " +Target: " + targetName; + log(msg, MSG_DEBUG); + target.setProject(this); + targets.put(targetName, target); + } + + /** + * Return the hashtable of targets. The returned hashtable + * is "live" and so should not be modified. + * @return a map from name to target (String to Target). + */ + public Hashtable getTargets() { + return targets; + } + + /** + * Return the map of targets. The returned map + * is a copy of the "live" targets. + * @return a map from name to target (String to Target). + * @since Ant 1.8.1 + */ + public Map getCopyOfTargets() { + return new HashMap(targets); + } + + /** + * Create a new instance of a task, adding it to a list of + * created tasks for later invalidation. This causes all tasks + * to be remembered until the containing project is removed + * @param taskType The name of the task to create an instance of. + * Must not be null. + * + * @return an instance of the specified task, or null if + * the task name is not recognised. + * + * @exception BuildException if the task name is recognised but task + * creation fails. + */ + public Task createTask(final String taskType) throws BuildException { + return ComponentHelper.getComponentHelper(this).createTask(taskType); + } + + /** + * Create a new instance of a data type. + * + * @param typeName The name of the data type to create an instance of. + * Must not be null. + * + * @return an instance of the specified data type, or null if + * the data type name is not recognised. + * + * @exception BuildException if the data type name is recognised but + * instance creation fails. + */ + public Object createDataType(final String typeName) throws BuildException { + return ComponentHelper.getComponentHelper(this).createDataType(typeName); + } + + /** + * Set the Executor instance for this Project. + * @param e the Executor to use. + */ + public void setExecutor(final Executor e) { + addReference(MagicNames.ANT_EXECUTOR_REFERENCE, e); + } + + /** + * Get this Project's Executor (setting it if necessary). + * @return an Executor instance. + */ + public Executor getExecutor() { + Object o = getReference(MagicNames.ANT_EXECUTOR_REFERENCE); + if (o == null) { + String classname = getProperty(MagicNames.ANT_EXECUTOR_CLASSNAME); + if (classname == null) { + classname = DefaultExecutor.class.getName(); + } + log("Attempting to create object of type " + classname, MSG_DEBUG); + try { + o = Class.forName(classname, true, coreLoader).newInstance(); + } catch (final ClassNotFoundException seaEnEfEx) { + //try the current classloader + try { + o = Class.forName(classname).newInstance(); + } catch (final Exception ex) { + log(ex.toString(), MSG_ERR); + } + } catch (final Exception ex) { + log(ex.toString(), MSG_ERR); + } + if (o == null) { + throw new BuildException( + "Unable to obtain a Target Executor instance."); + } + setExecutor((Executor) o); + } + return (Executor) o; + } + + /** + * Execute the specified sequence of targets, and the targets + * they depend on. + * + * @param names A vector of target name strings to execute. + * Must not be null. + * + * @exception BuildException if the build failed. + */ + public void executeTargets(final Vector names) throws BuildException { + setUserProperty(MagicNames.PROJECT_INVOKED_TARGETS, + CollectionUtils.flattenToString(names)); + getExecutor().executeTargets(this, names.toArray(new String[names.size()])); + } + + /** + * Demultiplex output so that each task receives the appropriate + * messages. If the current thread is not currently executing a task, + * the message is logged directly. + * + * @param output Message to handle. Should not be null. + * @param isWarning Whether the text represents an warning (true) + * or information (false). + */ + public void demuxOutput(final String output, final boolean isWarning) { + final Task task = getThreadTask(Thread.currentThread()); + if (task == null) { + log(output, isWarning ? MSG_WARN : MSG_INFO); + } else { + if (isWarning) { + task.handleErrorOutput(output); + } else { + task.handleOutput(output); + } + } + } + + /** + * Read data from the default input stream. If no default has been + * specified, System.in is used. + * + * @param buffer the buffer into which data is to be read. + * @param offset the offset into the buffer at which data is stored. + * @param length the amount of data to read. + * + * @return the number of bytes read. + * + * @exception IOException if the data cannot be read. + * @since Ant 1.6 + */ + public int defaultInput(final byte[] buffer, final int offset, final int length) + throws IOException { + if (defaultInputStream != null) { + System.out.flush(); + return defaultInputStream.read(buffer, offset, length); + } else { + throw new EOFException("No input provided for project"); + } + } + + /** + * Demux an input request to the correct task. + * + * @param buffer the buffer into which data is to be read. + * @param offset the offset into the buffer at which data is stored. + * @param length the amount of data to read. + * + * @return the number of bytes read. + * + * @exception IOException if the data cannot be read. + * @since Ant 1.6 + */ + public int demuxInput(final byte[] buffer, final int offset, final int length) + throws IOException { + final Task task = getThreadTask(Thread.currentThread()); + if (task == null) { + return defaultInput(buffer, offset, length); + } else { + return task.handleInput(buffer, offset, length); + } + } + + /** + * Demultiplex flush operations so that each task receives the appropriate + * messages. If the current thread is not currently executing a task, + * the message is logged directly. + * + * @since Ant 1.5.2 + * + * @param output Message to handle. Should not be null. + * @param isError Whether the text represents an error (true) + * or information (false). + */ + public void demuxFlush(final String output, final boolean isError) { + final Task task = getThreadTask(Thread.currentThread()); + if (task == null) { + fireMessageLogged(this, output, isError ? MSG_ERR : MSG_INFO); + } else { + if (isError) { + task.handleErrorFlush(output); + } else { + task.handleFlush(output); + } + } + } + + /** + * Execute the specified target and any targets it depends on. + * + * @param targetName The name of the target to execute. + * Must not be null. + * + * @exception BuildException if the build failed. + */ + public void executeTarget(final String targetName) throws BuildException { + + // sanity check ourselves, if we've been asked to build nothing + // then we should complain + + if (targetName == null) { + final String msg = "No target specified"; + throw new BuildException(msg); + } + + // Sort and run the dependency tree. + // Sorting checks if all the targets (and dependencies) + // exist, and if there is any cycle in the dependency + // graph. + executeSortedTargets(topoSort(targetName, targets, false)); + } + + /** + * Execute a Vector of sorted targets. + * @param sortedTargets the aforementioned Vector. + * @throws BuildException on error. + */ + public void executeSortedTargets(final Vector sortedTargets) + throws BuildException { + final Set succeededTargets = new HashSet(); + BuildException buildException = null; // first build exception + for (final Target curtarget : sortedTargets) { + boolean canExecute = true; + for (final Enumeration depIter = curtarget.getDependencies(); + depIter.hasMoreElements();) { + final String dependencyName = depIter.nextElement(); + if (!succeededTargets.contains(dependencyName)) { + canExecute = false; + log(curtarget, + "Cannot execute '" + curtarget.getName() + "' - '" + + dependencyName + "' failed or was not executed.", + MSG_ERR); + break; + } + } + if (canExecute) { + Throwable thrownException = null; + try { + curtarget.performTasks(); + succeededTargets.add(curtarget.getName()); + } catch (final RuntimeException ex) { + if (!(keepGoingMode)) { + throw ex; // throw further + } + thrownException = ex; + } catch (final Throwable ex) { + if (!(keepGoingMode)) { + throw new BuildException(ex); + } + thrownException = ex; + } + if (thrownException != null) { + if (thrownException instanceof BuildException) { + log(curtarget, + "Target '" + curtarget.getName() + + "' failed with message '" + + thrownException.getMessage() + "'.", MSG_ERR); + // only the first build exception is reported + if (buildException == null) { + buildException = (BuildException) thrownException; + } + } else { + log(curtarget, + "Target '" + curtarget.getName() + + "' failed with message '" + + thrownException.getMessage() + "'.", MSG_ERR); + thrownException.printStackTrace(System.err); + if (buildException == null) { + buildException = + new BuildException(thrownException); + } + } + } + } + } + if (buildException != null) { + throw buildException; + } + } + + /** + * Return the canonical form of a filename. + *

    + * If the specified file name is relative it is resolved + * with respect to the given root directory. + * + * @param fileName The name of the file to resolve. + * Must not be null. + * + * @param rootDir The directory respective to which relative file names + * are resolved. May be null, in which case + * the current directory is used. + * + * @return the resolved File. + * + * @deprecated since 1.4.x + */ + @Deprecated + public File resolveFile(final String fileName, final File rootDir) { + return FILE_UTILS.resolveFile(rootDir, fileName); + } + + /** + * Return the canonical form of a filename. + *

    + * If the specified file name is relative it is resolved + * with respect to the project's base directory. + * + * @param fileName The name of the file to resolve. + * Must not be null. + * + * @return the resolved File. + * + */ + public File resolveFile(final String fileName) { + return FILE_UTILS.resolveFile(baseDir, fileName); + } + + /** + * Translate a path into its native (platform specific) format. + *

    + * This method uses PathTokenizer to separate the input path + * into its components. This handles DOS style paths in a relatively + * sensible way. The file separators are then converted to their platform + * specific versions. + * + * @param toProcess The path to be translated. + * May be null. + * + * @return the native version of the specified path or + * an empty string if the path is null or empty. + * + * @deprecated since 1.7 + * Use FileUtils.translatePath instead. + * + * @see PathTokenizer + */ + @Deprecated + public static String translatePath(final String toProcess) { + return FileUtils.translatePath(toProcess); + } + + /** + * Convenience method to copy a file from a source to a destination. + * No filtering is performed. + * + * @param sourceFile Name of file to copy from. + * Must not be null. + * @param destFile Name of file to copy to. + * Must not be null. + * + * @exception IOException if the copying fails. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final String sourceFile, final String destFile) + throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile); + } + + /** + * Convenience method to copy a file from a source to a destination + * specifying if token filtering should be used. + * + * @param sourceFile Name of file to copy from. + * Must not be null. + * @param destFile Name of file to copy to. + * Must not be null. + * @param filtering Whether or not token filtering should be used during + * the copy. + * + * @exception IOException if the copying fails. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final String sourceFile, final String destFile, final boolean filtering) + throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile, + filtering ? globalFilters : null); + } + + /** + * Convenience method to copy a file from a source to a + * destination specifying if token filtering should be used and if + * source files may overwrite newer destination files. + * + * @param sourceFile Name of file to copy from. + * Must not be null. + * @param destFile Name of file to copy to. + * Must not be null. + * @param filtering Whether or not token filtering should be used during + * the copy. + * @param overwrite Whether or not the destination file should be + * overwritten if it already exists. + * + * @exception IOException if the copying fails. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final String sourceFile, final String destFile, final boolean filtering, + final boolean overwrite) throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile, + filtering ? globalFilters : null, overwrite); + } + + /** + * Convenience method to copy a file from a source to a + * destination specifying if token filtering should be used, if + * source files may overwrite newer destination files, and if the + * last modified time of the resulting file should be set to + * that of the source file. + * + * @param sourceFile Name of file to copy from. + * Must not be null. + * @param destFile Name of file to copy to. + * Must not be null. + * @param filtering Whether or not token filtering should be used during + * the copy. + * @param overwrite Whether or not the destination file should be + * overwritten if it already exists. + * @param preserveLastModified Whether or not the last modified time of + * the resulting file should be set to that + * of the source file. + * + * @exception IOException if the copying fails. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final String sourceFile, final String destFile, final boolean filtering, + final boolean overwrite, final boolean preserveLastModified) + throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile, + filtering ? globalFilters : null, overwrite, preserveLastModified); + } + + /** + * Convenience method to copy a file from a source to a destination. + * No filtering is performed. + * + * @param sourceFile File to copy from. + * Must not be null. + * @param destFile File to copy to. + * Must not be null. + * + * @exception IOException if the copying fails. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final File sourceFile, final File destFile) throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile); + } + + /** + * Convenience method to copy a file from a source to a destination + * specifying if token filtering should be used. + * + * @param sourceFile File to copy from. + * Must not be null. + * @param destFile File to copy to. + * Must not be null. + * @param filtering Whether or not token filtering should be used during + * the copy. + * + * @exception IOException if the copying fails. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final File sourceFile, final File destFile, final boolean filtering) + throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile, + filtering ? globalFilters : null); + } + + /** + * Convenience method to copy a file from a source to a + * destination specifying if token filtering should be used and if + * source files may overwrite newer destination files. + * + * @param sourceFile File to copy from. + * Must not be null. + * @param destFile File to copy to. + * Must not be null. + * @param filtering Whether or not token filtering should be used during + * the copy. + * @param overwrite Whether or not the destination file should be + * overwritten if it already exists. + * + * @exception IOException if the file cannot be copied. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final File sourceFile, final File destFile, final boolean filtering, + final boolean overwrite) throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile, + filtering ? globalFilters : null, overwrite); + } + + /** + * Convenience method to copy a file from a source to a + * destination specifying if token filtering should be used, if + * source files may overwrite newer destination files, and if the + * last modified time of the resulting file should be set to + * that of the source file. + * + * @param sourceFile File to copy from. + * Must not be null. + * @param destFile File to copy to. + * Must not be null. + * @param filtering Whether or not token filtering should be used during + * the copy. + * @param overwrite Whether or not the destination file should be + * overwritten if it already exists. + * @param preserveLastModified Whether or not the last modified time of + * the resulting file should be set to that + * of the source file. + * + * @exception IOException if the file cannot be copied. + * + * @deprecated since 1.4.x + */ + @Deprecated + public void copyFile(final File sourceFile, final File destFile, final boolean filtering, + final boolean overwrite, final boolean preserveLastModified) + throws IOException { + FILE_UTILS.copyFile(sourceFile, destFile, + filtering ? globalFilters : null, overwrite, preserveLastModified); + } + + /** + * Call File.setLastModified(long time) on Java above 1.1, and logs + * a warning on Java 1.1. + * + * @param file The file to set the last modified time on. + * Must not be null. + * + * @param time the required modification time. + * + * @deprecated since 1.4.x + * + * @exception BuildException if the last modified time cannot be set + * despite running on a platform with a version + * above 1.1. + */ + @Deprecated + public void setFileLastModified(final File file, final long time) + throws BuildException { + FILE_UTILS.setFileLastModified(file, time); + log("Setting modification time for " + file, MSG_VERBOSE); + } + + /** + * Return the boolean equivalent of a string, which is considered + * true if either "on", "true", + * or "yes" is found, ignoring case. + * + * @param s The string to convert to a boolean value. + * + * @return true if the given string is "on", + * "true" or "yes", or + * false otherwise. + */ + public static boolean toBoolean(final String s) { + return ("on".equalsIgnoreCase(s) + || "true".equalsIgnoreCase(s) + || "yes".equalsIgnoreCase(s)); + } + + /** + * Get the Project instance associated with the specified object. + * @param o the object to query. + * @return Project instance, if any. + * @since Ant 1.7.1 + */ + public static Project getProject(final Object o) { + if (o instanceof ProjectComponent) { + return ((ProjectComponent) o).getProject(); + } + try { + final Method m = o.getClass().getMethod("getProject", (Class[]) null); + if (Project.class == m.getReturnType()) { + return (Project) m.invoke(o, (Object[]) null); + } + } catch (final Exception e) { + //too bad + } + return null; + } + + /** + * Topologically sort a set of targets. Equivalent to calling + * topoSort(new String[] {root}, targets, true). + * + * @param root The name of the root target. The sort is created in such + * a way that the sequence of Targets up to the root + * target is the minimum possible such sequence. + * Must not be null. + * @param targetTable A Hashtable mapping names to Targets. + * Must not be null. + * @return a Vector of ALL Target objects in sorted order. + * @exception BuildException if there is a cyclic dependency among the + * targets, or if a named target does not exist. + */ + public final Vector topoSort(final String root, final Hashtable targetTable) + throws BuildException { + return topoSort(new String[] {root}, targetTable, true); + } + + /** + * Topologically sort a set of targets. Equivalent to calling + * topoSort(new String[] {root}, targets, returnAll). + * + * @param root The name of the root target. The sort is created in such + * a way that the sequence of Targets up to the root + * target is the minimum possible such sequence. + * Must not be null. + * @param targetTable A Hashtable mapping names to Targets. + * Must not be null. + * @param returnAll boolean indicating whether to return all + * targets, or the execution sequence only. + * @return a Vector of Target objects in sorted order. + * @exception BuildException if there is a cyclic dependency among the + * targets, or if a named target does not exist. + * @since Ant 1.6.3 + */ + public final Vector topoSort(final String root, final Hashtable targetTable, + final boolean returnAll) throws BuildException { + return topoSort(new String[] {root}, targetTable, returnAll); + } + + /** + * Topologically sort a set of targets. + * + * @param root String[] containing the names of the root targets. + * The sort is created in such a way that the ordered sequence of + * Targets is the minimum possible such sequence to the specified + * root targets. + * Must not be null. + * @param targetTable A map of names to targets (String to Target). + * Must not be null. + * @param returnAll boolean indicating whether to return all + * targets, or the execution sequence only. + * @return a Vector of Target objects in sorted order. + * @exception BuildException if there is a cyclic dependency among the + * targets, or if a named target does not exist. + * @since Ant 1.6.3 + */ + public final Vector topoSort(final String[] root, final Hashtable targetTable, + final boolean returnAll) throws BuildException { + final Vector ret = new VectorSet(); + final Hashtable state = new Hashtable(); + final Stack visiting = new Stack(); + + // We first run a DFS based sort using each root as a starting node. + // This creates the minimum sequence of Targets to the root node(s). + // We then do a sort on any remaining unVISITED targets. + // This is unnecessary for doing our build, but it catches + // circular dependencies or missing Targets on the entire + // dependency tree, not just on the Targets that depend on the + // build Target. + + for (int i = 0; i < root.length; i++) { + final String st = (state.get(root[i])); + if (st == null) { + tsort(root[i], targetTable, state, visiting, ret); + } else if (st == VISITING) { + throw new RuntimeException("Unexpected node in visiting state: " + + root[i]); + } + } + final StringBuffer buf = new StringBuffer("Build sequence for target(s)"); + + for (int j = 0; j < root.length; j++) { + buf.append((j == 0) ? " `" : ", `").append(root[j]).append('\''); + } + buf.append(" is " + ret); + log(buf.toString(), MSG_VERBOSE); + + final Vector complete = (returnAll) ? ret : new Vector(ret); + for (final Enumeration en = targetTable.keys(); en.hasMoreElements();) { + final String curTarget = en.nextElement(); + final String st = state.get(curTarget); + if (st == null) { + tsort(curTarget, targetTable, state, visiting, complete); + } else if (st == VISITING) { + throw new RuntimeException("Unexpected node in visiting state: " + + curTarget); + } + } + log("Complete build sequence is " + complete, MSG_VERBOSE); + return ret; + } + + /** + * Perform a single step in a recursive depth-first-search traversal of + * the target dependency tree. + *

    + * The current target is first set to the "visiting" state, and + * pushed onto the "visiting" stack. + *

    + * An exception is then thrown if any child of the current node is in the + * visiting state, as that implies a circular dependency. The exception + * contains details of the cycle, using elements of the "visiting" + * stack. + *

    + * If any child has not already been "visited", this method is + * called recursively on it. + *

    + * The current target is then added to the ordered list of targets. Note + * that this is performed after the children have been visited in order + * to get the correct order. The current target is set to the + * "visited" state. + *

    + * By the time this method returns, the ordered list contains the sequence + * of targets up to and including the current target. + * + * @param root The current target to inspect. + * Must not be null. + * @param targetTable A mapping from names to targets (String to Target). + * Must not be null. + * @param state A mapping from target names to states (String to String). + * The states in question are "VISITING" and + * "VISITED". Must not be null. + * @param visiting A stack of targets which are currently being visited. + * Must not be null. + * @param ret The list to add target names to. This will end up + * containing the complete list of dependencies in + * dependency order. + * Must not be null. + * + * @exception BuildException if a non-existent target is specified or if + * a circular dependency is detected. + */ + private void tsort(final String root, final Hashtable targetTable, + final Hashtable state, final Stack visiting, + final Vector ret) + throws BuildException { + state.put(root, VISITING); + visiting.push(root); + + final Target target = targetTable.get(root); + + // Make sure we exist + if (target == null) { + final StringBuilder sb = new StringBuilder("Target \""); + sb.append(root); + sb.append("\" does not exist in the project \""); + sb.append(name); + sb.append("\". "); + visiting.pop(); + if (!visiting.empty()) { + final String parent = visiting.peek(); + sb.append("It is used from target \""); + sb.append(parent); + sb.append("\"."); + } + throw new BuildException(new String(sb)); + } + for (final Enumeration en = target.getDependencies(); en.hasMoreElements();) { + final String cur = en.nextElement(); + final String m = state.get(cur); + if (m == null) { + // Not been visited + tsort(cur, targetTable, state, visiting, ret); + } else if (m == VISITING) { + // Currently visiting this node, so have a cycle + throw makeCircularException(cur, visiting); + } + } + final String p = visiting.pop(); + if (root != p) { + throw new RuntimeException("Unexpected internal error: expected to " + + "pop " + root + " but got " + p); + } + state.put(root, VISITED); + ret.addElement(target); + } + + /** + * Build an appropriate exception detailing a specified circular + * dependency. + * + * @param end The dependency to stop at. Must not be null. + * @param stk A stack of dependencies. Must not be null. + * + * @return a BuildException detailing the specified circular dependency. + */ + private static BuildException makeCircularException(final String end, final Stack stk) { + final StringBuilder sb = new StringBuilder("Circular dependency: "); + sb.append(end); + String c; + do { + c = stk.pop(); + sb.append(" <- "); + sb.append(c); + } while (!c.equals(end)); + return new BuildException(sb.toString()); + } + + /** + * Inherit the id references. + * @param parent the parent project of this project. + */ + public void inheritIDReferences(final Project parent) { + } + + /** + * Add an id reference. + * Used for broken build files. + * @param id the id to set. + * @param value the value to set it to (Unknown element in this case. + */ + public void addIdReference(final String id, final Object value) { + idReferences.put(id, value); + } + + /** + * Add a reference to the project. + * + * @param referenceName The name of the reference. Must not be null. + * @param value The value of the reference. + */ + public void addReference(final String referenceName, final Object value) { + final Object old = ((AntRefTable) references).getReal(referenceName); + if (old == value) { + // no warning, this is not changing anything + return; + } + if (old != null && !(old instanceof UnknownElement)) { + log("Overriding previous definition of reference to " + referenceName, + MSG_VERBOSE); + } + log("Adding reference: " + referenceName, MSG_DEBUG); + references.put(referenceName, value); + } + + /** + * Return a map of the references in the project (String to Object). + * The returned hashtable is "live" and so must not be modified. + * + * @return a map of the references in the project (String to Object). + */ + public Hashtable getReferences() { + return references; + } + + /** + * Does the project know this reference? + * + * @since Ant 1.8.0 + */ + public boolean hasReference(final String key) { + return references.containsKey(key); + } + + /** + * Return a map of the references in the project (String to + * Object). The returned hashtable is a copy of the + * "live" references. + * + * @return a map of the references in the project (String to Object). + * + * @since Ant 1.8.1 + */ + public Map getCopyOfReferences() { + return new HashMap(references); + } + + /** + * Look up a reference by its key (ID). + * + * @param key The key for the desired reference. + * Must not be null. + * + * @return the reference with the specified ID, or null if + * there is no such reference in the project, with type inference. + */ + public T getReference(final String key) { + @SuppressWarnings("unchecked") + final T ret = (T) references.get(key); + if (ret != null) { + return ret; + } + if (!key.equals(MagicNames.REFID_PROPERTY_HELPER)) { + try { + if (PropertyHelper.getPropertyHelper(this).containsProperties(key)) { + log("Unresolvable reference " + key + + " might be a misuse of property expansion syntax.", MSG_WARN); + } + } catch (final Exception e) { + //ignore + } + } + return null; + } + + /** + * Return a description of the type of the given element, with + * special handling for instances of tasks and data types. + *

    + * This is useful for logging purposes. + * + * @param element The element to describe. + * Must not be null. + * + * @return a description of the element type. + * + * @since 1.95, Ant 1.5 + */ + public String getElementName(final Object element) { + return ComponentHelper.getComponentHelper(this).getElementName(element); + } + + /** + * Send a "build started" event + * to the build listeners for this project. + */ + public void fireBuildStarted() { + final BuildEvent event = new BuildEvent(this); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].buildStarted(event); + } + } + + /** + * Send a "build finished" event to the build listeners + * for this project. + * @param exception an exception indicating a reason for a build + * failure. May be null, indicating + * a successful build. + */ + public void fireBuildFinished(final Throwable exception) { + final BuildEvent event = new BuildEvent(this); + event.setException(exception); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].buildFinished(event); + } + // Inform IH to clear the cache + IntrospectionHelper.clearCache(); + } + + /** + * Send a "subbuild started" event to the build listeners for + * this project. + * + * @since Ant 1.6.2 + */ + public void fireSubBuildStarted() { + final BuildEvent event = new BuildEvent(this); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + if (currListeners[i] instanceof SubBuildListener) { + ((SubBuildListener) currListeners[i]).subBuildStarted(event); + } + } + } + + /** + * Send a "subbuild finished" event to the build listeners for + * this project. + * @param exception an exception indicating a reason for a build + * failure. May be null, indicating + * a successful build. + * + * @since Ant 1.6.2 + */ + public void fireSubBuildFinished(final Throwable exception) { + final BuildEvent event = new BuildEvent(this); + event.setException(exception); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + if (currListeners[i] instanceof SubBuildListener) { + ((SubBuildListener) currListeners[i]).subBuildFinished(event); + } + } + } + + /** + * Send a "target started" event to the build listeners + * for this project. + * + * @param target The target which is starting to build. + * Must not be null. + */ + protected void fireTargetStarted(final Target target) { + final BuildEvent event = new BuildEvent(target); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].targetStarted(event); + } + + } + + /** + * Send a "target finished" event to the build listeners + * for this project. + * + * @param target The target which has finished building. + * Must not be null. + * @param exception an exception indicating a reason for a build + * failure. May be null, indicating + * a successful build. + */ + protected void fireTargetFinished(final Target target, final Throwable exception) { + final BuildEvent event = new BuildEvent(target); + event.setException(exception); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].targetFinished(event); + } + + } + + /** + * Send a "task started" event to the build listeners + * for this project. + * + * @param task The target which is starting to execute. + * Must not be null. + */ + protected void fireTaskStarted(final Task task) { + // register this as the current task on the current thread. + registerThreadTask(Thread.currentThread(), task); + final BuildEvent event = new BuildEvent(task); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].taskStarted(event); + } + } + + /** + * Send a "task finished" event to the build listeners for this + * project. + * + * @param task The task which has finished executing. + * Must not be null. + * @param exception an exception indicating a reason for a build + * failure. May be null, indicating + * a successful build. + */ + protected void fireTaskFinished(final Task task, final Throwable exception) { + registerThreadTask(Thread.currentThread(), null); + System.out.flush(); + System.err.flush(); + final BuildEvent event = new BuildEvent(task); + event.setException(exception); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].taskFinished(event); + } + + } + + /** + * Send a "message logged" event to the build listeners + * for this project. + * + * @param event The event to send. This should be built up with the + * appropriate task/target/project by the caller, so that + * this method can set the message and priority, then send + * the event. Must not be null. + * @param message The message to send. Should not be null. + * @param priority The priority of the message. + */ + private void fireMessageLoggedEvent(final BuildEvent event, String message, + final int priority) { + + if (message == null) { + message = String.valueOf(message); + } + if (message.endsWith(StringUtils.LINE_SEP)) { + final int endIndex = message.length() - StringUtils.LINE_SEP.length(); + event.setMessage(message.substring(0, endIndex), priority); + } else { + event.setMessage(message, priority); + } + if (isLoggingMessage.get() != Boolean.FALSE) { + /* + * One of the Listeners has attempted to access + * System.err or System.out. + * + * We used to throw an exception in this case, but + * sometimes Listeners can't prevent it(like our own + * Log4jListener which invokes getLogger() which in + * turn wants to write to the console). + * + * @see http://marc.theaimsgroup.com/?t=110538624200006&r=1&w=2 + * + * We now (Ant 1.6.3 and later) simply swallow the message. + */ + return; + } + try { + isLoggingMessage.set(Boolean.TRUE); + final BuildListener[] currListeners = listeners; + for (int i = 0; i < currListeners.length; i++) { + currListeners[i].messageLogged(event); + } + } finally { + isLoggingMessage.set(Boolean.FALSE); + } + } + + /** + * Send a "message logged" project level event + * to the build listeners for this project. + * + * @param project The project generating the event. + * Should not be null. + * @param message The message to send. Should not be null. + * @param priority The priority of the message. + */ + protected void fireMessageLogged(final Project project, final String message, + final int priority) { + fireMessageLogged(project, message, null, priority); + } + + /** + * Send a "message logged" project level event + * to the build listeners for this project. + * + * @param project The project generating the event. + * Should not be null. + * @param message The message to send. Should not be null. + * @param throwable The exception that caused this message. May be null. + * @param priority The priority of the message. + * @since 1.7 + */ + protected void fireMessageLogged(final Project project, final String message, + final Throwable throwable, final int priority) { + final BuildEvent event = new BuildEvent(project); + event.setException(throwable); + fireMessageLoggedEvent(event, message, priority); + } + + /** + * Send a "message logged" target level event + * to the build listeners for this project. + * + * @param target The target generating the event. + * Must not be null. + * @param message The message to send. Should not be null. + * @param priority The priority of the message. + */ + protected void fireMessageLogged(final Target target, final String message, + final int priority) { + fireMessageLogged(target, message, null, priority); + } + + /** + * Send a "message logged" target level event + * to the build listeners for this project. + * + * @param target The target generating the event. + * Must not be null. + * @param message The message to send. Should not be null. + * @param throwable The exception that caused this message. May be null. + * @param priority The priority of the message. + * @since 1.7 + */ + protected void fireMessageLogged(final Target target, final String message, + final Throwable throwable, final int priority) { + final BuildEvent event = new BuildEvent(target); + event.setException(throwable); + fireMessageLoggedEvent(event, message, priority); + } + + /** + * Send a "message logged" task level event + * to the build listeners for this project. + * + * @param task The task generating the event. + * Must not be null. + * @param message The message to send. Should not be null. + * @param priority The priority of the message. + */ + protected void fireMessageLogged(final Task task, final String message, final int priority) { + fireMessageLogged(task, message, null, priority); + } + + /** + * Send a "message logged" task level event + * to the build listeners for this project. + * + * @param task The task generating the event. + * Must not be null. + * @param message The message to send. Should not be null. + * @param throwable The exception that caused this message. May be null. + * @param priority The priority of the message. + * @since 1.7 + */ + protected void fireMessageLogged(final Task task, final String message, + final Throwable throwable, final int priority) { + final BuildEvent event = new BuildEvent(task); + event.setException(throwable); + fireMessageLoggedEvent(event, message, priority); + } + + /** + * Register a task as the current task for a thread. + * If the task is null, the thread's entry is removed. + * + * @param thread the thread on which the task is registered. + * @param task the task to be registered. + * @since Ant 1.5 + */ + public void registerThreadTask(final Thread thread, final Task task) { + synchronized (threadTasks) { + if (task != null) { + threadTasks.put(thread, task); + threadGroupTasks.put(thread.getThreadGroup(), task); + } else { + threadTasks.remove(thread); + threadGroupTasks.remove(thread.getThreadGroup()); + } + } + } + + /** + * Get the current task associated with a thread, if any. + * + * @param thread the thread for which the task is required. + * @return the task which is currently registered for the given thread or + * null if no task is registered. + */ + public Task getThreadTask(final Thread thread) { + synchronized (threadTasks) { + Task task = threadTasks.get(thread); + if (task == null) { + ThreadGroup group = thread.getThreadGroup(); + while (task == null && group != null) { + task = threadGroupTasks.get(group); + group = group.getParent(); + } + } + return task; + } + } + + + // Should move to a separate public class - and have API to add + // listeners, etc. + private static class AntRefTable extends Hashtable { + private static final long serialVersionUID = 1L; + + AntRefTable() { + super(); + } + + /** Returns the unmodified original object. + * This method should be called internally to + * get the "real" object. + * The normal get method will do the replacement + * of UnknownElement (this is similar with the JDNI + * refs behavior). + */ + private Object getReal(final Object key) { + return super.get(key); + } + + /** Get method for the reference table. + * It can be used to hook dynamic references and to modify + * some references on the fly--for example for delayed + * evaluation. + * + * It is important to make sure that the processing that is + * done inside is not calling get indirectly. + * + * @param key lookup key. + * @return mapped value. + */ + @Override + public Object get(final Object key) { + Object o = getReal(key); + if (o instanceof UnknownElement) { + // Make sure that + final UnknownElement ue = (UnknownElement) o; + ue.maybeConfigure(); + o = ue.getRealThing(); + } + return o; + } + } + + /** + * Set a reference to this Project on the parameterized object. + * Need to set the project before other set/add elements + * are called. + * @param obj the object to invoke setProject(this) on. + */ + public final void setProjectReference(final Object obj) { + if (obj instanceof ProjectComponent) { + ((ProjectComponent) obj).setProject(this); + return; + } + try { + final Method method = + obj.getClass().getMethod( + "setProject", new Class[] {Project.class}); + if (method != null) { + method.invoke(obj, new Object[] {this}); + } + } catch (final Throwable e) { + // ignore this if the object does not have + // a set project method or the method + // is private/protected. + } + } + + /** + * Resolve the file relative to the project's basedir and return it as a + * FileResource. + * @param name the name of the file to resolve. + * @return the file resource. + * @since Ant 1.7 + */ + public Resource getResource(final String name) { + return new FileResource(getBaseDir(), name); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectComponent.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectComponent.java new file mode 100644 index 00000000..ad92a317 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectComponent.java @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Base class for components of a project, including tasks and data types. + * Provides common facilities. + * + */ +public abstract class ProjectComponent implements Cloneable { + + // CheckStyle:VisibilityModifier OFF - bc + /** + * Project object of this component. + * @deprecated since 1.6.x. + * You should not be directly accessing this variable directly. + * You should access project object via the getProject() + * or setProject() accessor/mutators. + */ + protected Project project; + + /** + * Location within the build file of this task definition. + * @deprecated since 1.6.x. + * You should not be accessing this variable directly. + * Please use the {@link #getLocation()} method. + */ + protected Location location = Location.UNKNOWN_LOCATION; + + /** + * Description of this component, if any. + * @deprecated since 1.6.x. + * You should not be accessing this variable directly. + */ + protected String description; + // CheckStyle:VisibilityModifier ON + + /** Sole constructor. */ + public ProjectComponent() { + } + + /** + * Sets the project object of this component. This method is used by + * Project when a component is added to it so that the component has + * access to the functions of the project. It should not be used + * for any other purpose. + * + * @param project Project in whose scope this component belongs. + * Must not be null. + */ + public void setProject(Project project) { + this.project = project; + } + + /** + * Returns the project to which this component belongs. + * + * @return the components's project. + */ + public Project getProject() { + return project; + } + + /** + * Returns the file/location where this task was defined. + * + * @return the file/location where this task was defined. + * Should not return null. Location.UNKNOWN_LOCATION + * is used for unknown locations. + * + * @see Location#UNKNOWN_LOCATION + */ + public Location getLocation() { + return location; + } + + /** + * Sets the file/location where this task was defined. + * + * @param location The file/location where this task was defined. + * Should not be null--use + * Location.UNKNOWN_LOCATION if the location isn't known. + * + * @see Location#UNKNOWN_LOCATION + */ + public void setLocation(Location location) { + this.location = location; + } + + /** + * Sets a description of the current action. This may be used for logging + * purposes. + * + * @param desc Description of the current action. + * May be null, indicating that no description is + * available. + * + */ + public void setDescription(String desc) { + description = desc; + } + + /** + * Returns the description of the current action. + * + * @return the description of the current action, or null if + * no description is available. + */ + public String getDescription() { + return description; + } + + /** + * Logs a message with the default (INFO) priority. + * + * @param msg The message to be logged. Should not be null. + */ + public void log(String msg) { + log(msg, Project.MSG_INFO); + } + + /** + * Logs a message with the given priority. + * + * @param msg The message to be logged. Should not be null. + * @param msgLevel the message priority at which this message is + * to be logged. + */ + public void log(String msg, int msgLevel) { + if (getProject() != null) { + getProject().log(msg, msgLevel); + } else { + // 'reasonable' default, if the component is used without + // a Project ( for example as a standalone Bean ). + // Most ant components can be used this way. + if (msgLevel <= Project.MSG_INFO) { + System.err.println(msg); + } + } + } + + /** + * @since Ant 1.7 + * @return a shallow copy of this projectcomponent. + * @throws CloneNotSupportedException does not happen, + * but is declared to allow subclasses to do so. + */ + public Object clone() throws CloneNotSupportedException { + ProjectComponent pc = (ProjectComponent) super.clone(); + pc.setLocation(getLocation()); + pc.setProject(getProject()); + return pc; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelper.java new file mode 100644 index 00000000..c6eaa077 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelper.java @@ -0,0 +1,698 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.File; +import java.util.Hashtable; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Vector; + +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.util.LoaderUtils; +import org.xml.sax.AttributeList; + +/** + * Configures a Project (complete with Targets and Tasks) based on + * a build file. It'll rely on a plugin to do the actual processing + * of the file. + *

    + * This class also provide static wrappers for common introspection. + */ +public class ProjectHelper { + /** The URI for ant name space */ + public static final String ANT_CORE_URI = "antlib:org.apache.tools.ant"; + + /** The URI for antlib current definitions */ + public static final String ANT_CURRENT_URI = "ant:current"; + + /** The URI for ant specific attributes + * @since Ant 1.9.1 + * */ + public static final String ANT_ATTRIBUTE_URI = "ant:attribute"; + + /** The URI for defined types/tasks - the format is antlib:<package> */ + public static final String ANTLIB_URI = "antlib:"; + + /** Polymorphic attribute */ + public static final String ANT_TYPE = "ant-type"; + + /** + * Name of JVM system property which provides the name of the + * ProjectHelper class to use. + */ + public static final String HELPER_PROPERTY = MagicNames.PROJECT_HELPER_CLASS; + + /** + * The service identifier in jars which provide Project Helper + * implementations. + */ + public static final String SERVICE_ID = MagicNames.PROJECT_HELPER_SERVICE; + + /** + * name of project helper reference that we add to a project + */ + public static final String PROJECTHELPER_REFERENCE = MagicNames.REFID_PROJECT_HELPER; + + /** + * constant to denote use project name as target prefix + * @since Ant 1.9.1 + */ + public static final String USE_PROJECT_NAME_AS_TARGET_PREFIX = "USE_PROJECT_NAME_AS_TARGET_PREFIX"; + + /** + * Configures the project with the contents of the specified build file. + * + * @param project The project to configure. Must not be null. + * @param buildFile A build file giving the project's configuration. + * Must not be null. + * + * @exception BuildException if the configuration is invalid or cannot be read + */ + public static void configureProject(Project project, File buildFile) throws BuildException { + FileResource resource = new FileResource(buildFile); + ProjectHelper helper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile(resource); + project.addReference(PROJECTHELPER_REFERENCE, helper); + helper.parse(project, buildFile); + } + + /** + * Possible value for target's onMissingExtensionPoint attribute. It determines how to deal with + * targets that want to extend missing extension-points. + *

    + * This class behaves like a Java 1.5 Enum class. + * + * @since 1.8.2 + */ + public static final class OnMissingExtensionPoint { + + /** fail if the extension-point is not defined */ + public static final OnMissingExtensionPoint FAIL = new OnMissingExtensionPoint( + "fail"); + + /** warn if the extension-point is not defined */ + public static final OnMissingExtensionPoint WARN = new OnMissingExtensionPoint( + "warn"); + + /** ignore the extensionOf attribute if the extension-point is not defined */ + public static final OnMissingExtensionPoint IGNORE = new OnMissingExtensionPoint( + "ignore"); + + private static final OnMissingExtensionPoint[] values = new OnMissingExtensionPoint[] { + FAIL, WARN, IGNORE }; + + private final String name; + + private OnMissingExtensionPoint(String name) { + this.name = name; + } + + public String name() { + return name; + } + + public String toString() { + return name; + } + + public static OnMissingExtensionPoint valueOf(String name) { + if (name == null) { + throw new NullPointerException(); + } + for (int i = 0; i < values.length; i++) { + if (name.equals(values[i].name())) { + return values[i]; + } + } + throw new IllegalArgumentException( + "Unknown onMissingExtensionPoint " + name); + } + } + + /** Default constructor */ + public ProjectHelper() { + } + + // -------------------- Common properties -------------------- + // The following properties are required by import ( and other tasks + // that read build files using ProjectHelper ). + + private Vector importStack = new Vector(); + private List extensionStack = new LinkedList(); + + /** + * Import stack. + * Used to keep track of imported files. Error reporting should + * display the import path. + * + * @return the stack of import source objects. + */ + public Vector getImportStack() { + return importStack; + } + + /** + * Extension stack. + * Used to keep track of targets that extend extension points. + * + * @return a list of three element string arrays where the first + * element is the name of the extensionpoint, the second the name + * of the target and the third the name of the enum like class + * {@link OnMissingExtensionPoint}. + */ + public List getExtensionStack() { + return extensionStack; + } + + private static final ThreadLocal targetPrefix = new ThreadLocal(); + + /** + * The prefix to prepend to imported target names. + * + *

    May be set by <import>'s as attribute.

    + * + * @return the configured prefix or null + * + * @since Ant 1.8.0 + */ + public static String getCurrentTargetPrefix() { + return targetPrefix.get(); + } + + /** + * Sets the prefix to prepend to imported target names. + * + * @since Ant 1.8.0 + */ + public static void setCurrentTargetPrefix(String prefix) { + targetPrefix.set(prefix); + } + + private static final ThreadLocal prefixSeparator = new ThreadLocal() { + protected String initialValue() { + return "."; + } + }; + + /** + * The separator between the prefix and the target name. + * + *

    May be set by <import>'s prefixSeparator attribute.

    + * + * @since Ant 1.8.0 + */ + public static String getCurrentPrefixSeparator() { + return prefixSeparator.get(); + } + + /** + * Sets the separator between the prefix and the target name. + * + * @since Ant 1.8.0 + */ + public static void setCurrentPrefixSeparator(String sep) { + prefixSeparator.set(sep); + } + + private static final ThreadLocal inIncludeMode = new ThreadLocal() { + protected Boolean initialValue() { + return Boolean.FALSE; + } + }; + + /** + * Whether the current file should be read in include as opposed + * to import mode. + * + *

    In include mode included targets are only known by their + * prefixed names and their depends lists get rewritten so that + * all dependencies get the prefix as well.

    + * + *

    In import mode imported targets are known by an adorned as + * well as a prefixed name and the unadorned target may be + * overwritten in the importing build file. The depends list of + * the imported targets is not modified at all.

    + * + * @since Ant 1.8.0 + */ + public static boolean isInIncludeMode() { + return Boolean.TRUE.equals(inIncludeMode.get()); + } + + /** + * Sets whether the current file should be read in include as + * opposed to import mode. + * + * @since Ant 1.8.0 + */ + public static void setInIncludeMode(boolean includeMode) { + inIncludeMode.set(Boolean.valueOf(includeMode)); + } + + // -------------------- Parse method -------------------- + /** + * Parses the project file, configuring the project as it goes. + * + * @param project The project for the resulting ProjectHelper to configure. + * Must not be null. + * @param source The source for XML configuration. A helper must support + * at least File, for backward compatibility. Helpers may + * support URL, InputStream, etc or specialized types. + * + * @since Ant1.5 + * @exception BuildException if the configuration is invalid or cannot + * be read + */ + public void parse(Project project, Object source) throws BuildException { + throw new BuildException("ProjectHelper.parse() must be implemented " + + "in a helper plugin " + this.getClass().getName()); + } + + /** + * Get the first project helper found in the classpath + * + * @return an project helper, never null + * @see org.apache.tools.ant.ProjectHelperRepository#getHelpers() + */ + public static ProjectHelper getProjectHelper() { + return (ProjectHelper) ProjectHelperRepository.getInstance().getHelpers().next(); + } + + /** + * JDK1.1 compatible access to the context class loader. Cut & paste from JAXP. + * + * @deprecated since 1.6.x. + * Use LoaderUtils.getContextClassLoader() + * + * @return the current context class loader, or null + * if the context class loader is unavailable. + */ + public static ClassLoader getContextClassLoader() { + return LoaderUtils.isContextLoaderAvailable() ? LoaderUtils.getContextClassLoader() : null; + } + + // -------------------- Static utils, used by most helpers ---------------- + + /** + * Configures an object using an introspection handler. + * + * @param target The target object to be configured. + * Must not be null. + * @param attrs A list of attributes to configure within the target. + * Must not be null. + * @param project The project containing the target. + * Must not be null. + * + * @deprecated since 1.6.x. + * Use IntrospectionHelper for each property. + * + * @exception BuildException if any of the attributes can't be handled by + * the target + */ + public static void configure(Object target, AttributeList attrs, + Project project) throws BuildException { + if (target instanceof TypeAdapter) { + target = ((TypeAdapter) target).getProxy(); + } + IntrospectionHelper ih = IntrospectionHelper.getHelper(project, target.getClass()); + + for (int i = 0, length = attrs.getLength(); i < length; i++) { + // reflect these into the target + String value = replaceProperties(project, attrs.getValue(i), project.getProperties()); + try { + ih.setAttribute(project, target, attrs.getName(i).toLowerCase(Locale.ENGLISH), value); + } catch (BuildException be) { + // id attribute must be set externally + if (!attrs.getName(i).equals("id")) { + throw be; + } + } + } + } + + /** + * Adds the content of #PCDATA sections to an element. + * + * @param project The project containing the target. + * Must not be null. + * @param target The target object to be configured. + * Must not be null. + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + * + * @exception BuildException if the target object doesn't accept text + */ + public static void addText(Project project, Object target, char[] buf, + int start, int count) throws BuildException { + addText(project, target, new String(buf, start, count)); + } + + /** + * Adds the content of #PCDATA sections to an element. + * + * @param project The project containing the target. + * Must not be null. + * @param target The target object to be configured. + * Must not be null. + * @param text Text to add to the target. + * May be null, in which case this + * method call is a no-op. + * + * @exception BuildException if the target object doesn't accept text + */ + public static void addText(Project project, Object target, String text) + throws BuildException { + + if (text == null) { + return; + } + if (target instanceof TypeAdapter) { + target = ((TypeAdapter) target).getProxy(); + } + IntrospectionHelper.getHelper(project, target.getClass()).addText(project, target, text); + } + + /** + * Stores a configured child element within its parent object. + * + * @param project Project containing the objects. + * May be null. + * @param parent Parent object to add child to. + * Must not be null. + * @param child Child object to store in parent. + * Should not be null. + * @param tag Name of element which generated the child. + * May be null, in which case + * the child is not stored. + */ + public static void storeChild(Project project, Object parent, Object child, String tag) { + IntrospectionHelper ih = IntrospectionHelper.getHelper(project, parent.getClass()); + ih.storeElement(project, parent, child, tag); + } + + /** + * Replaces ${xxx} style constructions in the given value with + * the string value of the corresponding properties. + * + * @param project The project containing the properties to replace. + * Must not be null. + * + * @param value The string to be scanned for property references. + * May be null. + * + * @exception BuildException if the string contains an opening + * ${ without a closing + * } + * @return the original string with the properties replaced, or + * null if the original string is null. + * + * @deprecated since 1.6.x. + * Use project.replaceProperties(). + * @since 1.5 + */ + public static String replaceProperties(Project project, String value) throws BuildException { + // needed since project properties are not accessible + return project.replaceProperties(value); + } + + /** + * Replaces ${xxx} style constructions in the given value + * with the string value of the corresponding data types. + * + * @param project The container project. This is used solely for + * logging purposes. Must not be null. + * @param value The string to be scanned for property references. + * May be null, in which case this + * method returns immediately with no effect. + * @param keys Mapping (String to Object) of property names to their + * values. Must not be null. + * + * @exception BuildException if the string contains an opening + * ${ without a closing + * } + * @return the original string with the properties replaced, or + * null if the original string is null. + * @deprecated since 1.6.x. + * Use PropertyHelper. + */ + public static String replaceProperties(Project project, String value, Hashtable keys) + throws BuildException { + PropertyHelper ph = PropertyHelper.getPropertyHelper(project); + return ph.replaceProperties(null, value, keys); + } + + /** + * Parses a string containing ${xxx} style property + * references into two lists. The first list is a collection + * of text fragments, while the other is a set of string property names. + * null entries in the first list indicate a property + * reference from the second list. + * + *

    As of Ant 1.8.0 this method is never invoked by any code + * inside of Ant itself.

    + * + * @param value Text to parse. Must not be null. + * @param fragments List to add text fragments to. + * Must not be null. + * @param propertyRefs List to add property names to. + * Must not be null. + * + * @deprecated since 1.6.x. + * Use PropertyHelper. + * @exception BuildException if the string contains an opening + * ${ without a closing } + */ + public static void parsePropertyString(String value, Vector fragments, Vector propertyRefs) + throws BuildException { + PropertyHelper.parsePropertyStringDefault(value, fragments, propertyRefs); + } + + /** + * Map a namespaced {uri,name} to an internal string format. + * For BC purposes the names from the ant core uri will be + * mapped to "name", other names will be mapped to + * uri + ":" + name. + * @param uri The namespace URI + * @param name The localname + * @return The stringified form of the ns name + */ + public static String genComponentName(String uri, String name) { + if (uri == null || uri.equals("") || uri.equals(ANT_CORE_URI)) { + return name; + } + return uri + ":" + name; + } + + /** + * extract a uri from a component name + * + * @param componentName The stringified form for {uri, name} + * @return The uri or "" if not present + */ + public static String extractUriFromComponentName(String componentName) { + if (componentName == null) { + return ""; + } + int index = componentName.lastIndexOf(':'); + if (index == -1) { + return ""; + } + return componentName.substring(0, index); + } + + /** + * extract the element name from a component name + * + * @param componentName The stringified form for {uri, name} + * @return The element name of the component + */ + public static String extractNameFromComponentName(String componentName) { + int index = componentName.lastIndexOf(':'); + if (index == -1) { + return componentName; + } + return componentName.substring(index + 1); + } + + /** + * Convert an attribute namespace to a "component name". + * @param ns the xml namespace uri. + * @return the converted value. + * @since Ant 1.9.1 + */ + public static String nsToComponentName(String ns) { + return "attribute namespace:" + ns; + } + + /** + * Add location to build exception. + * @param ex the build exception, if the build exception + * does not include + * @param newLocation the location of the calling task (may be null) + * @return a new build exception based in the build exception with + * location set to newLocation. If the original exception + * did not have a location, just return the build exception + */ + public static BuildException addLocationToBuildException( + BuildException ex, Location newLocation) { + if (ex.getLocation() == null || ex.getMessage() == null) { + return ex; + } + String errorMessage + = "The following error occurred while executing this line:" + + System.getProperty("line.separator") + + ex.getLocation().toString() + + ex.getMessage(); + if (newLocation == null) { + return new BuildException(errorMessage, ex); + } + return new BuildException(errorMessage, ex, newLocation); + } + + /** + * Whether this instance of ProjectHelper can parse an Antlib + * descriptor given by the URL and return its content as an + * UnknownElement ready to be turned into an Antlib task. + * + *

    This method should not try to parse the content of the + * descriptor, the URL is only given as an argument to allow + * subclasses to decide whether they can support a given URL + * scheme or not.

    + * + *

    Subclasses that return true in this method must also + * override {@link #parseAntlibDescriptor + * parseAntlibDescriptor}.

    + * + *

    This implementation returns false.

    + * + * @since Ant 1.8.0 + */ + public boolean canParseAntlibDescriptor(Resource r) { + return false; + } + + /** + * Parse the given URL as an antlib descriptor and return the + * content as something that can be turned into an Antlib task. + * + * @since ant 1.8.0 + */ + public UnknownElement parseAntlibDescriptor(Project containingProject, + Resource source) { + throw new BuildException("can't parse antlib descriptors"); + } + + /** + * Check if the helper supports the kind of file. Some basic check on the + * extension's file should be done here. + * + * @param buildFile + * the file expected to be parsed (never null) + * @return true if the helper supports it + * @since Ant 1.8.0 + */ + public boolean canParseBuildFile(Resource buildFile) { + return true; + } + + /** + * The file name of the build script to be parsed if none specified on the command line + * + * @return the name of the default file (never null) + * @since Ant 1.8.0 + */ + public String getDefaultBuildFile() { + return Main.DEFAULT_BUILD_FILENAME; + } + + /** + * Check extensionStack and inject all targets having extensionOf attributes + * into extensionPoint. + *

    + * This method allow you to defer injection and have a powerful control of + * extensionPoint wiring. + *

    + *

    + * This should be invoked by each concrete implementation of ProjectHelper + * when the root "buildfile" and all imported/included buildfile are loaded. + *

    + * + * @param project The project containing the target. Must not be + * null. + * @exception BuildException if OnMissingExtensionPoint.FAIL and + * extensionPoint does not exist + * @see OnMissingExtensionPoint + * @since 1.9 + */ + public void resolveExtensionOfAttributes(Project project) + throws BuildException { + for (String[] extensionInfo : getExtensionStack()) { + String extPointName = extensionInfo[0]; + String targetName = extensionInfo[1]; + OnMissingExtensionPoint missingBehaviour = OnMissingExtensionPoint.valueOf(extensionInfo[2]); + // if the file has been included or imported, it may have a prefix + // we should consider when trying to resolve the target it is + // extending + String prefixAndSep = extensionInfo.length > 3 ? extensionInfo[3] : null; + + // find the target we're extending + Hashtable projectTargets = project.getTargets(); + Target extPoint = null; + if (prefixAndSep == null) { + // no prefix - not from an imported/included build file + extPoint = projectTargets.get(extPointName); + } else { + // we have a prefix, which means we came from an include/import + + // FIXME: here we handle no particular level of include. We try + // the fully prefixed name, and then the non-prefixed name. But + // there might be intermediate project in the import stack, + // which prefix should be tested before testing the non-prefix + // root name. + + extPoint = projectTargets.get(prefixAndSep + extPointName); + if (extPoint == null) { + extPoint = projectTargets.get(extPointName); + } + } + + // make sure we found a point to extend on + if (extPoint == null) { + String message = "can't add target " + targetName + + " to extension-point " + extPointName + + " because the extension-point is unknown."; + if (missingBehaviour == OnMissingExtensionPoint.FAIL) { + throw new BuildException(message); + } else if (missingBehaviour == OnMissingExtensionPoint.WARN) { + Target t = projectTargets.get(targetName); + project.log(t, "Warning: " + message, Project.MSG_WARN); + } + } else { + if (!(extPoint instanceof ExtensionPoint)) { + throw new BuildException("referenced target " + extPointName + + " is not an extension-point"); + } + extPoint.addDependency(targetName); + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java new file mode 100644 index 00000000..1dd44124 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java @@ -0,0 +1,337 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; + +import org.apache.tools.ant.helper.ProjectHelper2; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.util.LoaderUtils; + +/** + * Repository of {@link ProjectHelper} found in the classpath or via + * some System properties. + * + *

    See the ProjectHelper documentation in the manual.

    + * + * @since Ant 1.8.0 + */ +public class ProjectHelperRepository { + + private static final String DEBUG_PROJECT_HELPER_REPOSITORY = + "ant.project-helper-repo.debug"; + + // The message log level is not accessible here because everything + // is instanciated statically + private static final boolean DEBUG = + "true".equals(System.getProperty(DEBUG_PROJECT_HELPER_REPOSITORY)); + + private static ProjectHelperRepository instance = + new ProjectHelperRepository(); + + private List> helpers = new ArrayList>(); + + private static Constructor PROJECTHELPER2_CONSTRUCTOR; + + static { + try { + PROJECTHELPER2_CONSTRUCTOR = ProjectHelper2.class.getConstructor(); + } catch (Exception e) { + // ProjectHelper2 must be available + throw new RuntimeException(e); + } + } + + public static ProjectHelperRepository getInstance() { + return instance; + } + + private ProjectHelperRepository() { + collectProjectHelpers(); + } + + private void collectProjectHelpers() { + // First, try the system property + Constructor projectHelper = getProjectHelperBySystemProperty(); + registerProjectHelper(projectHelper); + + // A JDK1.3 'service' ( like in JAXP ). That will plug a helper + // automatically if in CLASSPATH, with the right META-INF/services. + try { + ClassLoader classLoader = LoaderUtils.getContextClassLoader(); + if (classLoader != null) { + Enumeration resources = + classLoader.getResources(ProjectHelper.SERVICE_ID); + while (resources.hasMoreElements()) { + URL resource = resources.nextElement(); + URLConnection conn = resource.openConnection(); + conn.setUseCaches(false); + projectHelper = + getProjectHelperByService(conn.getInputStream()); + registerProjectHelper(projectHelper); + } + } + + InputStream systemResource = + ClassLoader.getSystemResourceAsStream(ProjectHelper.SERVICE_ID); + if (systemResource != null) { + projectHelper = getProjectHelperByService(systemResource); + registerProjectHelper(projectHelper); + } + } catch (Exception e) { + System.err.println("Unable to load ProjectHelper from service " + + ProjectHelper.SERVICE_ID + " (" + + e.getClass().getName() + + ": " + e.getMessage() + ")"); + if (DEBUG) { + e.printStackTrace(System.err); + } + } + } + + /** + * Register the specified project helper into the repository. + *

    + * The helper will be added after all the already registered helpers, but + * before the default one (ProjectHelper2) + * + * @param helperClassName + * the fully qualified name of the helper + * @throws BuildException + * if the class cannot be loaded or if there is no constructor + * with no argument + * @since Ant 1.8.2 + */ + public void registerProjectHelper(String helperClassName) + throws BuildException { + registerProjectHelper(getHelperConstructor(helperClassName)); + } + + /** + * Register the specified project helper into the repository. + *

    + * The helper will be added after all the already registered helpers, but + * before the default one (ProjectHelper2) + * + * @param helperClass + * the class of the helper + * @throws BuildException + * if there is no constructor with no argument + * @since Ant 1.8.2 + */ + public void registerProjectHelper(Class helperClass) throws BuildException { + try { + registerProjectHelper(helperClass.getConstructor()); + } catch (NoSuchMethodException e) { + throw new BuildException("Couldn't find no-arg constructor in " + + helperClass.getName()); + } + } + + private void registerProjectHelper(Constructor helperConstructor) { + if (helperConstructor == null) { + return; + } + if (DEBUG) { + System.out.println("ProjectHelper " + + helperConstructor.getClass().getName() + " registered."); + } + helpers.add(helperConstructor); + } + + private Constructor getProjectHelperBySystemProperty() { + String helperClass = System.getProperty(ProjectHelper.HELPER_PROPERTY); + try { + if (helperClass != null) { + return getHelperConstructor(helperClass); + } + } catch (SecurityException e) { + System.err.println("Unable to load ProjectHelper class \"" + + helperClass + " specified in system property " + + ProjectHelper.HELPER_PROPERTY + " (" + + e.getMessage() + ")"); + if (DEBUG) { + e.printStackTrace(System.err); + } + } + return null; + } + + private Constructor getProjectHelperByService(InputStream is) { + try { + // This code is needed by EBCDIC and other strange systems. + // It's a fix for bugs reported in xerces + InputStreamReader isr; + try { + isr = new InputStreamReader(is, "UTF-8"); + } catch (java.io.UnsupportedEncodingException e) { + isr = new InputStreamReader(is); + } + BufferedReader rd = new BufferedReader(isr); + + String helperClassName = rd.readLine(); + rd.close(); + + if (helperClassName != null && !"".equals(helperClassName)) { + return getHelperConstructor(helperClassName); + } + } catch (Exception e) { + System.out.println("Unable to load ProjectHelper from service " + + ProjectHelper.SERVICE_ID + " (" + e.getMessage() + ")"); + if (DEBUG) { + e.printStackTrace(System.err); + } + } + return null; + } + + /** + * Get the constructor with not argument of an helper from its class name. + * It'll first try the thread class loader, then Class.forName() will load + * from the same loader that loaded this class. + * + * @param helperClass + * The name of the class to create an instance of. Must not be + * null. + * + * @return the constructor of the specified class. + * + * @exception BuildException + * if the class cannot be found or if a constructor with no + * argument cannot be found. + */ + private Constructor getHelperConstructor(String helperClass) throws BuildException { + ClassLoader classLoader = LoaderUtils.getContextClassLoader(); + try { + Class clazz = null; + if (classLoader != null) { + try { + clazz = classLoader.loadClass(helperClass); + } catch (ClassNotFoundException ex) { + // try next method + } + } + if (clazz == null) { + clazz = Class.forName(helperClass); + } + return clazz.asSubclass(ProjectHelper.class).getConstructor(); + } catch (Exception e) { + throw new BuildException(e); + } + } + + /** + * Get the helper that will be able to parse the specified build file. The helper + * will be chosen among the ones found in the classpath + * + * @return the first ProjectHelper that fit the requirement (never null). + */ + public ProjectHelper getProjectHelperForBuildFile(Resource buildFile) throws BuildException { + for (Iterator it = getHelpers(); it.hasNext();) { + ProjectHelper helper = it.next(); + if (helper.canParseBuildFile(buildFile)) { + if (DEBUG) { + System.out.println("ProjectHelper " + + helper.getClass().getName() + + " selected for the build file " + + buildFile); + } + return helper; + } + } + throw new RuntimeException("BUG: at least the ProjectHelper2 should " + + "have supported the file " + buildFile); + } + + /** + * Get the helper that will be able to parse the specified antlib. The helper + * will be chosen among the ones found in the classpath + * + * @return the first ProjectHelper that fit the requirement (never null). + */ + public ProjectHelper getProjectHelperForAntlib(Resource antlib) throws BuildException { + for (Iterator it = getHelpers(); it.hasNext();) { + ProjectHelper helper = it.next(); + if (helper.canParseAntlibDescriptor(antlib)) { + if (DEBUG) { + System.out.println("ProjectHelper " + + helper.getClass().getName() + + " selected for the antlib " + + antlib); + } + return helper; + } + } + throw new RuntimeException("BUG: at least the ProjectHelper2 should " + + "have supported the file " + antlib); + } + + /** + * Get an iterator on the list of project helpers configured. The iterator + * will always return at least one element as there will always be the + * default project helper configured. + * + * @return an iterator of {@link ProjectHelper} + */ + public Iterator getHelpers() { + return new ConstructingIterator(helpers.iterator()); + } + + private static class ConstructingIterator implements Iterator { + private final Iterator> nested; + private boolean empty = false; + + ConstructingIterator(Iterator> nested) { + this.nested = nested; + } + + public boolean hasNext() { + return nested.hasNext() || !empty; + } + + public ProjectHelper next() { + Constructor c; + if (nested.hasNext()) { + c = nested.next(); + } else { + // last but not least, ant default project helper + empty = true; + c = PROJECTHELPER2_CONSTRUCTOR; + } + try { + return c.newInstance(); + } catch (Exception e) { + throw new BuildException("Failed to invoke no-arg constructor" + + " on " + c.getName()); + } + } + + public void remove() { + throw new UnsupportedOperationException("remove is not supported"); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PropertyHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PropertyHelper.java new file mode 100644 index 00000000..1dbb280c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/PropertyHelper.java @@ -0,0 +1,1215 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.text.ParsePosition; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Set; +import java.util.Vector; + +import org.apache.tools.ant.property.GetProperty; +import org.apache.tools.ant.property.NullReturn; +import org.apache.tools.ant.property.ParseNextProperty; +import org.apache.tools.ant.property.ParseProperties; +import org.apache.tools.ant.property.PropertyExpander; + +/* ISSUES: + - ns param. It could be used to provide "namespaces" for properties, which + may be more flexible. + - Object value. In ant1.5 String is used for Properties - but it would be nice + to support generic Objects (the property remains immutable - you can't change + the associated object). This will also allow JSP-EL style setting using the + Object if an attribute contains only the property (name="${property}" could + avoid Object->String->Object conversion) + - Currently we "chain" only for get and set property (probably most users + will only need that - if they need more they can replace the top helper). + Need to discuss this and find if we need more. + */ + +/* update for impending Ant 1.8.0: + + - I can't see any reason for ns and would like to deprecate it. + - Replacing chaining with delegates for certain behavioral aspects. + - Object value seems valuable as outlined. + + */ + +/** + * Deals with properties - substitution, dynamic properties, etc. + * + *

    This code has been heavily restructured for Ant 1.8.0. It is + * expected that custom PropertyHelper implementation that used the + * older chaining mechanism of Ant 1.6 won't work in all cases, and + * its usage is deprecated. The preferred way to customize Ant's + * property handling is by {@link #add adding} {@link + * PropertyHelper.Delegate delegates} of the appropriate subinterface + * and have this implementation use them.

    + * + *

    When {@link #parseProperties expanding a string that may contain + * properties} this class will delegate the actual parsing to {@link + * org.apache.tools.ant.property.ParseProperties#parseProperties + * parseProperties} inside the ParseProperties class which in turn + * uses the {@link org.apache.tools.ant.property.PropertyExpander + * PropertyExpander delegates} to find properties inside the string + * and this class to expand the propertiy names found into the + * corresponding values.

    + * + *

    When {@link #getProperty looking up a property value} this class + * will first consult all {@link PropertyHelper.PropertyEvaluator + * PropertyEvaluator} delegates and fall back to an internal map of + * "project properties" if no evaluator matched the property name.

    + * + *

    When {@link #setProperty setting a property value} this class + * will first consult all {@link PropertyHelper.PropertySetter + * PropertySetter} delegates and fall back to an internal map of + * "project properties" if no setter matched the property name.

    + * + * @since Ant 1.6 + */ +public class PropertyHelper implements GetProperty { + + // -------------------------------------------------------- + // + // The property delegate interfaces + // + // -------------------------------------------------------- + + /** + * Marker interface for a PropertyHelper delegate. + * @since Ant 1.8.0 + */ + public interface Delegate { + } + + /** + * Looks up a property's value based on its name. + * + *

    Can be used to look up properties in a different storage + * than the project instance (like local properties for example) + * or to implement custom "protocols" like Ant's + * ${toString:refid} syntax.

    + * + * @since Ant 1.8.0 + */ + public interface PropertyEvaluator extends Delegate { + /** + * Evaluate a property. + * + * @param property the property's String "identifier". + * @param propertyHelper the invoking PropertyHelper. + * @return null if the property name could not be found, an + * instance of {@link org.apache.tools.ant.property.NullReturn + * NullReturn} to indicate a property with a name that can be + * matched but a value of null and the property's + * value otherwise. + */ + Object evaluate(String property, PropertyHelper propertyHelper); + } + + /** + * Sets or overrides a property. + * + *

    Can be used to store properties in a different storage than + * the project instance (like local properties for example).

    + * + * @since Ant 1.8.0 + */ + public interface PropertySetter extends Delegate { + /** + * Set a *new" property. + * + *

    Should not replace the value of an existing property.

    + * + * @param property the property's String "identifier". + * @param value the value to set. + * @param propertyHelper the invoking PropertyHelper. + * @return true if this entity 'owns' the property. + */ + boolean setNew( + String property, Object value, PropertyHelper propertyHelper); + + /** + * Set a property. + * + *

    May replace the value of an existing property.

    + * + * @param property the property's String "identifier". + * @param value the value to set. + * @param propertyHelper the invoking PropertyHelper. + * @return true if this entity 'owns' the property. + */ + boolean set( + String property, Object value, PropertyHelper propertyHelper); + } + + //TODO PropertyEnumerator Delegate type, would improve PropertySet + + // -------------------------------------------------------- + // + // The predefined property delegates + // + // -------------------------------------------------------- + + private static final PropertyEvaluator TO_STRING = new PropertyEvaluator() { + private final String PREFIX = "toString:"; + private final int PREFIX_LEN = PREFIX.length(); + + public Object evaluate(String property, PropertyHelper propertyHelper) { + Object o = null; + if (property.startsWith(PREFIX) && propertyHelper.getProject() != null) { + o = propertyHelper.getProject().getReference(property.substring(PREFIX_LEN)); + } + return o == null ? null : o.toString(); + } + }; + + private static final PropertyExpander DEFAULT_EXPANDER = new PropertyExpander() { + public String parsePropertyName( + String s, ParsePosition pos, ParseNextProperty notUsed) { + int index = pos.getIndex(); + //directly check near, triggering characters: + if (s.length() - index >= 3 + && '$' == s.charAt(index) && '{' == s.charAt(index + 1)) { + int start = index + 2; + //defer to String.indexOf() for protracted check: + int end = s.indexOf('}', start); + if (end < 0) { + throw new BuildException("Syntax error in property: " + + s.substring(index)); + } + pos.setIndex(end + 1); + return start == end ? "" : s.substring(start, end); + } + return null; + } + }; + + /** dummy */ + private static final PropertyExpander SKIP_DOUBLE_DOLLAR + = new PropertyExpander() { + // CheckStyle:LineLengthCheck OFF see too long + /** + * {@inheritDoc} + * @see org.apache.tools.ant.property.PropertyExpander#parsePropertyName(java.lang.String, java.text.ParsePosition, org.apache.tools.ant.PropertyHelper) + */ + // CheckStyle:LineLengthCheck ON + public String parsePropertyName( + String s, ParsePosition pos, ParseNextProperty notUsed) { + int index = pos.getIndex(); + if (s.length() - index >= 2) { + /* check for $$; if found, advance by one-- + * this expander is at the bottom of the stack + * and will thus be the last consulted, + * so the next thing that ParseProperties will do + * is advance the parse position beyond the second $ + */ + if ('$' == s.charAt(index) && '$' == s.charAt(++index)) { + pos.setIndex(index); + } + } + return null; + } + }; + + /** + * @since Ant 1.8.0 + */ + private static final PropertyEvaluator FROM_REF = new PropertyEvaluator() { + private final String PREFIX = "ant.refid:"; + private final int PREFIX_LEN = PREFIX.length(); + + public Object evaluate(String prop, PropertyHelper helper) { + return prop.startsWith(PREFIX) && helper.getProject() != null + ? helper.getProject().getReference(prop.substring(PREFIX_LEN)) + : null; + } + }; + + private Project project; + private PropertyHelper next; + private final Hashtable, List> delegates = new Hashtable, List>(); + + /** Project properties map (usually String to String). */ + private Hashtable properties = new Hashtable(); + + /** + * Map of "user" properties (as created in the Ant task, for example). + * Note that these key/value pairs are also always put into the + * project properties, so only the project properties need to be queried. + */ + private Hashtable userProperties = new Hashtable(); + + /** + * Map of inherited "user" properties - that are those "user" + * properties that have been created by tasks and not been set + * from the command line or a GUI tool. + */ + private Hashtable inheritedProperties = new Hashtable(); + + /** + * Default constructor. + */ + protected PropertyHelper() { + add(FROM_REF); + add(TO_STRING); + add(SKIP_DOUBLE_DOLLAR); + add(DEFAULT_EXPANDER); + } + + // -------------------------------------------------------- + // + // Some helper static methods to get and set properties + // + // -------------------------------------------------------- + + /** + * A helper static method to get a property + * from a particular project. + * @param project the project in question. + * @param name the property name + * @return the value of the property if present, null otherwise. + * @since Ant 1.8.0 + */ + public static Object getProperty(Project project, String name) { + return PropertyHelper.getPropertyHelper(project) + .getProperty(name); + } + + /** + * A helper static method to set a property + * from a particular project. + * @param project the project in question. + * @param name the property name + * @param value the value to use. + * @since Ant 1.8.0 + */ + public static void setProperty(Project project, String name, Object value) { + PropertyHelper.getPropertyHelper(project) + .setProperty(name, value, true); + } + + /** + * A helper static method to set a new property + * from a particular project. + * @param project the project in question. + * @param name the property name + * @param value the value to use. + * @since Ant 1.8.0 + */ + public static void setNewProperty( + Project project, String name, Object value) { + PropertyHelper.getPropertyHelper(project) + .setNewProperty(name, value); + } + + //override facility for subclasses to put custom hashtables in + + // -------------------- Hook management -------------------- + + /** + * Set the project for which this helper is performing property resolution. + * + * @param p the project instance. + */ + public void setProject(Project p) { + this.project = p; + } + + /** + * Get this PropertyHelper's Project. + * @return Project + */ + public Project getProject() { + return project; + } + + /** + * Prior to Ant 1.8.0 there have been 2 ways to hook into property handling: + * + * - you can replace the main PropertyHelper. The replacement is required + * to support the same semantics (of course :-) + * + * - you can chain a property helper capable of storing some properties. + * Again, you are required to respect the immutability semantics (at + * least for non-dynamic properties) + * + *

    As of Ant 1.8.0 this method is never invoked by any code + * inside of Ant itself.

    + * + * @param next the next property helper in the chain. + * @deprecated use the delegate mechanism instead + */ + public void setNext(PropertyHelper next) { + this.next = next; + } + + /** + * Get the next property helper in the chain. + * + *

    As of Ant 1.8.0 this method is never invoked by any code + * inside of Ant itself except the {@link #setPropertyHook + * setPropertyHook} and {@link #getPropertyHook getPropertyHook} + * methods in this class.

    + * + * @return the next property helper. + * @deprecated use the delegate mechanism instead + */ + public PropertyHelper getNext() { + return next; + } + + /** + * Factory method to create a property processor. + * Users can provide their own or replace it using "ant.PropertyHelper" + * reference. User tasks can also add themselves to the chain, and provide + * dynamic properties. + * + * @param project the project for which the property helper is required. + * + * @return the project's property helper. + */ + public static synchronized PropertyHelper getPropertyHelper(Project project) { + PropertyHelper helper = null; + if (project != null) { + helper = (PropertyHelper) project.getReference(MagicNames + .REFID_PROPERTY_HELPER); + } + if (helper != null) { + return helper; + } + + helper = new PropertyHelper(); + helper.setProject(project); + + if (project != null) { + project.addReference(MagicNames.REFID_PROPERTY_HELPER, helper); + } + + return helper; + } + + /** + * Get the {@link PropertyExpander expanders}. + * @since Ant 1.8.0 + * @return the expanders. + */ + public Collection getExpanders() { + return getDelegates(PropertyExpander.class); + } + + + // -------------------- Methods to override -------------------- + + /** + * Sets a property. Any existing property of the same name + * is overwritten, unless it is a user property. + * + * If all helpers return false, the property will be saved in + * the default properties table by setProperty. + * + *

    As of Ant 1.8.0 this method is never invoked by any code + * inside of Ant itself.

    + * + * @param ns The namespace that the property is in (currently + * not used. + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @param inherited True if this property is inherited (an [sub]ant[call] property). + * @param user True if this property is a user property. + * @param isNew True is this is a new property. + * @return true if this helper has stored the property, false if it + * couldn't. Each helper should delegate to the next one (unless it + * has a good reason not to). + * @deprecated PropertyHelper chaining is deprecated. + */ + public boolean setPropertyHook(String ns, String name, + Object value, + boolean inherited, boolean user, + boolean isNew) { + if (getNext() != null) { + boolean subst = getNext().setPropertyHook(ns, name, value, inherited, user, isNew); + // If next has handled the property + if (subst) { + return true; + } + } + return false; + } + + /** + * Get a property. If all hooks return null, the default + * tables will be used. + * + *

    As of Ant 1.8.0 this method is never invoked by any code + * inside of Ant itself.

    + * + * @param ns namespace of the sought property. + * @param name name of the sought property. + * @param user True if this is a user property. + * @return The property, if returned by a hook, or null if none. + * @deprecated PropertyHelper chaining is deprecated. + */ + public Object getPropertyHook(String ns, String name, boolean user) { + if (getNext() != null) { + Object o = getNext().getPropertyHook(ns, name, user); + if (o != null) { + return o; + } + } + // Experimental/Testing, will be removed + if (project != null && name.startsWith("toString:")) { + name = name.substring("toString:".length()); + Object v = project.getReference(name); + return (v == null) ? null : v.toString(); + } + return null; + } + + // -------------------- Optional methods -------------------- + // You can override those methods if you want to optimize or + // do advanced things (like support a special syntax). + // The methods do not chain - you should use them when embedding ant + // (by replacing the main helper) + + /** + * Parses a string containing ${xxx} style property + * references into two lists. The first list is a collection + * of text fragments, while the other is a set of string property names. + * null entries in the first list indicate a property + * reference from the second list. + * + *

    Delegates to {@link #parsePropertyStringDefault + * parsePropertyStringDefault}.

    + * + *

    As of Ant 1.8.0 this method is never invoked by any code + * inside of Ant itself except {ProjectHelper#parsePropertyString + * ProjectHelper.parsePropertyString}.

    + * + * @param value Text to parse. Must not be null. + * @param fragments List to add text fragments to. + * Must not be null. + * @param propertyRefs List to add property names to. + * Must not be null. + * + * @exception BuildException if the string contains an opening + * ${ without a closing + * } + * @deprecated use the other mechanisms of this class instead + */ + public void parsePropertyString(String value, Vector fragments, + Vector propertyRefs) throws BuildException { + parsePropertyStringDefault(value, fragments, propertyRefs); + } + + /** + * Replaces ${xxx} style constructions in the given value + * with the string value of the corresponding data types. + * + *

    Delegates to the one-arg version, completely ignoring the ns + * and keys parameters.

    + * + * @param ns The namespace for the property. + * @param value The string to be scanned for property references. + * May be null, in which case this + * method returns immediately with no effect. + * @param keys Mapping (String to Object) of property names to their + * values. If null, only project properties will + * be used. + * + * @exception BuildException if the string contains an opening + * ${ without a closing + * } + * @return the original string with the properties replaced, or + * null if the original string is null. + */ + //TODO deprecate? Recall why no longer using ns/keys params + public String replaceProperties(String ns, String value, Hashtable keys) throws BuildException { + return replaceProperties(value); + } + + /** + * Replaces ${xxx} style constructions in the given value + * with the string value of the corresponding data types. + * + * @param value The string to be scanned for property references. + * May be null, in which case this + * method returns immediately with no effect. + * + * @exception BuildException if the string contains an opening + * ${ without a closing + * } + * @return the original string with the properties replaced, or + * null if the original string is null. + */ + public String replaceProperties(String value) throws BuildException { + Object o = parseProperties(value); + return o == null || o instanceof String ? (String) o : o.toString(); + } + + /** + * Decode properties from a String representation. If the entire + * contents of the String resolve to a single property, that value + * is returned. Otherwise a String is returned. + * + * @param value The string to be scanned for property references. + * May be null, in which case this + * method returns immediately with no effect. + * + * @exception BuildException if the string contains an opening + * ${ without a closing + * } + * @return the original string with the properties replaced, or + * null if the original string is null. + */ + public Object parseProperties(String value) throws BuildException { + return new ParseProperties(getProject(), getExpanders(), this) + .parseProperties(value); + } + + /** + * Learn whether a String contains replaceable properties. + * @param value the String to check. + * @return true if value contains property notation. + */ + public boolean containsProperties(String value) { + return new ParseProperties(getProject(), getExpanders(), this) + .containsProperties(value); + } + + // -------------------- Default implementation -------------------- + // Methods used to support the default behavior and provide backward + // compatibility. Some will be deprecated, you should avoid calling them. + + /** + * Default implementation of setProperty. Will be called from Project. + * This is the original 1.5 implementation, with calls to the hook + * added. + * + *

    Delegates to the three-arg version, completely ignoring the + * ns parameter.

    + * + * @param ns The namespace for the property (currently not used). + * @param name The name of the property. + * @param value The value to set the property to. + * @param verbose If this is true output extra log messages. + * @return true if the property is set. + * @deprecated namespaces are unnecessary. + */ + public boolean setProperty(String ns, String name, Object value, boolean verbose) { + return setProperty(name, value, verbose); + } + + /** + * Default implementation of setProperty. Will be called from Project. + * @param name The name of the property. + * @param value The value to set the property to. + * @param verbose If this is true output extra log messages. + * @return true if the property is set. + */ + public boolean setProperty(String name, Object value, boolean verbose) { + for (PropertySetter setter : getDelegates(PropertySetter.class)) { + if (setter.set(name, value, this)) { + return true; + } + } + synchronized (this) { + // user (CLI) properties take precedence + if (userProperties.containsKey(name)) { + if (project != null && verbose) { + project.log("Override ignored for user property \"" + + name + "\"", Project.MSG_VERBOSE); + } + return false; + } + if (project != null && verbose) { + if (properties.containsKey(name)) { + project.log("Overriding previous definition of property \"" + + name + "\"", Project.MSG_VERBOSE); + } + project.log("Setting project property: " + name + " -> " + + value, Project.MSG_DEBUG); + } + if (name != null && value != null) { + properties.put(name, value); + } + return true; + } + } + + /** + * Sets a property if no value currently exists. If the property + * exists already, a message is logged and the method returns with + * no other effect. + * + *

    Delegates to the two-arg version, completely ignoring the + * ns parameter.

    + * + * @param ns The namespace for the property (currently not used). + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @since Ant 1.6 + * @deprecated namespaces are unnecessary. + */ + public void setNewProperty(String ns, String name, Object value) { + setNewProperty(name, value); + } + + /** + * Sets a property if no value currently exists. If the property + * exists already, a message is logged and the method returns with + * no other effect. + * + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @since Ant 1.8.0 + */ + public void setNewProperty(String name, Object value) { + for (PropertySetter setter : getDelegates(PropertySetter.class)) { + if (setter.setNew(name, value, this)) { + return; + } + } + synchronized (this) { + if (project != null && properties.containsKey(name)) { + project.log("Override ignored for property \"" + name + + "\"", Project.MSG_VERBOSE); + return; + } + if (project != null) { + project.log("Setting project property: " + name + + " -> " + value, Project.MSG_DEBUG); + } + if (name != null && value != null) { + properties.put(name, value); + } + } + } + + /** + * Sets a user property, which cannot be overwritten by + * set/unset property calls. Any previous value is overwritten. + * + *

    Delegates to the two-arg version, completely ignoring the + * ns parameter.

    + * + * @param ns The namespace for the property (currently not used). + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @deprecated namespaces are unnecessary. + */ + public void setUserProperty(String ns, String name, Object value) { + setUserProperty(name, value); + } + + /** + * Sets a user property, which cannot be overwritten by + * set/unset property calls. Any previous value is overwritten. + * + *

    Does not consult any delegates.

    + * + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + */ + public void setUserProperty(String name, Object value) { + if (project != null) { + project.log("Setting ro project property: " + + name + " -> " + value, Project.MSG_DEBUG); + } + synchronized (this) { + userProperties.put(name, value); + properties.put(name, value); + } + } + + /** + * Sets an inherited user property, which cannot be overwritten by set/unset + * property calls. Any previous value is overwritten. Also marks + * these properties as properties that have not come from the + * command line. + * + *

    Delegates to the two-arg version, completely ignoring the + * ns parameter.

    + * + * @param ns The namespace for the property (currently not used). + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @deprecated namespaces are unnecessary. + */ + public void setInheritedProperty(String ns, String name, Object value) { + setInheritedProperty(name, value); + } + + /** + * Sets an inherited user property, which cannot be overwritten by set/unset + * property calls. Any previous value is overwritten. Also marks + * these properties as properties that have not come from the + * command line. + * + *

    Does not consult any delegates.

    + * + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + */ + public void setInheritedProperty(String name, Object value) { + if (project != null) { + project.log("Setting ro project property: " + name + " -> " + + value, Project.MSG_DEBUG); + } + + synchronized (this) { + inheritedProperties.put(name, value); + userProperties.put(name, value); + properties.put(name, value); + } + } + + // -------------------- Getting properties -------------------- + + /** + * Returns the value of a property, if it is set. You can override + * this method in order to plug your own storage. + * + *

    Delegates to the one-arg version ignoring the ns parameter.

    + * + * @param ns The namespace for the property (currently not used). + * @param name The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + * @deprecated namespaces are unnecessary. + */ + public Object getProperty(String ns, String name) { + return getProperty(name); + } + + /** + * Returns the value of a property, if it is set. + * + *

    This is the method that is invoked by {Project#getProperty + * Project.getProperty}.

    + * + *

    You can override this method in order to plug your own + * storage but the recommended approach is to add your own + * implementation of {@link PropertyEvaluator PropertyEvaluator} + * instead.

    + * + * @param name The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + */ + public Object getProperty(String name) { + if (name == null) { + return null; + } + for (PropertyEvaluator evaluator : getDelegates(PropertyEvaluator.class)) { + final Object o = evaluator.evaluate(name, this); + if (o == null) { + continue; + } + return o instanceof NullReturn ? null : o; + } + return properties.get(name); + } + + /** + * Returns the value of a user property, if it is set. + * + *

    Delegates to the one-arg version ignoring the ns parameter.

    + * + * @param ns The namespace for the property (currently not used). + * @param name The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + * @deprecated namespaces are unnecessary. + */ + public Object getUserProperty(String ns, String name) { + return getUserProperty(name); + } + + /** + * Returns the value of a user property, if it is set. + * + *

    Does not consult any delegates.

    + * + * @param name The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + */ + public Object getUserProperty(String name) { + if (name == null) { + return null; + } + return userProperties.get(name); + } + + // -------------------- Access to property tables -------------------- + // This is used to support ant call and similar tasks. It should be + // deprecated, it is possible to use a better (more efficient) + // mechanism to preserve the context. + + /** + * Returns a copy of the properties table. + * + *

    Does not contain properties held by implementations of + * delegates (like local properties).

    + * + * @return a hashtable containing all properties (including user properties). + */ + public Hashtable getProperties() { + //avoid concurrent modification: + synchronized (properties) { + return new Hashtable(properties); + } + // There is a better way to save the context. This shouldn't + // delegate to next, it's for backward compatibility only. + } + + /** + * Returns a copy of the user property hashtable + * + *

    Does not contain properties held by implementations of + * delegates (like local properties).

    + * + * @return a hashtable containing just the user properties + */ + public Hashtable getUserProperties() { + //avoid concurrent modification: + synchronized (userProperties) { + return new Hashtable(userProperties); + } + } + + /** + * Returns a copy of the inherited property hashtable + * + *

    Does not contain properties held by implementations of + * delegates (like local properties).

    + * + * @return a hashtable containing just the inherited properties + */ + public Hashtable getInheritedProperties() { + //avoid concurrent modification: + synchronized (inheritedProperties) { + return new Hashtable(inheritedProperties); + } + } + + /** + * special back door for subclasses, internal access to the hashtables + * @return the live hashtable of all properties + */ + protected Hashtable getInternalProperties() { + return properties; + } + + /** + * special back door for subclasses, internal access to the hashtables + * + * @return the live hashtable of user properties + */ + protected Hashtable getInternalUserProperties() { + return userProperties; + } + + /** + * special back door for subclasses, internal access to the hashtables + * + * @return the live hashtable inherited properties + */ + protected Hashtable getInternalInheritedProperties() { + return inheritedProperties; + } + + /** + * Copies all user properties that have not been set on the + * command line or a GUI tool from this instance to the Project + * instance given as the argument. + * + *

    To copy all "user" properties, you will also have to call + * {@link #copyUserProperties copyUserProperties}.

    + * + *

    Does not copy properties held by implementations of + * delegates (like local properties).

    + * + * @param other the project to copy the properties to. Must not be null. + * + * @since Ant 1.6 + */ + public void copyInheritedProperties(Project other) { + //avoid concurrent modification: + synchronized (inheritedProperties) { + Enumeration e = inheritedProperties.keys(); + while (e.hasMoreElements()) { + String arg = e.nextElement().toString(); + if (other.getUserProperty(arg) != null) { + continue; + } + Object value = inheritedProperties.get(arg); + other.setInheritedProperty(arg, value.toString()); + } + } + } + + /** + * Copies all user properties that have been set on the command + * line or a GUI tool from this instance to the Project instance + * given as the argument. + * + *

    To copy all "user" properties, you will also have to call + * {@link #copyInheritedProperties copyInheritedProperties}.

    + * + *

    Does not copy properties held by implementations of + * delegates (like local properties).

    + * + * @param other the project to copy the properties to. Must not be null. + * + * @since Ant 1.6 + */ + public void copyUserProperties(Project other) { + //avoid concurrent modification: + synchronized (userProperties) { + Enumeration e = userProperties.keys(); + while (e.hasMoreElements()) { + Object arg = e.nextElement(); + if (inheritedProperties.containsKey(arg)) { + continue; + } + Object value = userProperties.get(arg); + other.setUserProperty(arg.toString(), value.toString()); + } + } + } + + // -------------------- Property parsing -------------------- + // Moved from ProjectHelper. You can override the static method - + // this is used for backward compatibility (for code that calls + // the parse method in ProjectHelper). + + /** + * Default parsing method. It is here only to support backward compatibility + * for the static ProjectHelper.parsePropertyString(). + */ + static void parsePropertyStringDefault(String value, Vector fragments, Vector propertyRefs) + throws BuildException { + int prev = 0; + int pos; + //search for the next instance of $ from the 'prev' position + while ((pos = value.indexOf("$", prev)) >= 0) { + + //if there was any text before this, add it as a fragment + //TODO, this check could be modified to go if pos>prev; + //seems like this current version could stick empty strings + //into the list + if (pos > 0) { + fragments.addElement(value.substring(prev, pos)); + } + //if we are at the end of the string, we tack on a $ + //then move past it + if (pos == (value.length() - 1)) { + fragments.addElement("$"); + prev = pos + 1; + } else if (value.charAt(pos + 1) != '{') { + //peek ahead to see if the next char is a property or not + //not a property: insert the char as a literal + /* + fragments.addElement(value.substring(pos + 1, pos + 2)); + prev = pos + 2; + */ + if (value.charAt(pos + 1) == '$') { + //backwards compatibility two $ map to one mode + fragments.addElement("$"); + prev = pos + 2; + } else { + //new behaviour: $X maps to $X for all values of X!='$' + fragments.addElement(value.substring(pos, pos + 2)); + prev = pos + 2; + } + } else { + //property found, extract its name or bail on a typo + int endName = value.indexOf('}', pos); + if (endName < 0) { + throw new BuildException("Syntax error in property: " + value); + } + String propertyName = value.substring(pos + 2, endName); + fragments.addElement(null); + propertyRefs.addElement(propertyName); + prev = endName + 1; + } + } + //no more $ signs found + //if there is any tail to the file, append it + if (prev < value.length()) { + fragments.addElement(value.substring(prev)); + } + } + + /** + * Add the specified delegate object to this PropertyHelper. + * Delegates are processed in LIFO order. + * @param delegate the delegate to add. + * @since Ant 1.8.0 + */ + public void add(Delegate delegate) { + synchronized (delegates) { + for (Class key : getDelegateInterfaces(delegate)) { + List list = delegates.get(key); + if (list == null) { + list = new ArrayList(); + } else { + //copy on write, top priority + list = new ArrayList(list); + list.remove(delegate); + } + list.add(0, delegate); + delegates.put(key, Collections.unmodifiableList(list)); + } + } + } + + /** + * Get the Collection of delegates of the specified type. + * + * @param type + * delegate type. + * @return Collection. + * @since Ant 1.8.0 + */ + protected List getDelegates(Class type) { + @SuppressWarnings("unchecked") + final List result = (List) delegates.get(type); + return result == null ? Collections. emptyList() : result; + } + + /** + * Get all Delegate interfaces (excluding Delegate itself) from the specified Delegate. + * @param d the Delegate to inspect. + * @return Set<Class> + * @since Ant 1.8.0 + */ + protected static Set> getDelegateInterfaces(Delegate d) { + final HashSet> result = new HashSet>(); + Class c = d.getClass(); + while (c != null) { + Class[] ifs = c.getInterfaces(); + for (int i = 0; i < ifs.length; i++) { + if (Delegate.class.isAssignableFrom(ifs[i])) { + @SuppressWarnings("unchecked") + final Class delegateInterface = (Class) ifs[i]; + result.add(delegateInterface); + } + } + c = c.getSuperclass(); + } + result.remove(Delegate.class); + return result; + } + + /** + * If the given object can be interpreted as a true/false value, + * turn it into a matching Boolean - otherwise return null. + * @since Ant 1.8.0 + */ + public static Boolean toBoolean(Object value) { + if (value instanceof Boolean) { + return (Boolean) value; + } + if (value instanceof String) { + String s = (String) value; + if (Project.toBoolean(s)) { + return Boolean.TRUE; + } + if ("off".equalsIgnoreCase(s) + || "false".equalsIgnoreCase(s) + || "no".equalsIgnoreCase(s)) { + return Boolean.FALSE; + } + } + return null; + } + + /** + * Returns true if the object is null or an empty string. + * + * @since Ant 1.8.0 + */ + private static boolean nullOrEmpty(Object value) { + return value == null || "".equals(value); + + } + + /** + * Returns true if the value can be interpreted as a true value or + * cannot be interpreted as a false value and a property of the + * value's name exists. + * @since Ant 1.8.0 + */ + private boolean evalAsBooleanOrPropertyName(Object value) { + Boolean b = toBoolean(value); + if (b != null) { + return b.booleanValue(); + } + return getProperty(String.valueOf(value)) != null; + } + + /** + * Returns true if the value is null or an empty string, can be + * interpreted as a true value or cannot be interpreted as a false + * value and a property of the value's name exists. + * @since Ant 1.8.0 + */ + public boolean testIfCondition(Object value) { + return nullOrEmpty(value) || evalAsBooleanOrPropertyName(value); + } + + /** + * Returns true if the value is null or an empty string, can be + * interpreted as a false value or cannot be interpreted as a true + * value and a property of the value's name doesn't exist. + * @since Ant 1.8.0 + */ + public boolean testUnlessCondition(Object value) { + return nullOrEmpty(value) || !evalAsBooleanOrPropertyName(value); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/RuntimeConfigurable.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/RuntimeConfigurable.java new file mode 100644 index 00000000..26f68dfe --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/RuntimeConfigurable.java @@ -0,0 +1,608 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; + +import org.apache.tools.ant.attribute.EnableAttribute; +import org.apache.tools.ant.taskdefs.MacroDef.Attribute; +import org.apache.tools.ant.taskdefs.MacroInstance; +import org.apache.tools.ant.util.CollectionUtils; +import org.xml.sax.AttributeList; +import org.xml.sax.helpers.AttributeListImpl; + +/** + * Wrapper class that holds the attributes of an element, its children, and + * any text within it. It then takes care of configuring that element at + * runtime. + */ +public class RuntimeConfigurable implements Serializable { + + /** Serialization version */ + private static final long serialVersionUID = 1L; + + /** Empty Hashtable. */ + private static final Hashtable EMPTY_HASHTABLE = + new Hashtable(0); + + /** Name of the element to configure. */ + private String elementTag = null; + + /** List of child element wrappers. */ + private List children = null; + + /** The element to configure. It is only used during + * maybeConfigure. + */ + private transient Object wrappedObject = null; + + /** + * XML attributes for the element. + * @deprecated since 1.6.x + */ + private transient AttributeList attributes; + + // The following is set to true if any of the attributes are namespaced + private transient boolean namespacedAttribute = false; + + /** Attribute names and values. While the XML spec doesn't require + * preserving the order ( AFAIK ), some ant tests do rely on the + * exact order. + * The only exception to this order is the treatment of + * refid. A number of datatypes check if refid is set + * when other attributes are set. This check will not + * work if the build script has the other attribute before + * the "refid" attribute, so now (ANT 1.7) the refid + * attribute will be processed first. + */ + private LinkedHashMap attributeMap = null; + + /** Text appearing within the element. */ + private StringBuffer characters = null; + + /** Indicates if the wrapped object has been configured */ + private boolean proxyConfigured = false; + + /** the polymorphic type */ + private String polyType = null; + + /** the "id" of this Element if it has one */ + private String id = null; + + /** + * Sole constructor creating a wrapper for the specified object. + * + * @param proxy The element to configure. Must not be null. + * @param elementTag The tag name generating this element. + */ + public RuntimeConfigurable(Object proxy, String elementTag) { + setProxy(proxy); + setElementTag(elementTag); + // Most likely an UnknownElement + if (proxy instanceof Task) { + ((Task) proxy).setRuntimeConfigurableWrapper(this); + } + } + + /** + * Sets the element to configure. + * + * @param proxy The element to configure. Must not be null. + */ + public synchronized void setProxy(Object proxy) { + wrappedObject = proxy; + proxyConfigured = false; + } + + private static class EnableAttributeConsumer { + public void add(EnableAttribute b) { + // Ignore + } + } + + /** + * contains the attribute component name and boolean restricted set to true when + * the attribute is in one of the name spaces managed by ant (if and unless currently) + * @since Ant 1.9.3 + */ + private static class AttributeComponentInformation { + String componentName; + boolean restricted; + + private AttributeComponentInformation(String componentName, boolean restricted) { + this.componentName = componentName; + this.restricted = restricted; + } + + public String getComponentName() { + return componentName; + } + + public boolean isRestricted() { + return restricted; + } + } + + /** + * + * @param name the name of the attribute. + * @param componentHelper current component helper + * @return AttributeComponentInformation instance + */ + private AttributeComponentInformation isRestrictedAttribute(String name, ComponentHelper componentHelper) { + if (name.indexOf(':') == -1) { + return new AttributeComponentInformation(null, false); + } + String componentName = attrToComponent(name); + String ns = ProjectHelper.extractUriFromComponentName(componentName); + if (componentHelper.getRestrictedDefinitions( + ProjectHelper.nsToComponentName(ns)) == null) { + return new AttributeComponentInformation(null, false); + } + return new AttributeComponentInformation(componentName, true); + } + + /** + * Check if an UE is enabled. + * This looks tru the attributes and checks if there + * are any Ant attributes, and if so, the method calls the + * isEnabled() method on them. + * @param owner the UE that owns this RC. + * @return true if enabled, false if any of the ant attribures return + * false. + * @since 1.9.1 + */ + public boolean isEnabled(UnknownElement owner) { + if (!namespacedAttribute) { + return true; + } + ComponentHelper componentHelper = ComponentHelper + .getComponentHelper(owner.getProject()); + + IntrospectionHelper ih + = IntrospectionHelper.getHelper( + owner.getProject(), EnableAttributeConsumer.class); + for (int i = 0; i < attributeMap.keySet().size(); ++i) { + String name = (String) attributeMap.keySet().toArray()[i]; + AttributeComponentInformation attributeComponentInformation = isRestrictedAttribute(name, componentHelper); + if (!attributeComponentInformation.isRestricted()) { + continue; + } + String value = (String) attributeMap.get(name); + EnableAttribute enable = null; + try { + enable = (EnableAttribute) + ih.createElement( + owner.getProject(), new EnableAttributeConsumer(), + attributeComponentInformation.getComponentName()); + } catch (BuildException ex) { + throw new BuildException( + "Unsupported attribute " + attributeComponentInformation.getComponentName()); + } + if (enable == null) { + continue; + } + value = owner.getProject().replaceProperties(value); // FixMe: need to make config + if (!enable.isEnabled(owner, value)) { + return false; + } + } + return true; + } + + private String attrToComponent(String a) { + // need to remove the prefix + int p1 = a.lastIndexOf(':'); + int p2 = a.lastIndexOf(':', p1 - 1); + return a.substring(0, p2) + a.substring(p1); + } + + /** + * Sets the creator of the element to be configured + * used to store the element in the parent. + * + * @param creator the creator object. + */ + synchronized void setCreator(IntrospectionHelper.Creator creator) { + } + + /** + * Get the object for which this RuntimeConfigurable holds the configuration + * information. + * + * @return the object whose configure is held by this instance. + */ + public synchronized Object getProxy() { + return wrappedObject; + } + + /** + * Returns the id for this element. + * @return the id. + */ + public synchronized String getId() { + return id; + } + + /** + * Get the polymorphic type for this element. + * @return the ant component type name, null if not set. + */ + public synchronized String getPolyType() { + return polyType; + } + + /** + * Set the polymorphic type for this element. + * @param polyType the ant component type name, null if not set. + */ + public synchronized void setPolyType(String polyType) { + this.polyType = polyType; + } + + /** + * Sets the attributes for the wrapped element. + * + * @deprecated since 1.6.x. + * @param attributes List of attributes defined in the XML for this + * element. May be null. + */ + public synchronized void setAttributes(AttributeList attributes) { + this.attributes = new AttributeListImpl(attributes); + for (int i = 0; i < attributes.getLength(); i++) { + setAttribute(attributes.getName(i), attributes.getValue(i)); + } + } + + /** + * Set an attribute to a given value. + * + * @param name the name of the attribute. + * @param value the attribute's value. + */ + public synchronized void setAttribute(String name, String value) { + if (name.indexOf(':') != -1) { + namespacedAttribute = true; + } + setAttribute(name, (Object) value); + } + + /** + * Set an attribute to a given value. + * + * @param name the name of the attribute. + * @param value the attribute's value. + * @since 1.9 + */ + public synchronized void setAttribute(String name, Object value) { + if (name.equalsIgnoreCase(ProjectHelper.ANT_TYPE)) { + this.polyType = value == null ? null : value.toString(); + } else { + if (attributeMap == null) { + attributeMap = new LinkedHashMap(); + } + if (name.equalsIgnoreCase("refid") && !attributeMap.isEmpty()) { + LinkedHashMap newAttributeMap = new LinkedHashMap(); + newAttributeMap.put(name, value); + newAttributeMap.putAll(attributeMap); + attributeMap = newAttributeMap; + } else { + attributeMap.put(name, value); + } + if (name.equals("id")) { + this.id = value == null ? null : value.toString(); + } + } + } + + /** + * Delete an attribute. Not for the faint of heart. + * @param name the name of the attribute to be removed. + */ + public synchronized void removeAttribute(String name) { + attributeMap.remove(name); + } + + /** + * Return the attribute map. + * + * @return Attribute name to attribute value map. + * @since Ant 1.6 + */ + public synchronized Hashtable getAttributeMap() { + return (attributeMap == null) + ? EMPTY_HASHTABLE : new Hashtable(attributeMap); + } + + /** + * Returns the list of attributes for the wrapped element. + * + * @deprecated Deprecated since Ant 1.6 in favor of {@link #getAttributeMap}. + * @return An AttributeList representing the attributes defined in the + * XML for this element. May be null. + */ + public synchronized AttributeList getAttributes() { + return attributes; + } + + /** + * Adds a child element to the wrapped element. + * + * @param child The child element wrapper to add to this one. + * Must not be null. + */ + public synchronized void addChild(RuntimeConfigurable child) { + children = (children == null) ? new ArrayList() : children; + children.add(child); + } + + /** + * Returns the child wrapper at the specified position within the list. + * + * @param index The index of the child to return. + * + * @return The child wrapper at position index within the + * list. + */ + synchronized RuntimeConfigurable getChild(int index) { + return children.get(index); + } + + /** + * Returns an enumeration of all child wrappers. + * @return an enumeration of the child wrappers. + * @since Ant 1.6 + */ + public synchronized Enumeration getChildren() { + return (children == null) ? new CollectionUtils.EmptyEnumeration() + : Collections.enumeration(children); + } + + /** + * Adds characters from #PCDATA areas to the wrapped element. + * + * @param data Text to add to the wrapped element. + * Should not be null. + */ + public synchronized void addText(String data) { + if (data.length() == 0) { + return; + } + characters = (characters == null) + ? new StringBuffer(data) : characters.append(data); + } + + /** + * Adds characters from #PCDATA areas to the wrapped element. + * + * @param buf A character array of the text within the element. + * Must not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + * + */ + public synchronized void addText(char[] buf, int start, int count) { + if (count == 0) { + return; + } + characters = ((characters == null) + ? new StringBuffer(count) : characters).append(buf, start, count); + } + + /** + * Get the text content of this element. Various text chunks are + * concatenated, there is no way ( currently ) of keeping track of + * multiple fragments. + * + * @return the text content of this element. + * @since Ant 1.6 + */ + public synchronized StringBuffer getText() { + return (characters == null) ? new StringBuffer(0) : characters; + } + + /** + * Set the element tag. + * @param elementTag The tag name generating this element. + */ + public synchronized void setElementTag(String elementTag) { + this.elementTag = elementTag; + } + + /** + * Returns the tag name of the wrapped element. + * + * @return The tag name of the wrapped element. This is unlikely + * to be null, but may be. + */ + public synchronized String getElementTag() { + return elementTag; + } + + /** + * Configures the wrapped element and all its children. + * The attributes and text for the wrapped element are configured, + * and then each child is configured and added. Each time the + * wrapper is configured, the attributes and text for it are + * reset. + * + * If the element has an id attribute, a reference + * is added to the project as well. + * + * @param p The project containing the wrapped element. + * Must not be null. + * + * @exception BuildException if the configuration fails, for instance due + * to invalid attributes or children, or text being added to + * an element which doesn't accept it. + */ + public void maybeConfigure(Project p) throws BuildException { + maybeConfigure(p, true); + } + + /** + * Configures the wrapped element. The attributes and text for + * the wrapped element are configured. Each time the wrapper is + * configured, the attributes and text for it are reset. + * + * If the element has an id attribute, a reference + * is added to the project as well. + * + * @param p The project containing the wrapped element. + * Must not be null. + * + * @param configureChildren ignored. + + * + * @exception BuildException if the configuration fails, for instance due + * to invalid attributes , or text being added to + * an element which doesn't accept it. + */ + public synchronized void maybeConfigure(Project p, boolean configureChildren) + throws BuildException { + + if (proxyConfigured) { + return; + } + + // Configure the object + Object target = (wrappedObject instanceof TypeAdapter) + ? ((TypeAdapter) wrappedObject).getProxy() : wrappedObject; + + IntrospectionHelper ih = + IntrospectionHelper.getHelper(p, target.getClass()); + ComponentHelper componentHelper = ComponentHelper.getComponentHelper(p); + if (attributeMap != null) { + for (Entry entry : attributeMap.entrySet()) { + String name = entry.getKey(); + // skip restricted attributes such as if:set + AttributeComponentInformation attributeComponentInformation = isRestrictedAttribute(name, componentHelper); + if (attributeComponentInformation.isRestricted()) { + continue; + } + Object value = entry.getValue(); + // reflect these into the target, defer for + // MacroInstance where properties are expanded for the + // nested sequential + Object attrValue; + if (value instanceof Evaluable) { + attrValue = ((Evaluable) value).eval(); + } else { + attrValue = PropertyHelper.getPropertyHelper(p).parseProperties(value.toString()); + } + if (target instanceof MacroInstance) { + for (Attribute attr : ((MacroInstance) target).getMacroDef().getAttributes()) { + if (attr.getName().equals(name)) { + if (!attr.isDoubleExpanding()) { + attrValue = value; + } + break; + } + } + } + try { + ih.setAttribute(p, target, name, attrValue); + } catch (UnsupportedAttributeException be) { + // id attribute must be set externally + if (name.equals("id")) { + // Do nothing + } else if (getElementTag() == null) { + throw be; + } else { + throw new BuildException( + getElementTag() + " doesn't support the \"" + + be.getAttribute() + "\" attribute", be); + } + } catch (BuildException be) { + if (name.equals("id")) { + // Assume that this is an not supported attribute type + // thrown for example by a dymanic attribute task + // Do nothing + } else { + throw be; + } + } + } + } + + if (characters != null) { + ProjectHelper.addText(p, wrappedObject, characters.substring(0)); + } + + if (id != null) { + p.addReference(id, wrappedObject); + } + proxyConfigured = true; + } + + /** + * Reconfigure the element, even if it has already been configured. + * + * @param p the project instance for this configuration. + */ + public void reconfigure(Project p) { + proxyConfigured = false; + maybeConfigure(p); + } + + /** + * Apply presets, attributes and text are set if not currently set. + * Nested elements are prepended. + * + * @param r a RuntimeConfigurable value. + */ + public void applyPreSet(RuntimeConfigurable r) { + // Attributes + if (r.attributeMap != null) { + for (String name : r.attributeMap.keySet()) { + if (attributeMap == null || attributeMap.get(name) == null) { + setAttribute(name, (String) r.attributeMap.get(name)); + } + } + } + // poly type + + polyType = (polyType == null) ? r.polyType : polyType; + + // Children (this is a shadow of UnknownElement#children) + if (r.children != null) { + List newChildren = new ArrayList(); + newChildren.addAll(r.children); + if (children != null) { + newChildren.addAll(children); + } + children = newChildren; + } + + // Text + if (r.characters != null) { + if (characters == null + || characters.toString().trim().length() == 0) { + characters = new StringBuffer(r.characters.toString()); + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/SubBuildListener.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/SubBuildListener.java new file mode 100644 index 00000000..196a88b5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/SubBuildListener.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Instances of classes that implement this interface can register + * to be also notified when things happened during a subbuild. + * + *

    A subbuild is a separate project instance created by the + * <ant> task family. These project instances will + * never fire the buildStarted and buildFinished events, but they will + * fire subBuildStarted/ and subBuildFinished. The main project + * instance - the one created by running Ant in the first place - will + * never invoke one of the methods of this interface.

    + * + * @see BuildEvent + * @see Project#addBuildListener(BuildListener) + * + * @since Ant 1.6.2 + */ +public interface SubBuildListener extends BuildListener { + + /** + * Signals that a subbuild has started. This event + * is fired before any targets have started. + * + * @param event An event with any relevant extra information. + * Must not be null. + */ + void subBuildStarted(BuildEvent event); + + /** + * Signals that the last target has finished. This event + * will still be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be null. + * + * @see BuildEvent#getException() + */ + void subBuildFinished(BuildEvent event); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Target.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Target.java new file mode 100644 index 00000000..796b7e18 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Target.java @@ -0,0 +1,532 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.List; +import java.util.StringTokenizer; + +import org.apache.tools.ant.property.LocalProperties; +import org.apache.tools.ant.taskdefs.condition.And; +import org.apache.tools.ant.taskdefs.condition.Condition; +import org.apache.tools.ant.taskdefs.condition.Or; + +/** + * Class to implement a target object with required parameters. + * + *

    If you are creating Targets programmatically, make sure you set + * the Location to a useful value. In particular all targets should + * have different location values.

    + */ +public class Target implements TaskContainer { + + /** Name of this target. */ + private String name; + + /** The "if" condition to test on execution. */ + private String ifString = ""; + + /** The "unless" condition to test on execution. */ + private String unlessString = ""; + + private Condition ifCondition; + + private Condition unlessCondition; + + /** List of targets this target is dependent on. */ + private List dependencies = null; + + /** Children of this target (tasks and data types). */ + private List children = new ArrayList(); + + /** Since Ant 1.6.2 */ + private Location location = Location.UNKNOWN_LOCATION; + + /** Project this target belongs to. */ + private Project project; + + /** Description of this target, if any. */ + private String description = null; + + /** Default constructor. */ + public Target() { + //empty + } + + /** + * Cloning constructor. + * @param other the Target to clone. + */ + public Target(Target other) { + this.name = other.name; + this.ifString = other.ifString; + this.unlessString = other.unlessString; + this.ifCondition = other.ifCondition; + this.unlessCondition = other.unlessCondition; + this.dependencies = other.dependencies; + this.location = other.location; + this.project = other.project; + this.description = other.description; + // The children are added to after this cloning + this.children = other.children; + } + + /** + * Sets the project this target belongs to. + * + * @param project The project this target belongs to. + * Must not be null. + */ + public void setProject(Project project) { + this.project = project; + } + + /** + * Returns the project this target belongs to. + * + * @return The project this target belongs to, or null if + * the project has not been set yet. + */ + public Project getProject() { + return project; + } + + /** + * Sets the location of this target's definition. + * + * @param location Location + * @since 1.6.2 + */ + public void setLocation(Location location) { + this.location = location; + } + + /** + * Get the location of this target's definition. + * + * @return Location + * @since 1.6.2 + */ + public Location getLocation() { + return location; + } + + /** + * Sets the list of targets this target is dependent on. + * The targets themselves are not resolved at this time. + * + * @param depS A comma-separated list of targets this target + * depends on. Must not be null. + */ + public void setDepends(String depS) { + for (String dep : parseDepends(depS, getName(), "depends")) { + addDependency(dep); + } + } + + public static List parseDepends(String depends, + String targetName, + String attributeName) { + List list = new ArrayList(); + if (depends.length() > 0) { + StringTokenizer tok = + new StringTokenizer(depends, ",", true); + while (tok.hasMoreTokens()) { + String token = tok.nextToken().trim(); + + // Make sure the dependency is not empty string + if ("".equals(token) || ",".equals(token)) { + throw new BuildException("Syntax Error: " + + attributeName + + " attribute of target \"" + + targetName + + "\" contains an empty string."); + } + + list.add(token); + + // Make sure that depends attribute does not + // end in a , + if (tok.hasMoreTokens()) { + token = tok.nextToken(); + if (!tok.hasMoreTokens() || !",".equals(token)) { + throw new BuildException("Syntax Error: " + + attributeName + + " attribute for target \"" + + targetName + + "\" ends with a \",\" " + + "character"); + } + } + } + } + return list; + } + + /** + * Sets the name of this target. + * + * @param name The name of this target. Should not be null. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Returns the name of this target. + * + * @return the name of this target, or null if the + * name has not been set yet. + */ + public String getName() { + return name; + } + + /** + * Adds a task to this target. + * + * @param task The task to be added. Must not be null. + */ + public void addTask(Task task) { + children.add(task); + } + + /** + * Adds the wrapper for a data type element to this target. + * + * @param r The wrapper for the data type element to be added. + * Must not be null. + */ + public void addDataType(RuntimeConfigurable r) { + children.add(r); + } + + /** + * Returns the current set of tasks to be executed by this target. + * + * @return an array of the tasks currently within this target + */ + public Task[] getTasks() { + List tasks = new ArrayList(children.size()); + for (Object o : children) { + if (o instanceof Task) { + tasks.add((Task) o); + } + } + return tasks.toArray(new Task[tasks.size()]); + } + + /** + * Adds a dependency to this target. + * + * @param dependency The name of a target this target is dependent on. + * Must not be null. + */ + public void addDependency(String dependency) { + if (dependencies == null) { + dependencies = new ArrayList(2); + } + dependencies.add(dependency); + } + + /** + * Returns an enumeration of the dependencies of this target. + * + * @return an enumeration of the dependencies of this target (enumeration of String) + */ + public Enumeration getDependencies() { + return Collections + .enumeration(dependencies == null ? Collections. emptyList() : dependencies); + } + + /** + * Does this target depend on the named target? + * @param other the other named target. + * @return true if the target does depend on the named target + * @since Ant 1.6 + */ + public boolean dependsOn(String other) { + Project p = getProject(); + Hashtable t = p == null ? null : p.getTargets(); + return p != null && p.topoSort(getName(), t, false).contains(t.get(other)); + } + + /** + * Sets the "if" condition to test on execution. This is the + * name of a property to test for existence - if the property + * is not set, the task will not execute. The property goes + * through property substitution once before testing, so if + * property foo has value bar, setting + * the "if" condition to ${foo}_x will mean that the + * task will only execute if property bar_x is set. + * + * @param property The property condition to test on execution. + * May be null, in which case + * no "if" test is performed. + */ + public void setIf(String property) { + ifString = property == null ? "" : property; + setIf(new IfStringCondition(ifString)); + } + + /** + * Returns the "if" property condition of this target. + * + * @return the "if" property condition or null if no + * "if" condition had been defined. + * @since 1.6.2 + */ + public String getIf() { + return "".equals(ifString) ? null : ifString; + } + + /** + * Same as {@link #setIf(String)} but requires a {@link Condition} instance + * + * @since 1.9 + */ + public void setIf(Condition condition) { + if (ifCondition == null) { + ifCondition = condition; + } else { + And andCondition = new And(); + andCondition.setProject(getProject()); + andCondition.setLocation(getLocation()); + andCondition.add(ifCondition); + andCondition.add(condition); + ifCondition = andCondition; + } + } + + /** + * Sets the "unless" condition to test on execution. This is the + * name of a property to test for existence - if the property + * is set, the task will not execute. The property goes + * through property substitution once before testing, so if + * property foo has value bar, setting + * the "unless" condition to ${foo}_x will mean that the + * task will only execute if property bar_x isn't set. + * + * @param property The property condition to test on execution. + * May be null, in which case + * no "unless" test is performed. + */ + public void setUnless(String property) { + unlessString = property == null ? "" : property; + setUnless(new UnlessStringCondition(unlessString)); + } + + /** + * Returns the "unless" property condition of this target. + * + * @return the "unless" property condition or null + * if no "unless" condition had been defined. + * @since 1.6.2 + */ + public String getUnless() { + return "".equals(unlessString) ? null : unlessString; + } + + /** + * Same as {@link #setUnless(String)} but requires a {@link Condition} instance + * + * @since 1.9 + */ + public void setUnless(Condition condition) { + if (unlessCondition == null) { + unlessCondition = condition; + } else { + Or orCondition = new Or(); + orCondition.setProject(getProject()); + orCondition.setLocation(getLocation()); + orCondition.add(unlessCondition); + orCondition.add(condition); + unlessCondition = orCondition; + } + } + + /** + * Sets the description of this target. + * + * @param description The description for this target. + * May be null, indicating that no + * description is available. + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Returns the description of this target. + * + * @return the description of this target, or null if no + * description is available. + */ + public String getDescription() { + return description; + } + + /** + * Returns the name of this target. + * + * @return the name of this target, or null if the + * name has not been set yet. + */ + public String toString() { + return name; + } + + /** + * Executes the target if the "if" and "unless" conditions are + * satisfied. Dependency checking should be done before calling this + * method, as it does no checking of its own. If either the "if" + * or "unless" test prevents this target from being executed, a verbose + * message is logged giving the reason. It is recommended that clients + * of this class call performTasks rather than this method so that + * appropriate build events are fired. + * + * @exception BuildException if any of the tasks fail or if a data type + * configuration fails. + * + * @see #performTasks() + * @see #setIf(String) + * @see #setUnless(String) + */ + public void execute() throws BuildException { + if (ifCondition != null && !ifCondition.eval()) { + project.log(this, "Skipped because property '" + project.replaceProperties(ifString) + + "' not set.", Project.MSG_VERBOSE); + return; + } + if (unlessCondition != null && unlessCondition.eval()) { + project.log(this, "Skipped because property '" + + project.replaceProperties(unlessString) + "' set.", Project.MSG_VERBOSE); + return; + } + LocalProperties localProperties = LocalProperties.get(getProject()); + localProperties.enterScope(); + try { + // use index-based approach to avoid ConcurrentModificationExceptions; + // also account for growing target children + // do not optimize this loop by replacing children.size() by a variable + // as children can be added dynamically as in RhinoScriptTest where a target is adding work for itself + for (int i = 0; i < children.size(); i++) { + Object o = children.get(i); + if (o instanceof Task) { + Task task = (Task) o; + task.perform(); + } else { + ((RuntimeConfigurable) o).maybeConfigure(project); + } + } + } finally { + localProperties.exitScope(); + } + } + + /** + * Performs the tasks within this target (if the conditions are met), + * firing target started/target finished messages around a call to + * execute. + * + * @see #execute() + */ + public final void performTasks() { + RuntimeException thrown = null; + project.fireTargetStarted(this); + try { + execute(); + } catch (RuntimeException exc) { + thrown = exc; + throw exc; + } finally { + project.fireTargetFinished(this, thrown); + } + } + + /** + * Replaces all occurrences of the given task in the list + * of children with the replacement data type wrapper. + * + * @param el The task to replace. + * Must not be null. + * @param o The data type wrapper to replace el with. + */ + void replaceChild(Task el, RuntimeConfigurable o) { + int index; + while ((index = children.indexOf(el)) >= 0) { + children.set(index, o); + } + } + + /** + * Replaces all occurrences of the given task in the list + * of children with the replacement task. + * + * @param el The task to replace. + * Must not be null. + * @param o The task to replace el with. + */ + void replaceChild(Task el, Task o) { + int index; + while ((index = children.indexOf(el)) >= 0) { + children.set(index, o); + } + } + + /** + * Condition evaluating the 'if' attribute with the PropertyHelper. + */ + private class IfStringCondition implements Condition { + + private String condition; + + public IfStringCondition(String condition) { + this.condition = condition; + } + + public boolean eval() throws BuildException { + PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper(getProject()); + Object o = propertyHelper.parseProperties(condition); + return propertyHelper.testIfCondition(o); + } + + } + + /** + * Condition evaluating the 'unless' attribute with the PropertyHelper. + */ + private class UnlessStringCondition implements Condition { + + private String condition; + + public UnlessStringCondition(String condition) { + this.condition = condition; + } + + public boolean eval() throws BuildException { + PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper(getProject()); + Object o = propertyHelper.parseProperties(condition); + return !propertyHelper.testUnlessCondition(o); + } + + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Task.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Task.java new file mode 100644 index 00000000..0d08eb0e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/Task.java @@ -0,0 +1,481 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.IOException; +import java.util.Enumeration; + +import org.apache.tools.ant.dispatch.DispatchUtils; + +/** + * Base class for all tasks. + * + * Use Project.createTask to create a new task instance rather than + * using this class directly for construction. + * + * @see Project#createTask + */ +public abstract class Task extends ProjectComponent { + // CheckStyle:VisibilityModifier OFF - bc + /** + * Target this task belongs to, if any. + * @deprecated since 1.6.x. + * You should not be accessing this variable directly. + * Please use the {@link #getOwningTarget()} method. + */ + protected Target target; + + /** + * Name of this task to be used for logging purposes. + * This defaults to the same as the type, but may be + * overridden by the user. For instance, the name "java" + * isn't terribly descriptive for a task used within + * another task - the outer task code can probably + * provide a better one. + * @deprecated since 1.6.x. + * You should not be accessing this variable directly. + * Please use the {@link #getTaskName()} method. + */ + protected String taskName; + + /** + * Type of this task. + * + * @deprecated since 1.6.x. + * You should not be accessing this variable directly. + * Please use the {@link #getTaskType()} method. + */ + protected String taskType; + + /** + * Wrapper for this object, used to configure it at runtime. + * + * @deprecated since 1.6.x. + * You should not be accessing this variable directly. + * Please use the {@link #getWrapper()} method. + */ + protected RuntimeConfigurable wrapper; + + // CheckStyle:VisibilityModifier ON + + /** + * Whether or not this task is invalid. A task becomes invalid + * if a conflicting class is specified as the implementation for + * its type. + */ + private boolean invalid; + + /** Sole constructor. */ + public Task() { + } + + /** + * Sets the target container of this task. + * + * @param target Target in whose scope this task belongs. + * May be null, indicating a top-level task. + */ + public void setOwningTarget(Target target) { + this.target = target; + } + + /** + * Returns the container target of this task. + * + * @return The target containing this task, or null if + * this task is a top-level task. + */ + public Target getOwningTarget() { + return target; + } + + /** + * Sets the name to use in logging messages. + * + * @param name The name to use in logging messages. + * Should not be null. + */ + public void setTaskName(String name) { + this.taskName = name; + } + + /** + * Returns the name to use in logging messages. + * + * @return the name to use in logging messages. + */ + public String getTaskName() { + return taskName; + } + + /** + * Sets the name with which the task has been invoked. + * + * @param type The name the task has been invoked as. + * Should not be null. + */ + public void setTaskType(String type) { + this.taskType = type; + } + + /** + * Called by the project to let the task initialize properly. + * The default implementation is a no-op. + * + * @exception BuildException if something goes wrong with the build + */ + public void init() throws BuildException { + } + + /** + * Called by the project to let the task do its work. This method may be + * called more than once, if the task is invoked more than once. + * For example, + * if target1 and target2 both depend on target3, then running + * "ant target1 target2" will run all tasks in target3 twice. + * + * @exception BuildException if something goes wrong with the build. + */ + public void execute() throws BuildException { + } + + /** + * Returns the wrapper used for runtime configuration. + * + * @return the wrapper used for runtime configuration. This + * method will generate a new wrapper (and cache it) + * if one isn't set already. + */ + public RuntimeConfigurable getRuntimeConfigurableWrapper() { + if (wrapper == null) { + wrapper = new RuntimeConfigurable(this, getTaskName()); + } + return wrapper; + } + + /** + * Sets the wrapper to be used for runtime configuration. + * + * This method should be used only by the ProjectHelper and Ant internals. + * It is public to allow helper plugins to operate on tasks, normal tasks + * should never use it. + * + * @param wrapper The wrapper to be used for runtime configuration. + * May be null, in which case the next call + * to getRuntimeConfigurableWrapper will generate a new + * wrapper. + */ + public void setRuntimeConfigurableWrapper(RuntimeConfigurable wrapper) { + this.wrapper = wrapper; + } + + // TODO: (Jon Skeet) The comment "if it hasn't been done already" may + // not be strictly true. wrapper.maybeConfigure() won't configure the same + // attributes/text more than once, but it may well add the children again, + // unless I've missed something. + /** + * Configures this task - if it hasn't been done already. + * If the task has been invalidated, it is replaced with an + * UnknownElement task which uses the new definition in the project. + * + * @exception BuildException if the task cannot be configured. + */ + public void maybeConfigure() throws BuildException { + if (!invalid) { + if (wrapper != null) { + wrapper.maybeConfigure(getProject()); + } + } else { + getReplacement(); + } + } + + /** + * Force the task to be reconfigured from its RuntimeConfigurable. + */ + public void reconfigure() { + if (wrapper != null) { + wrapper.reconfigure(getProject()); + } + } + + /** + * Handles output by logging it with the INFO priority. + * + * @param output The output to log. Should not be null. + */ + protected void handleOutput(String output) { + log(output, Project.MSG_INFO); + } + + /** + * Handles output by logging it with the INFO priority. + * + * @param output The output to log. Should not be null. + * + * @since Ant 1.5.2 + */ + protected void handleFlush(String output) { + handleOutput(output); + } + + /** + * Handle an input request by this task. + * + * @param buffer the buffer into which data is to be read. + * @param offset the offset into the buffer at which data is stored. + * @param length the amount of data to read. + * + * @return the number of bytes read. + * + * @exception IOException if the data cannot be read. + * @since Ant 1.6 + */ + protected int handleInput(byte[] buffer, int offset, int length) + throws IOException { + return getProject().defaultInput(buffer, offset, length); + } + + /** + * Handles an error output by logging it with the WARN priority. + * + * @param output The error output to log. Should not be null. + */ + protected void handleErrorOutput(String output) { + log(output, Project.MSG_WARN); + } + + /** + * Handles an error line by logging it with the WARN priority. + * + * @param output The error output to log. Should not be null. + * + * @since Ant 1.5.2 + */ + protected void handleErrorFlush(String output) { + handleErrorOutput(output); + } + + /** + * Logs a message with the default (INFO) priority. + * + * @param msg The message to be logged. Should not be null. + */ + public void log(String msg) { + log(msg, Project.MSG_INFO); + } + + /** + * Logs a message with the given priority. This delegates + * the actual logging to the project. + * + * @param msg The message to be logged. Should not be null. + * @param msgLevel The message priority at which this message is to + * be logged. + */ + public void log(String msg, int msgLevel) { + if (getProject() != null) { + getProject().log(this, msg, msgLevel); + } else { + super.log(msg, msgLevel); + } + } + + /** + * Logs a message with the given priority. This delegates + * the actual logging to the project. + * + * @param t The exception to be logged. Should not be null. + * @param msgLevel The message priority at which this message is to + * be logged. + * @since 1.7 + */ + public void log(Throwable t, int msgLevel) { + if (t != null) { + log(t.getMessage(), t, msgLevel); + } + } + + /** + * Logs a message with the given priority. This delegates + * the actual logging to the project. + * + * @param msg The message to be logged. Should not be null. + * @param t The exception to be logged. May be null. + * @param msgLevel The message priority at which this message is to + * be logged. + * @since 1.7 + */ + public void log(String msg, Throwable t, int msgLevel) { + if (getProject() != null) { + getProject().log(this, msg, t, msgLevel); + } else { + super.log(msg, msgLevel); + } + } + + /** + * Performs this task if it's still valid, or gets a replacement + * version and performs that otherwise. + * + * Performing a task consists of firing a task started event, + * configuring the task, executing it, and then firing task finished + * event. If a runtime exception is thrown, the task finished event + * is still fired, but with the exception as the cause. + */ + public final void perform() { + if (!invalid) { + getProject().fireTaskStarted(this); + Throwable reason = null; + try { + maybeConfigure(); + DispatchUtils.execute(this); + } catch (BuildException ex) { + if (ex.getLocation() == Location.UNKNOWN_LOCATION) { + ex.setLocation(getLocation()); + } + reason = ex; + throw ex; + } catch (Exception ex) { + reason = ex; + BuildException be = new BuildException(ex); + be.setLocation(getLocation()); + throw be; + } catch (Error ex) { + reason = ex; + throw ex; + } finally { + getProject().fireTaskFinished(this, reason); + } + } else { + UnknownElement ue = getReplacement(); + Task task = ue.getTask(); + task.perform(); + } + } + + /** + * Marks this task as invalid. Any further use of this task + * will go through a replacement with the updated definition. + */ + final void markInvalid() { + invalid = true; + } + + /** + * Has this task been marked invalid? + * + * @return true if this task is no longer valid. A new task should be + * configured in this case. + * + * @since Ant 1.5 + */ + protected final boolean isInvalid() { + return invalid; + } + + /** + * Replacement element used if this task is invalidated. + */ + private UnknownElement replacement; + + /** + * Creates an UnknownElement that can be used to replace this task. + * Once this has been created once, it is cached and returned by + * future calls. + * + * @return the UnknownElement instance for the new definition of this task. + */ + private UnknownElement getReplacement() { + if (replacement == null) { + replacement = new UnknownElement(taskType); + replacement.setProject(getProject()); + replacement.setTaskType(taskType); + replacement.setTaskName(taskName); + replacement.setLocation(getLocation()); + replacement.setOwningTarget(target); + replacement.setRuntimeConfigurableWrapper(wrapper); + wrapper.setProxy(replacement); + replaceChildren(wrapper, replacement); + target.replaceChild(this, replacement); + replacement.maybeConfigure(); + } + return replacement; + } + + /** + * Recursively adds an UnknownElement instance for each child + * element of replacement. + * + * @since Ant 1.5.1 + */ + private void replaceChildren(RuntimeConfigurable wrapper, + UnknownElement parentElement) { + Enumeration e = wrapper.getChildren(); + while (e.hasMoreElements()) { + RuntimeConfigurable childWrapper = e.nextElement(); + UnknownElement childElement = + new UnknownElement(childWrapper.getElementTag()); + parentElement.addChild(childElement); + childElement.setProject(getProject()); + childElement.setRuntimeConfigurableWrapper(childWrapper); + childWrapper.setProxy(childElement); + replaceChildren(childWrapper, childElement); + } + } + + /** + * Return the type of task. + * + * @return the type of task. + */ + public String getTaskType() { + return taskType; + } + + /** + * Return the runtime configurable structure for this task. + * + * @return the runtime structure for this task. + */ + protected RuntimeConfigurable getWrapper() { + return wrapper; + } + + /** + * Bind a task to another; use this when configuring a newly created + * task to do work on behalf of another. + * Project, OwningTarget, TaskName, Location and Description are all copied + * + * Important: this method does not call {@link Task#init()}. + * If you are creating a task to delegate work to, call {@link Task#init()} + * to initialize it. + * + * @param owner owning target + * @since Ant1.7 + */ + public final void bindToOwner(Task owner) { + setProject(owner.getProject()); + setOwningTarget(owner.getOwningTarget()); + setTaskName(owner.getTaskName()); + setDescription(owner.getDescription()); + setLocation(owner.getLocation()); + setTaskType(owner.getTaskType()); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskAdapter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskAdapter.java new file mode 100644 index 00000000..3a3001f6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskAdapter.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.lang.reflect.Method; + +import org.apache.tools.ant.dispatch.DispatchUtils; +import org.apache.tools.ant.dispatch.Dispatchable; + +/** + * Uses introspection to "adapt" an arbitrary Bean which doesn't + * itself extend Task, but still contains an execute method and optionally + * a setProject method. + * + */ +public class TaskAdapter extends Task implements TypeAdapter { + + /** Object to act as a proxy for. */ + private Object proxy; + + /** + * No-arg constructor for reflection. + */ + public TaskAdapter() { + } + + /** + * Constructor for given proxy. + * So you could write easier code + *
    +     * myTaskContainer.addTask( new TaskAdapter(myProxy) );
    +     * 
    + * + * @param proxy The object which Ant should use as task. + */ + public TaskAdapter(Object proxy) { + this(); + setProxy(proxy); + } + + /** + * Checks whether or not a class is suitable to be adapted by TaskAdapter. + * If the class is of type Dispatchable, the check is not performed because + * the method that will be executed will be determined only at runtime of + * the actual task and not during parse time. + * + * This only checks conditions which are additionally required for + * tasks adapted by TaskAdapter. Thus, this method should be called by + * Project.checkTaskClass. + * + * Throws a BuildException and logs as Project.MSG_ERR for + * conditions that will cause the task execution to fail. + * Logs other suspicious conditions with Project.MSG_WARN. + * + * @param taskClass Class to test for suitability. + * Must not be null. + * @param project Project to log warnings/errors to. + * Must not be null. + * + * @see Project#checkTaskClass(Class) + */ + public static void checkTaskClass(final Class taskClass, + final Project project) { + if (!Dispatchable.class.isAssignableFrom(taskClass)) { + // don't have to check for interface, since then + // taskClass would be abstract too. + try { + final Method executeM = taskClass.getMethod("execute", (Class[]) null); + // don't have to check for public, since + // getMethod finds public method only. + // don't have to check for abstract, since then + // taskClass would be abstract too. + if (!Void.TYPE.equals(executeM.getReturnType())) { + final String message = "return type of execute() should be " + + "void but was \"" + executeM.getReturnType() + "\" in " + + taskClass; + project.log(message, Project.MSG_WARN); + } + } catch (NoSuchMethodException e) { + final String message = "No public execute() in " + taskClass; + project.log(message, Project.MSG_ERR); + throw new BuildException(message); + } catch (LinkageError e) { + String message = "Could not load " + taskClass + ": " + e; + project.log(message, Project.MSG_ERR); + throw new BuildException(message, e); + } + } + } + + /** + * Check if the proxy class is a valid class to use + * with this adapter. + * The class must have a public no-arg "execute()" method. + * @param proxyClass the class to check. + */ + public void checkProxyClass(Class proxyClass) { + checkTaskClass(proxyClass, getProject()); + } + + /** + * Executes the proxied task. + * + * @exception BuildException if the project could not be set + * or the method could not be executed. + */ + public void execute() throws BuildException { + try { + Method setLocationM = proxy.getClass().getMethod( + "setLocation", new Class[] {Location.class}); + if (setLocationM != null) { + setLocationM.invoke(proxy, new Object[] {getLocation()}); + } + } catch (NoSuchMethodException e) { + // ignore this if the class being used as a task does not have + // a set location method. + } catch (Exception ex) { + log("Error setting location in " + proxy.getClass(), + Project.MSG_ERR); + throw new BuildException(ex); + } + + try { + Method setProjectM = proxy.getClass().getMethod( + "setProject", new Class[] {Project.class}); + if (setProjectM != null) { + setProjectM.invoke(proxy, new Object[] {getProject()}); + } + } catch (NoSuchMethodException e) { + // ignore this if the class being used as a task does not have + // a set project method. + } catch (Exception ex) { + log("Error setting project in " + proxy.getClass(), + Project.MSG_ERR); + throw new BuildException(ex); + } + + try { + DispatchUtils.execute(proxy); + } catch (BuildException be) { + throw be; + } catch (Exception ex) { + log("Error in " + proxy.getClass(), Project.MSG_VERBOSE); + throw new BuildException(ex); + } + } + + /** + * Sets the target object to proxy for. + * + * @param o The target object. Must not be null. + */ + public void setProxy(Object o) { + this.proxy = o; + } + + /** + * Returns the target object being proxied. + * + * @return the target proxy object. + */ + public Object getProxy() { + return proxy; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskConfigurationChecker.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskConfigurationChecker.java new file mode 100644 index 00000000..e8e74441 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskConfigurationChecker.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.util.ArrayList; +import java.util.List; + +/** + *

    Helper class for the check of the configuration of a given task. + * This class provides methods for making assumptions about the task configuration. + * After collecting all violations with assert* and fail + * methods the checkErrors will throw a BuildException with all collected + * messages or does nothing if there wasn't any error.

    + * + *

    Example:

    + * + *
    + *     public class MyTask extends Task {
    + *         ...
    + *         public void execute() {
    + *             TaskConfigurationChecker checker = TaskConfigurationChecker(this);
    + *             checker.assertConfig(
    + *                 srcdir != null,
    + *                 "Attribute 'srcdir' must be set.
    + *             );
    + *             checker.assertConfig(
    + *                 srcdir.exists(),
    + *                 "Srcdir (" + srcdir + ") must exist."
    + *             );
    + *             if (someComplexCondition()) {
    + *                 fail("Complex condition failed.");
    + *             }
    + *             checker.checkErrors();
    + *         }
    + *     }
    + * 
    + * + * @see Notification Pattern + */ +public class TaskConfigurationChecker { + + /** List of all collected error messages. */ + private List errors = new ArrayList(); + + /** Task for which the configuration should be checked. */ + private final Task task; + + /** + * Constructor. + * @param task which task should be checked + */ + public TaskConfigurationChecker(Task task) { + this.task = task; + } + + /** + * Asserts that a condition is true. + * @param condition which condition to check + * @param errormessage errormessage to throw if a condition failed + */ + public void assertConfig(boolean condition, String errormessage) { + if (!condition) { + errors.add(errormessage); + } + } + + /** + * Registers an error. + * @param errormessage the message for the registered error + */ + public void fail(String errormessage) { + errors.add(errormessage); + } + + /** + * Checks if there are any collected errors and throws a BuildException + * with all messages if there was one or more. + * @throws BuildException if one or more errors were registered + */ + public void checkErrors() throws BuildException { + if (!errors.isEmpty()) { + StringBuffer sb = new StringBuffer(); + sb.append("Configurationerror on <"); + sb.append(task.getTaskName()); + sb.append(">:"); + sb.append(System.getProperty("line.separator")); + for (String msg : errors) { + sb.append("- "); + sb.append(msg); + sb.append(System.getProperty("line.separator")); + } + throw new BuildException(sb.toString(), task.getLocation()); + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskContainer.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskContainer.java new file mode 100644 index 00000000..12e8c075 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TaskContainer.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Interface for objects which can contain tasks. + *

    + * It is recommended that implementations call perform rather than + * execute for the tasks they contain, as this method ensures that the + * appropriate BuildEvents will be generated. + * + * @see Task#perform + * @see Task#execute + * @see BuildEvent + * + */ +public interface TaskContainer { + /** + * Adds a task to this task container + * + * @param task The task to be added to this container. + * Must not be null. + */ + void addTask(Task task); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TypeAdapter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TypeAdapter.java new file mode 100644 index 00000000..b8520fce --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/TypeAdapter.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +/** + * Used to wrap types. + * + */ +public interface TypeAdapter { + + /** + * Sets the project + * + * @param p the project instance. + */ + void setProject(Project p); + + /** + * Gets the project + * + * @return the project instance. + */ + Project getProject(); + + /** + * Sets the proxy object, whose methods are going to be + * invoked by ant. + * A proxy object is normally the object defined by + * a <typedef/> task that is adapted by the "adapter" + * attribute. + * + * @param o The target object. Must not be null. + */ + void setProxy(Object o); + + /** + * Returns the proxy object. + * + * @return the target proxy object + */ + Object getProxy(); + + /** + * Check if the proxy class is compatible with this adapter - i.e. + * the adapter will be able to adapt instances of the give class. + * + * @param proxyClass the class to be checked. + */ + void checkProxyClass(Class proxyClass); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnknownElement.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnknownElement.java new file mode 100644 index 00000000..88cd4989 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnknownElement.java @@ -0,0 +1,699 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.tools.ant.taskdefs.PreSetDef; + +/** + * Wrapper class that holds all the information necessary to create a task + * or data type that did not exist when Ant started, or one which + * has had its definition updated to use a different implementation class. + * + */ +public class UnknownElement extends Task { + + /** + * Holds the name of the task/type or nested child element of a + * task/type that hasn't been defined at parser time or has + * been redefined since original creation. + */ + private final String elementName; + + /** + * Holds the namespace of the element. + */ + private String namespace = ""; + + /** + * Holds the namespace qname of the element. + */ + private String qname; + + /** + * The real object after it has been loaded. + */ + private Object realThing; + + /** + * List of child elements (UnknownElements). + */ + private List children = null; + + /** Specifies if a predefined definition has been done */ + private boolean presetDefed = false; + + /** + * Creates an UnknownElement for the given element name. + * + * @param elementName The name of the unknown element. + * Must not be null. + */ + public UnknownElement(String elementName) { + this.elementName = elementName; + } + + /** + * @return the list of nested UnknownElements for this UnknownElement. + */ + public List getChildren() { + return children; + } + + /** + * Returns the name of the XML element which generated this unknown + * element. + * + * @return the name of the XML element which generated this unknown + * element. + */ + public String getTag() { + return elementName; + } + + /** + * Return the namespace of the XML element associated with this component. + * + * @return Namespace URI used in the xmlns declaration. + */ + public String getNamespace() { + return namespace; + } + + /** + * Set the namespace of the XML element associated with this component. + * This method is typically called by the XML processor. + * If the namespace is "ant:current", the component helper + * is used to get the current antlib uri. + * + * @param namespace URI used in the xmlns declaration. + */ + public void setNamespace(String namespace) { + if (namespace.equals(ProjectHelper.ANT_CURRENT_URI)) { + ComponentHelper helper = ComponentHelper.getComponentHelper( + getProject()); + namespace = helper.getCurrentAntlibUri(); + } + this.namespace = namespace == null ? "" : namespace; + } + + /** + * Return the qname of the XML element associated with this component. + * + * @return namespace Qname used in the element declaration. + */ + public String getQName() { + return qname; + } + + /** + * Set the namespace qname of the XML element. + * This method is typically called by the XML processor. + * + * @param qname the qualified name of the element + */ + public void setQName(String qname) { + this.qname = qname; + } + + + /** + * Get the RuntimeConfigurable instance for this UnknownElement, containing + * the configuration information. + * + * @return the configuration info. + */ + public RuntimeConfigurable getWrapper() { + return super.getWrapper(); + } + + /** + * Creates the real object instance and child elements, then configures + * the attributes and text of the real object. This unknown element + * is then replaced with the real object in the containing target's list + * of children. + * + * @exception BuildException if the configuration fails + */ + public void maybeConfigure() throws BuildException { + if (realThing != null) { + return; + } + configure(makeObject(this, getWrapper())); + } + + /** + * Configure the given object from this UnknownElement + * + * @param realObject the real object this UnknownElement is representing. + * + */ + public void configure(Object realObject) { + if (realObject == null) { + return; + } + realThing = realObject; + + getWrapper().setProxy(realThing); + Task task = null; + if (realThing instanceof Task) { + task = (Task) realThing; + + task.setRuntimeConfigurableWrapper(getWrapper()); + + // For Script example that modifies id'ed tasks in other + // targets to work. *very* Ugly + // The reference is replaced by RuntimeConfigurable + if (getWrapper().getId() != null) { + this.getOwningTarget().replaceChild(this, (Task) realThing); + } + } + + + // configure attributes of the object and it's children. If it is + // a task container, defer the configuration till the task container + // attempts to use the task + + if (task != null) { + task.maybeConfigure(); + } else { + getWrapper().maybeConfigure(getProject()); + } + + handleChildren(realThing, getWrapper()); + } + + /** + * Handles output sent to System.out by this task or its real task. + * + * @param output The output to log. Should not be null. + */ + protected void handleOutput(String output) { + if (realThing instanceof Task) { + ((Task) realThing).handleOutput(output); + } else { + super.handleOutput(output); + } + } + + /** + * Delegate to realThing if present and if it as task. + * @see Task#handleInput(byte[], int, int) + * @param buffer the buffer into which data is to be read. + * @param offset the offset into the buffer at which data is stored. + * @param length the amount of data to read. + * + * @return the number of bytes read. + * + * @exception IOException if the data cannot be read. + * @since Ant 1.6 + */ + protected int handleInput(byte[] buffer, int offset, int length) + throws IOException { + if (realThing instanceof Task) { + return ((Task) realThing).handleInput(buffer, offset, length); + } else { + return super.handleInput(buffer, offset, length); + } + + } + + /** + * Handles output sent to System.out by this task or its real task. + * + * @param output The output to log. Should not be null. + */ + protected void handleFlush(String output) { + if (realThing instanceof Task) { + ((Task) realThing).handleFlush(output); + } else { + super.handleFlush(output); + } + } + + /** + * Handles error output sent to System.err by this task or its real task. + * + * @param output The error output to log. Should not be null. + */ + protected void handleErrorOutput(String output) { + if (realThing instanceof Task) { + ((Task) realThing).handleErrorOutput(output); + } else { + super.handleErrorOutput(output); + } + } + + /** + * Handles error output sent to System.err by this task or its real task. + * + * @param output The error output to log. Should not be null. + */ + protected void handleErrorFlush(String output) { + if (realThing instanceof Task) { + ((Task) realThing).handleErrorFlush(output); + } else { + super.handleErrorFlush(output); + } + } + + /** + * Executes the real object if it's a task. If it's not a task + * (e.g. a data type) then this method does nothing. + */ + public void execute() { + if (realThing == null) { + // Got here if the runtimeconfigurable is not enabled. + return; + } + try { + if (realThing instanceof Task) { + ((Task) realThing).execute(); + } + } finally { + // Finished executing the task + // null it (unless it has an ID) to allow + // GC do its job + // If this UE is used again, a new "realthing" will be made + if (getWrapper().getId() == null) { + realThing = null; + getWrapper().setProxy(null); + } + } + } + + /** + * Adds a child element to this element. + * + * @param child The child element to add. Must not be null. + */ + public void addChild(UnknownElement child) { + if (children == null) { + children = new ArrayList(); + } + children.add(child); + } + + /** + * Creates child elements, creates children of the children + * (recursively), and sets attributes of the child elements. + * + * @param parent The configured object for the parent. + * Must not be null. + * + * @param parentWrapper The wrapper containing child wrappers + * to be configured. Must not be null + * if there are any children. + * + * @exception BuildException if the children cannot be configured. + */ + protected void handleChildren( + Object parent, + RuntimeConfigurable parentWrapper) + throws BuildException { + if (parent instanceof TypeAdapter) { + parent = ((TypeAdapter) parent).getProxy(); + } + + String parentUri = getNamespace(); + Class parentClass = parent.getClass(); + IntrospectionHelper ih = IntrospectionHelper.getHelper(getProject(), parentClass); + + + if (children != null) { + Iterator it = children.iterator(); + for (int i = 0; it.hasNext(); i++) { + RuntimeConfigurable childWrapper = parentWrapper.getChild(i); + UnknownElement child = it.next(); + try { + if (!childWrapper.isEnabled(child)) { + if (ih.supportsNestedElement( + parentUri, ProjectHelper.genComponentName( + child.getNamespace(), child.getTag()))) { + continue; + } + // fall tru and fail in handlechild (unsupported element) + } + if (!handleChild( + parentUri, ih, parent, child, childWrapper)) { + if (!(parent instanceof TaskContainer)) { + ih.throwNotSupported(getProject(), parent, + child.getTag()); + } else { + // a task container - anything could happen - just add the + // child to the container + TaskContainer container = (TaskContainer) parent; + container.addTask(child); + } + } + } catch (UnsupportedElementException ex) { + throw new BuildException( + parentWrapper.getElementTag() + + " doesn't support the nested \"" + ex.getElement() + + "\" element.", ex); + } + } + } + } + + /** + * @return the component name - uses ProjectHelper#genComponentName() + */ + protected String getComponentName() { + return ProjectHelper.genComponentName(getNamespace(), getTag()); + } + + /** + * This is used then the realobject of the UE is a PreSetDefinition. + * This is also used when a presetdef is used on a presetdef + * The attributes, elements and text are applied to this + * UE. + * + * @param u an UnknownElement containing the attributes, elements and text + */ + public void applyPreSet(UnknownElement u) { + if (presetDefed) { + return; + } + // Do the runtime + getWrapper().applyPreSet(u.getWrapper()); + if (u.children != null) { + List newChildren = new ArrayList(); + newChildren.addAll(u.children); + if (children != null) { + newChildren.addAll(children); + } + children = newChildren; + } + presetDefed = true; + } + + /** + * Creates a named task or data type. If the real object is a task, + * it is configured up to the init() stage. + * + * @param ue The unknown element to create the real object for. + * Must not be null. + * @param w Ignored in this implementation. + * + * @return the task or data type represented by the given unknown element. + */ + protected Object makeObject(UnknownElement ue, RuntimeConfigurable w) { + if (!w.isEnabled(ue)) { + return null; + } + ComponentHelper helper = ComponentHelper.getComponentHelper( + getProject()); + String name = ue.getComponentName(); + Object o = helper.createComponent(ue, ue.getNamespace(), name); + if (o == null) { + throw getNotFoundException("task or type", name); + } + if (o instanceof PreSetDef.PreSetDefinition) { + PreSetDef.PreSetDefinition def = (PreSetDef.PreSetDefinition) o; + o = def.createObject(ue.getProject()); + if (o == null) { + throw getNotFoundException( + "preset " + name, + def.getPreSets().getComponentName()); + } + ue.applyPreSet(def.getPreSets()); + if (o instanceof Task) { + Task task = (Task) o; + task.setTaskType(ue.getTaskType()); + task.setTaskName(ue.getTaskName()); + task.init(); + } + } + if (o instanceof UnknownElement) { + o = ((UnknownElement) o).makeObject((UnknownElement) o, w); + } + if (o instanceof Task) { + ((Task) o).setOwningTarget(getOwningTarget()); + } + if (o instanceof ProjectComponent) { + ((ProjectComponent) o).setLocation(getLocation()); + } + return o; + } + + /** + * Creates a named task and configures it up to the init() stage. + * + * @param ue The UnknownElement to create the real task for. + * Must not be null. + * @param w Ignored. + * + * @return the task specified by the given unknown element, or + * null if the task name is not recognised. + */ + protected Task makeTask(UnknownElement ue, RuntimeConfigurable w) { + Task task = getProject().createTask(ue.getTag()); + + if (task != null) { + task.setLocation(getLocation()); + // UnknownElement always has an associated target + task.setOwningTarget(getOwningTarget()); + task.init(); + } + return task; + } + + /** + * Returns a very verbose exception for when a task/data type cannot + * be found. + * + * @param what The kind of thing being created. For example, when + * a task name could not be found, this would be + * "task". Should not be null. + * @param name The name of the element which could not be found. + * Should not be null. + * + * @return a detailed description of what might have caused the problem. + */ + protected BuildException getNotFoundException(String what, + String name) { + ComponentHelper helper = ComponentHelper.getComponentHelper(getProject()); + String msg = helper.diagnoseCreationFailure(name, what); + return new BuildException(msg, getLocation()); + } + + /** + * Returns the name to use in logging messages. + * + * @return the name to use in logging messages. + */ + public String getTaskName() { + //return elementName; + return realThing == null + || !(realThing instanceof Task) ? super.getTaskName() + : ((Task) realThing).getTaskName(); + } + + /** + * Returns the task instance after it has been created and if it is a task. + * + * @return a task instance or null if the real object is not + * a task. + */ + public Task getTask() { + if (realThing instanceof Task) { + return (Task) realThing; + } + return null; + } + + /** + * Return the configured object + * + * @return the real thing whatever it is + * + * @since ant 1.6 + */ + public Object getRealThing() { + return realThing; + } + + /** + * Set the configured object + * @param realThing the configured object + * @since ant 1.7 + */ + public void setRealThing(Object realThing) { + this.realThing = realThing; + } + + /** + * Try to create a nested element of parent for the + * given tag. + * + * @return whether the creation has been successful + */ + private boolean handleChild( + String parentUri, + IntrospectionHelper ih, + Object parent, UnknownElement child, + RuntimeConfigurable childWrapper) { + String childName = ProjectHelper.genComponentName( + child.getNamespace(), child.getTag()); + if (ih.supportsNestedElement(parentUri, childName, getProject(), + parent)) { + IntrospectionHelper.Creator creator = null; + try { + creator = ih.getElementCreator(getProject(), parentUri, + parent, childName, child); + } catch (UnsupportedElementException use) { + if (!ih.isDynamic()) { + throw use; + } + // can't trust supportsNestedElement for dynamic elements + return false; + } + creator.setPolyType(childWrapper.getPolyType()); + Object realChild = creator.create(); + if (realChild instanceof PreSetDef.PreSetDefinition) { + PreSetDef.PreSetDefinition def = + (PreSetDef.PreSetDefinition) realChild; + realChild = creator.getRealObject(); + child.applyPreSet(def.getPreSets()); + } + childWrapper.setCreator(creator); + childWrapper.setProxy(realChild); + if (realChild instanceof Task) { + Task childTask = (Task) realChild; + childTask.setRuntimeConfigurableWrapper(childWrapper); + childTask.setTaskName(childName); + childTask.setTaskType(childName); + } + if (realChild instanceof ProjectComponent) { + ((ProjectComponent) realChild).setLocation(child.getLocation()); + } + childWrapper.maybeConfigure(getProject()); + child.handleChildren(realChild, childWrapper); + creator.store(); + return true; + } + return false; + } + + /** + * like contents equals, but ignores project + * @param obj the object to check against + * @return true if this unknownelement has the same contents the other + */ + public boolean similar(Object obj) { + if (obj == null) { + return false; + } + if (!getClass().getName().equals(obj.getClass().getName())) { + return false; + } + UnknownElement other = (UnknownElement) obj; + // Are the names the same ? + if (!equalsString(elementName, other.elementName)) { + return false; + } + if (!namespace.equals(other.namespace)) { + return false; + } + if (!qname.equals(other.qname)) { + return false; + } + // Are attributes the same ? + if (!getWrapper().getAttributeMap().equals( + other.getWrapper().getAttributeMap())) { + return false; + } + // Is the text the same? + // Need to use equals on the string and not + // on the stringbuffer as equals on the string buffer + // does not compare the contents. + if (!getWrapper().getText().toString().equals( + other.getWrapper().getText().toString())) { + return false; + } + // Are the sub elements the same ? + final int childrenSize = children == null ? 0 : children.size(); + if (childrenSize == 0) { + return other.children == null || other.children.size() == 0; + } + if (other.children == null) { + return false; + } + if (childrenSize != other.children.size()) { + return false; + } + for (int i = 0; i < childrenSize; ++i) { + UnknownElement child = (UnknownElement) children.get(i); + if (!child.similar(other.children.get(i))) { + return false; + } + } + return true; + } + + private static boolean equalsString(String a, String b) { + return (a == null) ? (b == null) : a.equals(b); + } + + /** + * Make a copy of the unknown element and set it in the new project. + * @param newProject the project to create the UE in. + * @return the copied UE. + */ + public UnknownElement copy(Project newProject) { + UnknownElement ret = new UnknownElement(getTag()); + ret.setNamespace(getNamespace()); + ret.setProject(newProject); + ret.setQName(getQName()); + ret.setTaskType(getTaskType()); + ret.setTaskName(getTaskName()); + ret.setLocation(getLocation()); + if (getOwningTarget() == null) { + Target t = new Target(); + t.setProject(getProject()); + ret.setOwningTarget(t); + } else { + ret.setOwningTarget(getOwningTarget()); + } + RuntimeConfigurable copyRC = new RuntimeConfigurable( + ret, getTaskName()); + copyRC.setPolyType(getWrapper().getPolyType()); + Map m = getWrapper().getAttributeMap(); + for (Map.Entry entry : m.entrySet()) { + copyRC.setAttribute(entry.getKey(), (String) entry.getValue()); + } + copyRC.addText(getWrapper().getText().toString()); + + for (Enumeration e = getWrapper().getChildren(); e.hasMoreElements();) { + RuntimeConfigurable r = e.nextElement(); + UnknownElement ueChild = (UnknownElement) r.getProxy(); + UnknownElement copyChild = ueChild.copy(newProject); + copyRC.addChild(copyChild.getWrapper()); + ret.addChild(copyChild); + } + return ret; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedAttributeException.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedAttributeException.java new file mode 100644 index 00000000..1fd9ce51 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedAttributeException.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Used to report attempts to set an unsupported attribute + * + * @since Ant 1.6.3 + */ +public class UnsupportedAttributeException extends BuildException { + private static final long serialVersionUID = 1L; + + private final String attribute; + + /** + * Constructs an unsupported attribute exception. + * @param msg The string containing the message. + * @param attribute The unsupported attribute. + */ + public UnsupportedAttributeException(String msg, String attribute) { + super(msg); + this.attribute = attribute; + } + + /** + * Get the attribute that is wrong. + * + * @return the attribute name. + */ + public String getAttribute() { + return attribute; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedElementException.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedElementException.java new file mode 100644 index 00000000..2a38120c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/UnsupportedElementException.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +/** + * Used to report attempts to set an unsupported element + * When the attempt to set the element is made, + * the code does not not know the name of the task/type + * based on a mapping from the classname to the task/type. + * However one class may be used by a lot of task/types. + * This exception may be caught by code that does know + * the task/type and it will reset the message to the + * correct message. + * This will be done once (in the case of a recursive + * call to handlechildren). + * + * @since Ant 1.6.3 + */ +public class UnsupportedElementException extends BuildException { + private static final long serialVersionUID = 1L; + + private final String element; + + /** + * Constructs an unsupported element exception. + * @param msg The string containing the message. + * @param element The name of the incorrect element. + */ + public UnsupportedElementException(String msg, String element) { + super(msg); + this.element = element; + } + + /** + * Get the element that is wrong. + * + * @return the element name. + */ + public String getElement() { + return element; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/XmlLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/XmlLogger.java new file mode 100644 index 00000000..a67a260e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/XmlLogger.java @@ -0,0 +1,474 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintStream; +import java.io.Writer; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Stack; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.tools.ant.util.DOMElementWriter; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.StringUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.Text; + +/** + * Generates a file in the current directory with + * an XML description of what happened during a build. + * The default filename is "log.xml", but this can be overridden + * with the property XmlLogger.file. + * + * This implementation assumes in its sanity checking that only one + * thread runs a particular target/task at a time. This is enforced + * by the way that parallel builds and antcalls are done - and + * indeed all but the simplest of tasks could run into problems + * if executed in parallel. + * + * @see Project#addBuildListener(BuildListener) + */ +public class XmlLogger implements BuildLogger { + + private int msgOutputLevel = Project.MSG_DEBUG; + private PrintStream outStream; + + /** DocumentBuilder to use when creating the document to start with. */ + private static DocumentBuilder builder = getDocumentBuilder(); + + /** + * Returns a default DocumentBuilder instance or throws an + * ExceptionInInitializerError if it can't be created. + * + * @return a default DocumentBuilder instance. + */ + private static DocumentBuilder getDocumentBuilder() { + try { + return DocumentBuilderFactory.newInstance().newDocumentBuilder(); + } catch (Exception exc) { + throw new ExceptionInInitializerError(exc); + } + } + + /** XML element name for a build. */ + private static final String BUILD_TAG = "build"; + + /** XML element name for a target. */ + private static final String TARGET_TAG = "target"; + + /** XML element name for a task. */ + private static final String TASK_TAG = "task"; + + /** XML element name for a message. */ + private static final String MESSAGE_TAG = "message"; + + /** XML attribute name for a name. */ + private static final String NAME_ATTR = "name"; + + /** XML attribute name for a time. */ + private static final String TIME_ATTR = "time"; + + /** XML attribute name for a message priority. */ + private static final String PRIORITY_ATTR = "priority"; + + /** XML attribute name for a file location. */ + private static final String LOCATION_ATTR = "location"; + + /** XML attribute name for an error description. */ + private static final String ERROR_ATTR = "error"; + + /** XML element name for a stack trace. */ + private static final String STACKTRACE_TAG = "stacktrace"; + + /** The complete log document for this build. */ + private Document doc = builder.newDocument(); + + /** Mapping for when tasks started (Task to TimedElement). */ + private Hashtable tasks = new Hashtable(); + + /** Mapping for when targets started (Target to TimedElement). */ + private Hashtable targets = new Hashtable(); + + /** + * Mapping of threads to stacks of elements + * (Thread to Stack of TimedElement). + */ + private Hashtable> threadStacks = new Hashtable>(); + + /** + * When the build started. + */ + private TimedElement buildElement = null; + + /** Utility class representing the time an element started. */ + private static class TimedElement { + /** + * Start time in milliseconds + * (as returned by System.currentTimeMillis()). + */ + private long startTime; + /** Element created at the start time. */ + private Element element; + public String toString() { + return element.getTagName() + ":" + element.getAttribute("name"); + } + } + + /** + * Constructs a new BuildListener that logs build events to an XML file. + */ + public XmlLogger() { + } + + /** + * Fired when the build starts, this builds the top-level element for the + * document and remembers the time of the start of the build. + * + * @param event Ignored. + */ + public void buildStarted(BuildEvent event) { + buildElement = new TimedElement(); + buildElement.startTime = System.currentTimeMillis(); + buildElement.element = doc.createElement(BUILD_TAG); + } + + /** + * Fired when the build finishes, this adds the time taken and any + * error stacktrace to the build element and writes the document to disk. + * + * @param event An event with any relevant extra information. + * Will not be null. + */ + public void buildFinished(BuildEvent event) { + long totalTime = System.currentTimeMillis() - buildElement.startTime; + buildElement.element.setAttribute(TIME_ATTR, DefaultLogger.formatTime(totalTime)); + + if (event.getException() != null) { + buildElement.element.setAttribute(ERROR_ATTR, event.getException().toString()); + // print the stacktrace in the build file it is always useful... + // better have too much info than not enough. + Throwable t = event.getException(); + Text errText = doc.createCDATASection(StringUtils.getStackTrace(t)); + Element stacktrace = doc.createElement(STACKTRACE_TAG); + stacktrace.appendChild(errText); + synchronizedAppend(buildElement.element, stacktrace); + } + String outFilename = getProperty(event, "XmlLogger.file", "log.xml"); + String xslUri = getProperty(event, "ant.XmlLogger.stylesheet.uri", "log.xsl"); + Writer out = null; + try { + // specify output in UTF8 otherwise accented characters will blow + // up everything + OutputStream stream = outStream; + if (stream == null) { + stream = new FileOutputStream(outFilename); + } + out = new OutputStreamWriter(stream, "UTF8"); + out.write("\n"); + if (xslUri.length() > 0) { + out.write("\n\n"); + } + new DOMElementWriter().write(buildElement.element, out, 0, "\t"); + out.flush(); + } catch (IOException exc) { + throw new BuildException("Unable to write log file", exc); + } finally { + FileUtils.close(out); + } + buildElement = null; + } + + private String getProperty(BuildEvent event, String propertyName, String defaultValue) { + String rv = defaultValue; + if (event != null && event.getProject() != null && event.getProject().getProperty(propertyName) != null) { + rv = event.getProject().getProperty(propertyName); + } + return rv; + } + + /** + * Returns the stack of timed elements for the current thread. + * @return the stack of timed elements for the current thread + */ + private Stack getStack() { + Stack threadStack = threadStacks.get(Thread.currentThread()); + if (threadStack == null) { + threadStack = new Stack(); + threadStacks.put(Thread.currentThread(), threadStack); + } + /* For debugging purposes uncomment: + org.w3c.dom.Comment s = doc.createComment("stack=" + threadStack); + buildElement.element.appendChild(s); + */ + return threadStack; + } + + /** + * Fired when a target starts building, this pushes a timed element + * for the target onto the stack of elements for the current thread, + * remembering the current time and the name of the target. + * + * @param event An event with any relevant extra information. + * Will not be null. + */ + public void targetStarted(BuildEvent event) { + Target target = event.getTarget(); + TimedElement targetElement = new TimedElement(); + targetElement.startTime = System.currentTimeMillis(); + targetElement.element = doc.createElement(TARGET_TAG); + targetElement.element.setAttribute(NAME_ATTR, target.getName()); + targets.put(target, targetElement); + getStack().push(targetElement); + } + + /** + * Fired when a target finishes building, this adds the time taken + * and any error stacktrace to the appropriate target element in the log. + * + * @param event An event with any relevant extra information. + * Will not be null. + */ + public void targetFinished(BuildEvent event) { + Target target = event.getTarget(); + TimedElement targetElement = targets.get(target); + if (targetElement != null) { + long totalTime = System.currentTimeMillis() - targetElement.startTime; + targetElement.element.setAttribute(TIME_ATTR, DefaultLogger.formatTime(totalTime)); + + TimedElement parentElement = null; + Stack threadStack = getStack(); + if (!threadStack.empty()) { + TimedElement poppedStack = threadStack.pop(); + if (poppedStack != targetElement) { + throw new RuntimeException("Mismatch - popped element = " + poppedStack + + " finished target element = " + targetElement); + } + if (!threadStack.empty()) { + parentElement = threadStack.peek(); + } + } + if (parentElement == null) { + synchronizedAppend(buildElement.element, targetElement.element); + } else { + synchronizedAppend(parentElement.element, + targetElement.element); + } + } + targets.remove(target); + } + + /** + * Fired when a task starts building, this pushes a timed element + * for the task onto the stack of elements for the current thread, + * remembering the current time and the name of the task. + * + * @param event An event with any relevant extra information. + * Will not be null. + */ + public void taskStarted(BuildEvent event) { + TimedElement taskElement = new TimedElement(); + taskElement.startTime = System.currentTimeMillis(); + taskElement.element = doc.createElement(TASK_TAG); + + Task task = event.getTask(); + String name = event.getTask().getTaskName(); + if (name == null) { + name = ""; + } + taskElement.element.setAttribute(NAME_ATTR, name); + taskElement.element.setAttribute(LOCATION_ATTR, event.getTask().getLocation().toString()); + tasks.put(task, taskElement); + getStack().push(taskElement); + } + + /** + * Fired when a task finishes building, this adds the time taken + * and any error stacktrace to the appropriate task element in the log. + * + * @param event An event with any relevant extra information. + * Will not be null. + */ + public void taskFinished(BuildEvent event) { + Task task = event.getTask(); + TimedElement taskElement = tasks.get(task); + if (taskElement == null) { + throw new RuntimeException("Unknown task " + task + " not in " + tasks); + } + long totalTime = System.currentTimeMillis() - taskElement.startTime; + taskElement.element.setAttribute(TIME_ATTR, DefaultLogger.formatTime(totalTime)); + Target target = task.getOwningTarget(); + TimedElement targetElement = null; + if (target != null) { + targetElement = targets.get(target); + } + if (targetElement == null) { + synchronizedAppend(buildElement.element, taskElement.element); + } else { + synchronizedAppend(targetElement.element, taskElement.element); + } + Stack threadStack = getStack(); + if (!threadStack.empty()) { + TimedElement poppedStack = threadStack.pop(); + if (poppedStack != taskElement) { + throw new RuntimeException("Mismatch - popped element = " + poppedStack + + " finished task element = " + taskElement); + } + } + tasks.remove(task); + } + + /** + * Get the TimedElement associated with a task. + * + * Where the task is not found directly, search for unknown elements which + * may be hiding the real task + */ + private TimedElement getTaskElement(Task task) { + TimedElement element = tasks.get(task); + if (element != null) { + return element; + } + for (Enumeration e = tasks.keys(); e.hasMoreElements();) { + Task key = e.nextElement(); + if (key instanceof UnknownElement) { + if (((UnknownElement) key).getTask() == task) { + return tasks.get(key); + } + } + } + return null; + } + + /** + * Fired when a message is logged, this adds a message element to the + * most appropriate parent element (task, target or build) and records + * the priority and text of the message. + * + * @param event An event with any relevant extra information. + * Will not be null. + */ + public void messageLogged(BuildEvent event) { + int priority = event.getPriority(); + if (priority > msgOutputLevel) { + return; + } + Element messageElement = doc.createElement(MESSAGE_TAG); + + String name = "debug"; + switch (priority) { + case Project.MSG_ERR: + name = "error"; + break; + case Project.MSG_WARN: + name = "warn"; + break; + case Project.MSG_INFO: + name = "info"; + break; + default: + name = "debug"; + break; + } + messageElement.setAttribute(PRIORITY_ATTR, name); + + Throwable ex = event.getException(); + if (Project.MSG_DEBUG <= msgOutputLevel && ex != null) { + Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex)); + Element stacktrace = doc.createElement(STACKTRACE_TAG); + stacktrace.appendChild(errText); + synchronizedAppend(buildElement.element, stacktrace); + } + Text messageText = doc.createCDATASection(event.getMessage()); + messageElement.appendChild(messageText); + + TimedElement parentElement = null; + + Task task = event.getTask(); + + Target target = event.getTarget(); + if (task != null) { + parentElement = getTaskElement(task); + } + if (parentElement == null && target != null) { + parentElement = targets.get(target); + } + if (parentElement != null) { + synchronizedAppend(parentElement.element, messageElement); + } else { + synchronizedAppend(buildElement.element, messageElement); + } + } + + // -------------------------------------------------- BuildLogger interface + + /** + * Set the logging level when using this as a Logger + * + * @param level the logging level - + * see {@link org.apache.tools.ant.Project#MSG_ERR Project} + * class for level definitions + */ + public void setMessageOutputLevel(int level) { + msgOutputLevel = level; + } + + /** + * Set the output stream to which logging output is sent when operating + * as a logger. + * + * @param output the output PrintStream. + */ + public void setOutputPrintStream(PrintStream output) { + this.outStream = new PrintStream(output, true); + } + + /** + * Ignore emacs mode, as it has no meaning in XML format + * + * @param emacsMode true if logger should produce emacs compatible + * output + */ + public void setEmacsMode(boolean emacsMode) { + } + + /** + * Ignore error print stream. All output will be written to + * either the XML log file or the PrintStream provided to + * setOutputPrintStream + * + * @param err the stream we are going to ignore. + */ + public void setErrorPrintStream(PrintStream err) { + } + + private void synchronizedAppend(Node parent, Node child) { + synchronized(parent) { + parent.appendChild(child); + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/antlib.xml b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/antlib.xml new file mode 100644 index 00000000..b11bac52 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/antlib.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/AttributeNamespace.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/AttributeNamespace.java new file mode 100644 index 00000000..fba4c992 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/AttributeNamespace.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.attribute; + +/** + * This class is used to indicate that the XML namespace (URI) + * can be used to look for namespace attributes. + * @see org.apache.tools.ant.taskdefs.AttributeNamespaceDef + * @since Ant 1.9.1 + */ +public final class AttributeNamespace { +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/BaseIfAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/BaseIfAttribute.java new file mode 100644 index 00000000..c2ec08ab --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/BaseIfAttribute.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.attribute; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.RuntimeConfigurable; +import org.apache.tools.ant.UnknownElement; + + +/** + * An abstract class for if/unless attributes. + * This contains a boolean flag to specify whether this is an + * if or unless attribute. + * @since Ant 1.9.1 + */ +public abstract class BaseIfAttribute + extends ProjectComponent implements EnableAttribute { + private boolean positive = true; + /** + * Set the positive flag. + * @param positive the value to use. + */ + protected void setPositive(boolean positive) { + this.positive = positive; + } + + /** + * Get the positive flag. + * @return the flag. + */ + protected boolean isPositive() { + return positive; + } + + /** + * convert the result. + * @param val the result to convert + * @return val if positive or !val if not. + */ + protected boolean convertResult(boolean val) { + return positive ? val : !val; + } + + /** + * Get all the attributes in the ant-attribute:param + * namespace and place them in a map. + * @param el the element this attribute is in. + * @return a map of attributes. + */ + protected Map getParams(UnknownElement el) { + Map ret = new HashMap(); + RuntimeConfigurable rc = el.getWrapper(); + Map attributes = rc.getAttributeMap(); // This does a copy! + for (Iterator i = attributes.entrySet().iterator(); i.hasNext();) { + Map.Entry entry = (Map.Entry) i.next(); + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + if (key.startsWith("ant-attribute:param")) { + int pos = key.lastIndexOf(':'); + ret.put(key.substring(pos + 1), + el.getProject().replaceProperties(value)); + } + } + return ret; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/EnableAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/EnableAttribute.java new file mode 100644 index 00000000..06c1186f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/EnableAttribute.java @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.attribute; + +import org.apache.tools.ant.UnknownElement; + +/** + * This interface is used by Ant attributes. + * @since Ant 1.9.1 + */ +public interface EnableAttribute { + /** + * is enabled. + * @param el the unknown element this attribute is in. + * @param value the value of the attribute. + * @return true if the attribute enables the element, false otherwise. + */ + boolean isEnabled(UnknownElement el, String value); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfBlankAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfBlankAttribute.java new file mode 100644 index 00000000..384476c8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfBlankAttribute.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.attribute; + +import org.apache.tools.ant.UnknownElement; + +/** + * Check if an attribute is blank or not. + * @since Ant 1.9.1 + */ +public class IfBlankAttribute extends BaseIfAttribute { + /** The unless version */ + public static class Unless extends IfBlankAttribute { + { setPositive(false); } + } + /** + * check if the attribute value is blank or not + * {@inheritDoc} + */ + public boolean isEnabled(UnknownElement el, String value) { + return convertResult((value == null || "".equals(value))); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfSetAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfSetAttribute.java new file mode 100644 index 00000000..d4531c59 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfSetAttribute.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.attribute; + +import org.apache.tools.ant.UnknownElement; + +/** + * Check if an attribute value as a property is set or not + * @since Ant 1.9.1 + */ +public class IfSetAttribute extends BaseIfAttribute { + /** The unless version */ + public static class Unless extends IfSetAttribute { + { setPositive(false); } + } + /** + * check if the attribute value is blank or not + * {@inheritDoc} + */ + public boolean isEnabled(UnknownElement el, String value) { + return convertResult(getProject().getProperty(value) != null); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfTrueAttribute.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfTrueAttribute.java new file mode 100644 index 00000000..5c10ea2f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/attribute/IfTrueAttribute.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.attribute; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.UnknownElement; + +/** + * Check if an attribute value is true or not. + * @since Ant 1.9.1 + */ +public class IfTrueAttribute extends BaseIfAttribute { + /** The unless version */ + public static class Unless extends IfTrueAttribute { + { setPositive(false); } + } + + /** + * check if the attribute value is true or not + * {@inheritDoc} + */ + public boolean isEnabled(UnknownElement el, String value) { + return convertResult(Project.toBoolean(value)); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/defaultManifest.mf b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/defaultManifest.mf new file mode 100644 index 00000000..fd30a23a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/defaultManifest.mf @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Ant-Version: Apache Ant ${project.version} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchTask.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchTask.java new file mode 100644 index 00000000..a848ed13 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchTask.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.dispatch; + +import org.apache.tools.ant.Task; + +/** + * Tasks extending this class may contain multiple actions. + * The method that is invoked for execution depends upon the + * value of the action attribute of the task. + *
    + * Example:
    + * <mytask action="list"/> will invoke the method + * with the signature public void list() in mytask's class. + * If the action attribute is not defined in the task or is empty, + * the execute() method will be called. + */ +public abstract class DispatchTask extends Task implements Dispatchable { + private String action; + + /** + * Get the action parameter name. + * @return the String "action" by default (can be overridden). + */ + public String getActionParameterName() { + return "action"; + } + + /** + * Set the action. + * @param action the method name. + */ + public void setAction(String action) { + this.action = action; + } + + /** + * Get the action. + * @return the action. + */ + public String getAction() { + return action; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java new file mode 100644 index 00000000..1a7c1f98 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/DispatchUtils.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.dispatch; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.UnknownElement; + +/** + * Determines and Executes the action method for the task. + */ +// CheckStyle:HideUtilityClassConstructorCheck OFF - (bc) +public class DispatchUtils { + /** + * Determines and Executes the action method for the task. + * @param task the task to execute. + * @throws BuildException on error. + */ + public static final void execute(Object task) throws BuildException { + String methodName = "execute"; + Dispatchable dispatchable = null; + try { + if (task instanceof Dispatchable) { + dispatchable = (Dispatchable) task; + } else if (task instanceof UnknownElement) { + UnknownElement ue = (UnknownElement) task; + Object realThing = ue.getRealThing(); + if (realThing != null + && realThing instanceof Dispatchable + && realThing instanceof Task) { + dispatchable = (Dispatchable) realThing; + } + } + if (dispatchable != null) { + String mName = null; + try { + final String name = dispatchable.getActionParameterName(); + if (name != null && name.trim().length() > 0) { + mName = "get" + name.trim().substring(0, 1).toUpperCase(); + if (name.length() > 1) { + mName += name.substring(1); + } + final Class c = dispatchable.getClass(); + final Method actionM = c.getMethod(mName, new Class[0]); + if (actionM != null) { + final Object o = actionM.invoke(dispatchable, (Object[]) null); + if (o != null) { + final String s = o.toString(); + if (s != null && s.trim().length() > 0) { + methodName = s.trim(); + Method executeM = null; + executeM = dispatchable.getClass().getMethod( + methodName, new Class[0]); + if (executeM == null) { + throw new BuildException( + "No public " + methodName + "() in " + + dispatchable.getClass()); + } + executeM.invoke(dispatchable, (Object[]) null); + if (task instanceof UnknownElement) { + ((UnknownElement) task).setRealThing(null); + } + } else { + throw new BuildException( + "Dispatchable Task attribute '" + name.trim() + + "' not set or value is empty."); + } + } else { + throw new BuildException( + "Dispatchable Task attribute '" + name.trim() + + "' not set or value is empty."); + } + } + } else { + throw new BuildException( + "Action Parameter Name must not be empty for Dispatchable Task."); + } + } catch (NoSuchMethodException nsme) { + throw new BuildException("No public " + mName + "() in " + task.getClass()); + } + } else { + Method executeM = null; + executeM = task.getClass().getMethod(methodName, new Class[0]); + if (executeM == null) { + throw new BuildException("No public " + methodName + "() in " + + task.getClass()); + } + executeM.invoke(task, (Object[]) null); + if (task instanceof UnknownElement) { + ((UnknownElement) task).setRealThing(null); + } + } + } catch (InvocationTargetException ie) { + Throwable t = ie.getTargetException(); + if (t instanceof BuildException) { + throw ((BuildException) t); + } else { + throw new BuildException(t); + } + } catch (NoSuchMethodException e) { + throw new BuildException(e); + } catch (IllegalAccessException e) { + throw new BuildException(e); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/Dispatchable.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/Dispatchable.java new file mode 100644 index 00000000..41684f48 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/dispatch/Dispatchable.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.dispatch; + +/** + * Classes implementing this interface specify the + * name of the parameter that contains the name + * of the task's method to execute. + */ +public interface Dispatchable { + /** + * Get the name of the parameter. + * @return the name of the parameter that contains the name of the method. + */ + String getActionParameterName(); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseFilterReader.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseFilterReader.java new file mode 100644 index 00000000..3b3b0270 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseFilterReader.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.FilterReader; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.util.FileUtils; + +/** + * Base class for core filter readers. + * + */ +public abstract class BaseFilterReader extends FilterReader { + /** Buffer size used when reading */ + private static final int BUFFER_SIZE = 8192; + + /** Have the parameters passed been interpreted? */ + private boolean initialized = false; + + /** The Ant project this filter is part of. */ + private Project project = null; + + /** + * Constructor used by Ant's introspection mechanism. + * The original filter reader is only used for chaining + * purposes, never for filtering purposes (and indeed + * it would be useless for filtering purposes, as it has + * no real data to filter). ChainedReaderHelper uses + * this placeholder instance to create a chain of real filters. + */ + public BaseFilterReader() { + super(new StringReader("")); + FileUtils.close(this); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + * + */ + public BaseFilterReader(final Reader in) { + super(in); + } + + /** + * Reads characters into a portion of an array. This method will block + * until some input is available, an I/O error occurs, or the end of the + * stream is reached. + * + * @param cbuf Destination buffer to write characters to. + * Must not be null. + * @param off Offset at which to start storing characters. + * @param len Maximum number of characters to read. + * + * @return the number of characters read, or -1 if the end of the + * stream has been reached + * + * @exception IOException If an I/O error occurs + */ + public final int read(final char[] cbuf, final int off, + final int len) throws IOException { + for (int i = 0; i < len; i++) { + final int ch = read(); + if (ch == -1) { + if (i == 0) { + return -1; + } else { + return i; + } + } + cbuf[off + i] = (char) ch; + } + return len; + } + + /** + * Skips characters. This method will block until some characters are + * available, an I/O error occurs, or the end of the stream is reached. + * + * @param n The number of characters to skip + * + * @return the number of characters actually skipped + * + * @exception IllegalArgumentException If n is negative. + * @exception IOException If an I/O error occurs + */ + public final long skip(final long n) + throws IOException, IllegalArgumentException { + if (n < 0L) { + throw new IllegalArgumentException("skip value is negative"); + } + + for (long i = 0; i < n; i++) { + if (read() == -1) { + return i; + } + } + return n; + } + + /** + * Sets the initialized status. + * + * @param initialized Whether or not the filter is initialized. + */ + protected final void setInitialized(final boolean initialized) { + this.initialized = initialized; + } + + /** + * Returns the initialized status. + * + * @return whether or not the filter is initialized + */ + protected final boolean getInitialized() { + return initialized; + } + + /** + * Sets the project to work with. + * + * @param project The project this filter is part of. + * Should not be null. + */ + public final void setProject(final Project project) { + this.project = project; + } + + /** + * Returns the project this filter is part of. + * + * @return the project this filter is part of + */ + protected final Project getProject() { + return project; + } + + /** + * Reads a line of text ending with '\n' (or until the end of the stream). + * The returned String retains the '\n'. + * + * @return the line read, or null if the end of the stream + * has already been reached + * + * @exception IOException if the underlying reader throws one during + * reading + */ + protected final String readLine() throws IOException { + int ch = in.read(); + + if (ch == -1) { + return null; + } + + StringBuffer line = new StringBuffer(); + + while (ch != -1) { + line.append ((char) ch); + if (ch == '\n') { + break; + } + ch = in.read(); + } + return line.toString(); + } + + /** + * Reads to the end of the stream, returning the contents as a String. + * + * @return the remaining contents of the reader, as a String + * + * @exception IOException if the underlying reader throws one during + * reading + */ + protected final String readFully() throws IOException { + return FileUtils.readFully(in, BUFFER_SIZE); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseParamFilterReader.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseParamFilterReader.java new file mode 100644 index 00000000..54bc9ff9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/BaseParamFilterReader.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.types.Parameterizable; + +/** + * Parameterized base class for core filter readers. + * + */ +public abstract class BaseParamFilterReader + extends BaseFilterReader + implements Parameterizable { + /** The passed in parameter array. */ + private Parameter[] parameters; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public BaseParamFilterReader() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public BaseParamFilterReader(final Reader in) { + super(in); + } + + /** + * Sets the parameters used by this filter, and sets + * the filter to an uninitialized status. + * + * @param parameters The parameters to be used by this filter. + * Should not be null. + */ + public final void setParameters(final Parameter[] parameters) { + this.parameters = parameters; + setInitialized(false); + } + + /** + * Returns the parameters to be used by this filter. + * + * @return the parameters to be used by this filter + */ + protected final Parameter[] getParameters() { + return parameters; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ChainableReader.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ChainableReader.java new file mode 100644 index 00000000..67060393 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ChainableReader.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.Reader; + +/** + * Interface indicating that a reader may be chained to another one. + * + */ +public interface ChainableReader { + /** + * Returns a reader with the same configuration as this one, + * but filtering input from the specified reader. + * + * @param rdr the reader which the returned reader should be filtering + * + * @return a reader with the same configuration as this one, but + * filtering input from the specified reader + */ + Reader chain(Reader rdr); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ClassConstants.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ClassConstants.java new file mode 100644 index 00000000..35443012 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ClassConstants.java @@ -0,0 +1,165 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.util.ResourceUtils; + +/** + * Assembles the constants declared in a Java class in + * key1=value1(line separator)key2=value2 + * format. + *

    + * Notes: + *

      + *
    1. This filter uses the BCEL external toolkit. + *
    2. This assembles only those constants that are not created + * using the syntax new whatever() + *
    3. This assembles constants declared using the basic datatypes + * and String only.
    4. + *
    5. The access modifiers of the declared constants do not matter.
    6. + *
    + * Example:
    + *
    <classconstants/>
    + * Or: + *
    <filterreader
    + *    classname="org.apache.tools.ant.filters.ClassConstants"/>
    + */ +public final class ClassConstants + extends BaseFilterReader + implements ChainableReader { + /** Data that must be read from, if not null. */ + private String queuedData = null; + + /** Helper Class to be invoked via reflection. */ + private static final String JAVA_CLASS_HELPER = + "org.apache.tools.ant.filters.util.JavaClassHelper"; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public ClassConstants() { + super(); + } + + /** + * Creates a new filtered reader. The contents of the passed-in reader + * are expected to be the name of the class from which to produce a + * list of constants. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public ClassConstants(final Reader in) { + super(in); + } + + /** + * Reads and assembles the constants declared in a class file. + * + * @return the next character in the list of constants, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading, or if the constants for the specified class cannot + * be read (for example due to the class not being found). + */ + public int read() throws IOException { + + int ch = -1; + + if (queuedData != null && queuedData.length() == 0) { + queuedData = null; + } + + if (queuedData != null) { + ch = queuedData.charAt(0); + queuedData = queuedData.substring(1); + if (queuedData.length() == 0) { + queuedData = null; + } + } else { + final String clazz = readFully(); + if (clazz == null || clazz.length() == 0) { + ch = -1; + } else { + final byte[] bytes = clazz.getBytes(ResourceUtils.ISO_8859_1); + try { + final Class javaClassHelper = + Class.forName(JAVA_CLASS_HELPER); + if (javaClassHelper != null) { + final Class[] params = { + byte[].class + }; + final Method getConstants = + javaClassHelper.getMethod("getConstants", params); + final Object[] args = { + bytes + }; + // getConstants is a static method, no need to + // pass in the object + final StringBuffer sb = (StringBuffer) + getConstants.invoke(null, args); + if (sb.length() > 0) { + queuedData = sb.toString(); + return read(); + } + } + } catch (NoClassDefFoundError ex) { + throw ex; + } catch (RuntimeException ex) { + throw ex; + } catch (InvocationTargetException ex) { + Throwable t = ex.getTargetException(); + if (t instanceof NoClassDefFoundError) { + throw (NoClassDefFoundError) t; + } + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } + throw new BuildException(t); + } catch (Exception ex) { + throw new BuildException(ex); + } + } + } + return ch; + } + + /** + * Creates a new ClassConstants using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + ClassConstants newFilter = new ClassConstants(rdr); + return newFilter; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ConcatFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ConcatFilter.java new file mode 100644 index 00000000..0ac6024b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ConcatFilter.java @@ -0,0 +1,218 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; + +/** + * Concats a file before and/or after the file. + * + *

    Example:

    + * <copy todir="build">
    + *     <fileset dir="src" includes="*.java"/>
    + *     <filterchain>
    + *         <concatfilter prepend="apache-license-java.txt"/>
    + *     </filterchain>
    + * </copy>
    + * 
    + * + *

    Copies all java sources from src to build and adds the + * content of apache-license-java.txt add the beginning of each + * file.

    + * + * @since 1.6 + * @version 2003-09-23 + */ +public final class ConcatFilter extends BaseParamFilterReader + implements ChainableReader { + + /** File to add before the content. */ + private File prepend; + + /** File to add after the content. */ + private File append; + + /** Reader for prepend-file. */ + private Reader prependReader = null; + + /** Reader for append-file. */ + private Reader appendReader = null; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public ConcatFilter() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public ConcatFilter(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream. If the desired + * number of lines have already been read, the resulting stream is + * effectively at an end. Otherwise, the next character from the + * underlying stream is read and returned. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + @Override + public int read() throws IOException { + // do the "singleton" initialization + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + // The readers return -1 if they end. So simply read the "prepend" + // after that the "content" and at the end the "append" file. + if (prependReader != null) { + ch = prependReader.read(); + if (ch == -1) { + // I am the only one so I have to close the reader + prependReader.close(); + prependReader = null; + } + } + if (ch == -1) { + ch = super.read(); + } + if (ch == -1) { + // don't call super.close() because that reader is used + // on other places ... + if (appendReader != null) { + ch = appendReader.read(); + if (ch == -1) { + // I am the only one so I have to close the reader + appendReader.close(); + appendReader = null; + } + } + } + + return ch; + } + + /** + * Sets prepend attribute. + * @param prepend new value + */ + public void setPrepend(final File prepend) { + this.prepend = prepend; + } + + /** + * Returns prepend attribute. + * @return prepend attribute + */ + public File getPrepend() { + return prepend; + } + + /** + * Sets append attribute. + * @param append new value + */ + public void setAppend(final File append) { + this.append = append; + } + + /** + * Returns append attribute. + * @return append attribute + */ + public File getAppend() { + return append; + } + + /** + * Creates a new ConcatReader using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + final ConcatFilter newFilter = new ConcatFilter(rdr); + newFilter.setPrepend(getPrepend()); + newFilter.setAppend(getAppend()); + // Usually the initialized is set to true. But here it must not. + // Because the prepend and append readers have to be instantiated + // on runtime + //newFilter.setInitialized(true); + return newFilter; + } + + /** + * Scans the parameters list for the "lines" parameter and uses + * it to set the number of lines to be returned in the filtered stream. + * also scan for skip parameter. + */ + private void initialize() throws IOException { + // get parameters + final Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if ("prepend".equals(params[i].getName())) { + setPrepend(new File(params[i].getValue())); + continue; + } + if ("append".equals(params[i].getName())) { + setAppend(new File(params[i].getValue())); + continue; + } + } + } + if (prepend != null) { + if (!prepend.isAbsolute()) { + prepend = new File(getProject().getBaseDir(), prepend.getPath()); + } + prependReader = new BufferedReader(new FileReader(prepend)); + } + if (append != null) { + if (!append.isAbsolute()) { + append = new File(getProject().getBaseDir(), append.getPath()); + } + appendReader = new BufferedReader(new FileReader(append)); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/EscapeUnicode.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/EscapeUnicode.java new file mode 100644 index 00000000..dd454395 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/EscapeUnicode.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.util.UnicodeUtil; + +/** + * This method converts non-latin characters to unicode escapes. + * Useful to load properties containing non latin + * Example: + * + *
    <escapeunicode>
    + * + * Or: + * + *
    <filterreader
    +        classname="org.apache.tools.ant.filters.EscapeUnicode"/>
    + *  
    + * + * @since Ant 1.6 + */ +public class EscapeUnicode + extends BaseParamFilterReader + implements ChainableReader { + //this field will hold unnnn right after reading a non latin character + //afterwards it will be truncated of one char every call to read + private StringBuffer unicodeBuf; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public EscapeUnicode() { + super(); + unicodeBuf = new StringBuffer(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public EscapeUnicode(final Reader in) { + super(in); + unicodeBuf = new StringBuffer(); + } + + /** + * Returns the next character in the filtered stream, converting non latin + * characters to unicode escapes. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws + * an IOException during reading + */ + public final int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + if (unicodeBuf.length() == 0) { + ch = in.read(); + if (ch != -1) { + char achar = (char) ch; + if (achar >= '\u0080') { + unicodeBuf = UnicodeUtil.EscapeUnicode(achar); + ch = '\\'; + } + } + } else { + ch = (int) unicodeBuf.charAt(0); + unicodeBuf.deleteCharAt(0); + } + return ch; + } + + /** + * Creates a new EscapeUnicode using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public final Reader chain(final Reader rdr) { + EscapeUnicode newFilter = new EscapeUnicode(rdr); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Parses the parameters (currently unused) + */ + private void initialize() { + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ExpandProperties.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ExpandProperties.java new file mode 100644 index 00000000..524a799b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ExpandProperties.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.Properties; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.PropertyHelper; +import org.apache.tools.ant.property.GetProperty; +import org.apache.tools.ant.property.ParseProperties; +import org.apache.tools.ant.types.PropertySet; + +/** + * Expands Ant properties, if any, in the data. + *

    + * Example:
    + *

    <expandproperties/>
    + * Or: + *
    <filterreader
    + *    classname="org.apache.tools.ant.filters.ExpandProperties"/>
    + * + */ +public final class ExpandProperties + extends BaseFilterReader + implements ChainableReader { + + private static final int EOF = -1; + + private char[] buffer; + private int index; + private PropertySet propertySet; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public ExpandProperties() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public ExpandProperties(final Reader in) { + super(in); + } + + /** + * Restrict the expanded properties using a PropertySet. + * @param propertySet replacement lookup + */ + public void add(PropertySet propertySet) { + if (this.propertySet != null) { + throw new BuildException("expandproperties filter accepts only one propertyset"); + } + this.propertySet = propertySet; + } + + /** + * Returns the next character in the filtered stream. The original + * stream is first read in fully, and the Ant properties are expanded. + * The results of this expansion are then queued so they can be read + * character-by-character. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (index > EOF) { + if (buffer == null) { + String data = readFully(); + Project project = getProject(); + GetProperty getProperty; + if (propertySet == null) { + getProperty = PropertyHelper.getPropertyHelper(project); + } else { + final Properties props = propertySet.getProperties(); + getProperty = new GetProperty() { + + public Object getProperty(String name) { + return props.getProperty(name); + } + }; + } + Object expanded = new ParseProperties(project, PropertyHelper + .getPropertyHelper(project) + .getExpanders(), + getProperty) + .parseProperties(data); + buffer = expanded == null ? new char[0] + : expanded.toString().toCharArray(); + } + if (index < buffer.length) { + return buffer[index++]; + } + index = EOF; + } + return EOF; + } + + /** + * Creates a new ExpandProperties filter using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + ExpandProperties newFilter = new ExpandProperties(rdr); + newFilter.setProject(getProject()); + newFilter.add(propertySet); + return newFilter; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/FixCrLfFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/FixCrLfFilter.java new file mode 100644 index 00000000..8a37924c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/FixCrLfFilter.java @@ -0,0 +1,1004 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.taskdefs.condition.Os; +import org.apache.tools.ant.types.EnumeratedAttribute; + +/** + * Converts text to local OS formatting conventions, as well as repair text + * damaged by misconfigured or misguided editors or file transfer programs. + *

    + * This filter can take the following arguments: + *

      + *
    • eof + *
    • eol + *
    • fixlast + *
    • javafiles + *
    • tab + *
    • tablength + *
    + * None of which are required. + *

    + * This version generalises the handling of EOL characters, and allows for + * CR-only line endings (the standard on Mac systems prior to OS X). Tab + * handling has also been generalised to accommodate any tabwidth from 2 to 80, + * inclusive. Importantly, it can leave untouched any literal TAB characters + * embedded within Java string or character constants. + *

    + * Caution: run with care on carefully formatted files. This may + * sound obvious, but if you don't specify asis, presume that your files are + * going to be modified. If "tabs" is "add" or "remove", whitespace characters + * may be added or removed as necessary. Similarly, for EOLs, eol="asis" + * actually means convert to your native O/S EOL convention while eol="crlf" or + * cr="add" can result in CR characters being removed in one special case + * accommodated, i.e., CRCRLF is regarded as a single EOL to handle cases where + * other programs have converted CRLF into CRCRLF. + * + *

    + * Example: + * + *

    + * <<fixcrlf tab="add" eol="crlf" eof="asis"/>
    + * 
    + * + * Or: + * + *
    + * <filterreader classname="org.apache.tools.ant.filters.FixCrLfFilter">
    + *   <param eol="crlf" tab="asis"/>
    + *  </filterreader>
    + * 
    + * + */ +public final class FixCrLfFilter extends BaseParamFilterReader implements ChainableReader { + private static final int DEFAULT_TAB_LENGTH = 8; + private static final int MIN_TAB_LENGTH = 2; + private static final int MAX_TAB_LENGTH = 80; + private static final char CTRLZ = '\u001A'; + + private int tabLength = DEFAULT_TAB_LENGTH; + + private CrLf eol; + + private AddAsisRemove ctrlz; + + private AddAsisRemove tabs; + + private boolean javafiles = false; + + private boolean fixlast = true; + + private boolean initialized = false; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public FixCrLfFilter() { + super(); + } + + /** + * Create a new filtered reader. + * + * @param in + * A Reader object providing the underlying stream. Must not be + * null. + * @throws IOException on error. + */ + public FixCrLfFilter(final Reader in) throws IOException { + super(in); + } + + // Instance initializer: Executes just after the super() call in this + // class's constructor. + { + tabs = AddAsisRemove.ASIS; + if (Os.isFamily("mac") && !Os.isFamily("unix")) { + ctrlz = AddAsisRemove.REMOVE; + setEol(CrLf.MAC); + } else if (Os.isFamily("dos")) { + ctrlz = AddAsisRemove.ASIS; + setEol(CrLf.DOS); + } else { + ctrlz = AddAsisRemove.REMOVE; + setEol(CrLf.UNIX); + } + } + + /** + * Create a new FixCrLfFilter using the passed in Reader for instantiation. + * + * @param rdr + * A Reader object providing the underlying stream. Must not be + * null. + * + * @return a new filter based on this configuration, but filtering the + * specified reader. + */ + public Reader chain(final Reader rdr) { + try { + FixCrLfFilter newFilter = new FixCrLfFilter(rdr); + + newFilter.setJavafiles(getJavafiles()); + newFilter.setEol(getEol()); + newFilter.setTab(getTab()); + newFilter.setTablength(getTablength()); + newFilter.setEof(getEof()); + newFilter.setFixlast(getFixlast()); + newFilter.initInternalFilters(); + + return newFilter; + } catch (IOException e) { + throw new BuildException(e); + } + } + + /** + * Get how DOS EOF (control-z) characters are being handled. + * + * @return values: + *
      + *
    • add: ensure that there is an eof at the end of the file + *
    • asis: leave eof characters alone + *
    • remove: remove any eof character found at the end + *
    + */ + public AddAsisRemove getEof() { + // Return copy so that the call must call setEof() to change the state + // of fixCRLF + return ctrlz.newInstance(); + } + + /** + * Get how EndOfLine characters are being handled. + * + * @return values: + *
      + *
    • asis: convert line endings to your O/S convention + *
    • cr: convert line endings to CR + *
    • lf: convert line endings to LF + *
    • crlf: convert line endings to CRLF + *
    + */ + public CrLf getEol() { + // Return copy so that the call must call setEol() to change the state + // of fixCRLF + return eol.newInstance(); + } + + /** + * Get whether a missing EOL be added to the final line of the stream. + * + * @return true if a filtered file will always end with an EOL + */ + public boolean getFixlast() { + return fixlast; + } + + /** + * Get whether the stream is to be treated as though it contains Java + * source. + *

    + * This attribute is only used in association with the "tab" + * attribute. Tabs found in Java literals are protected from changes by this + * filter. + * + * @return true if whitespace in Java character and string literals is + * ignored. + */ + public boolean getJavafiles() { + return javafiles; + } + + /** + * Return how tab characters are being handled. + * + * @return values: + *

      + *
    • add: convert sequences of spaces which span a tab stop to + * tabs + *
    • asis: leave tab and space characters alone + *
    • remove: convert tabs to spaces + *
    + */ + public AddAsisRemove getTab() { + // Return copy so that the caller must call setTab() to change the state + // of fixCRLF. + return tabs.newInstance(); + } + + /** + * Get the tab length to use. + * + * @return the length of tab in spaces + */ + public int getTablength() { + return tabLength; + } + + private static String calculateEolString(CrLf eol) { + // Calculate the EOL string per the current config + if (eol == CrLf.CR || eol == CrLf.MAC) { + return "\r"; + } + if (eol == CrLf.CRLF || eol == CrLf.DOS) { + return "\r\n"; + } + // assume (eol == CrLf.LF || eol == CrLf.UNIX) + return "\n"; + } + + /** + * Wrap the input stream with the internal filters necessary to perform the + * configuration settings. + */ + private void initInternalFilters() { + + // If I'm removing an EOF character, do so first so that the other + // filters don't see that character. + in = (ctrlz == AddAsisRemove.REMOVE) ? new RemoveEofFilter(in) : in; + + // Change all EOL characters to match the calculated EOL string. If + // configured to do so, append a trailing EOL so that the file ends on + // a EOL. + if (eol != CrLf.ASIS) { + in = new NormalizeEolFilter(in, calculateEolString(eol), getFixlast()); + } + + if (tabs != AddAsisRemove.ASIS) { + // If filtering Java source, prevent changes to whitespace in + // character and string literals. + if (getJavafiles()) { + in = new MaskJavaTabLiteralsFilter(in); + } + // Add/Remove tabs + in = (tabs == AddAsisRemove.ADD) ? (Reader) new AddTabFilter(in, getTablength()) + : (Reader) new RemoveTabFilter(in, getTablength()); + } + // Add missing EOF character + in = (ctrlz == AddAsisRemove.ADD) ? new AddEofFilter(in) : in; + initialized = true; + } + + /** + * Return the next character in the filtered stream. + * + * @return the next character in the resulting stream, or -1 if the end of + * the resulting stream has been reached. + * + * @exception IOException + * if the underlying stream throws an IOException during + * reading. + */ + public synchronized int read() throws IOException { + if (!initialized) { + initInternalFilters(); + } + return in.read(); + } + + /** + * Specify how DOS EOF (control-z) characters are to be handled. + * + * @param attr + * valid values: + *
      + *
    • add: ensure that there is an eof at the end of the file + *
    • asis: leave eof characters alone + *
    • remove: remove any eof character found at the end + *
    + */ + public void setEof(AddAsisRemove attr) { + ctrlz = attr.resolve(); + } + + /** + * Specify how end of line (EOL) characters are to be handled. + * + * @param attr + * valid values: + *
      + *
    • asis: convert line endings to your O/S convention + *
    • cr: convert line endings to CR + *
    • lf: convert line endings to LF + *
    • crlf: convert line endings to CRLF + *
    + */ + public void setEol(CrLf attr) { + eol = attr.resolve(); + } + + /** + * Specify whether a missing EOL will be added to the final line of input. + * + * @param fixlast + * if true a missing EOL will be appended. + */ + public void setFixlast(boolean fixlast) { + this.fixlast = fixlast; + } + + /** + * Indicate whether this stream contains Java source. + * + * This attribute is only used in association with the "tab" + * attribute. + * + * @param javafiles + * set to true to prevent this filter from changing tabs found in + * Java literals. + */ + public void setJavafiles(boolean javafiles) { + this.javafiles = javafiles; + } + + /** + * Specify how tab characters are to be handled. + * + * @param attr + * valid values: + *
      + *
    • add: convert sequences of spaces which span a tab stop to + * tabs + *
    • asis: leave tab and space characters alone + *
    • remove: convert tabs to spaces + *
    + */ + public void setTab(AddAsisRemove attr) { + tabs = attr.resolve(); + } + + /** + * Specify tab length in characters. + * + * @param tabLength + * specify the length of tab in spaces. Valid values are between + * 2 and 80 inclusive. The default for this parameter is 8. + * @throws IOException on error. + */ + public void setTablength(int tabLength) throws IOException { + if (tabLength < MIN_TAB_LENGTH + || tabLength > MAX_TAB_LENGTH) { + throw new IOException( + "tablength must be between " + MIN_TAB_LENGTH + + " and " + MAX_TAB_LENGTH); + } + this.tabLength = tabLength; + } + + /** + * This filter reader redirects all read I/O methods through its own read() + * method. + * + *

    + * The input stream is already buffered by the copy task so this doesn't + * significantly impact performance while it makes writing the individual + * fix filters much easier. + *

    + */ + private static class SimpleFilterReader extends Reader { + private static final int PREEMPT_BUFFER_LENGTH = 16; + private Reader in; + + private int[] preempt = new int[PREEMPT_BUFFER_LENGTH]; + + private int preemptIndex = 0; + + public SimpleFilterReader(Reader in) { + this.in = in; + } + + public void push(char c) { + push((int) c); + } + + public void push(int c) { + try { + preempt[preemptIndex++] = c; + } catch (ArrayIndexOutOfBoundsException e) { + int[] p2 = new int[preempt.length * 2]; + System.arraycopy(preempt, 0, p2, 0, preempt.length); + preempt = p2; + push(c); + } + } + + public void push(char[] cs, int start, int length) { + for (int i = start + length - 1; i >= start;) { + push(cs[i--]); + } + } + + public void push(char[] cs) { + push(cs, 0, cs.length); + } + + /** + * Does this filter want to block edits on the last character returned + * by read()? + */ + public boolean editsBlocked() { + return in instanceof SimpleFilterReader && ((SimpleFilterReader) in).editsBlocked(); + } + + public int read() throws java.io.IOException { + return preemptIndex > 0 ? preempt[--preemptIndex] : in.read(); + } + + public void close() throws java.io.IOException { + in.close(); + } + + public void reset() throws IOException { + in.reset(); + } + + public boolean markSupported() { + return in.markSupported(); + } + + public boolean ready() throws java.io.IOException { + return in.ready(); + } + + public void mark(int i) throws java.io.IOException { + in.mark(i); + } + + public long skip(long i) throws java.io.IOException { + return in.skip(i); + } + + public int read(char[] buf) throws java.io.IOException { + return read(buf, 0, buf.length); + } + + public int read(char[] buf, int start, int length) throws java.io.IOException { + int count = 0; + int c = 0; + + // CheckStyle:InnerAssignment OFF - leave alone + while (length-- > 0 && (c = this.read()) != -1) { + buf[start++] = (char) c; + count++; + } + // if at EOF with no characters in the buffer, return EOF + return (count == 0 && c == -1) ? -1 : count; + } + } + + private static class MaskJavaTabLiteralsFilter extends SimpleFilterReader { + private boolean editsBlocked = false; + + private static final int JAVA = 1; + + private static final int IN_CHAR_CONST = 2; + + private static final int IN_STR_CONST = 3; + + private static final int IN_SINGLE_COMMENT = 4; + + private static final int IN_MULTI_COMMENT = 5; + + private static final int TRANS_TO_COMMENT = 6; + + private static final int TRANS_FROM_MULTI = 8; + + private int state; + + public MaskJavaTabLiteralsFilter(Reader in) { + super(in); + state = JAVA; + } + + public boolean editsBlocked() { + return editsBlocked || super.editsBlocked(); + } + + public int read() throws IOException { + int thisChar = super.read(); + // Mask, block from being edited, all characters in constants. + editsBlocked = (state == IN_CHAR_CONST || state == IN_STR_CONST); + + switch (state) { + case JAVA: + // The current character is always emitted. + switch (thisChar) { + case '\'': + state = IN_CHAR_CONST; + break; + case '"': + state = IN_STR_CONST; + break; + case '/': + state = TRANS_TO_COMMENT; + break; + default: + // Fall tru + } + break; + case IN_CHAR_CONST: + switch (thisChar) { + case '\'': + state = JAVA; + break; + default: + // Fall tru + } + break; + case IN_STR_CONST: + switch (thisChar) { + case '"': + state = JAVA; + break; + default: + // Fall tru + } + break; + case IN_SINGLE_COMMENT: + // The current character is always emitted. + switch (thisChar) { + case '\n': + case '\r': // EOL + state = JAVA; + break; + default: + // Fall tru + } + break; + case IN_MULTI_COMMENT: + // The current character is always emitted. + switch (thisChar) { + case '*': + state = TRANS_FROM_MULTI; + break; + default: + // Fall tru + } + break; + case TRANS_TO_COMMENT: + // The current character is always emitted. + switch (thisChar) { + case '*': + state = IN_MULTI_COMMENT; + break; + case '/': + state = IN_SINGLE_COMMENT; + break; + case '\'': + state = IN_CHAR_CONST; + break; + case '"': + state = IN_STR_CONST; + break; + default: + state = JAVA; + } + break; + case TRANS_FROM_MULTI: + // The current character is always emitted. + switch (thisChar) { + case '/': + state = JAVA; + break; + default: + // Fall tru + } + break; + default: + // Fall tru + } + return thisChar; + } + } + + private static class NormalizeEolFilter extends SimpleFilterReader { + private boolean previousWasEOL; + + private boolean fixLast; + + private int normalizedEOL = 0; + + private char[] eol = null; + + public NormalizeEolFilter(Reader in, String eolString, boolean fixLast) { + super(in); + eol = eolString.toCharArray(); + this.fixLast = fixLast; + } + + public int read() throws IOException { + int thisChar = super.read(); + + if (normalizedEOL == 0) { + int numEOL = 0; + boolean atEnd = false; + switch (thisChar) { + case CTRLZ: + int c = super.read(); + if (c == -1) { + atEnd = true; + if (fixLast && !previousWasEOL) { + numEOL = 1; + push(thisChar); + } + } else { + push(c); + } + break; + case -1: + atEnd = true; + if (fixLast && !previousWasEOL) { + numEOL = 1; + } + break; + case '\n': + // EOL was "\n" + numEOL = 1; + break; + case '\r': + numEOL = 1; + int c1 = super.read(); + int c2 = super.read(); + + if (c1 == '\r' && c2 == '\n') { + // EOL was "\r\r\n" + } else if (c1 == '\r') { + // EOL was "\r\r" - handle as two consecutive "\r" and + // "\r" + numEOL = 2; + push(c2); + } else if (c1 == '\n') { + // EOL was "\r\n" + push(c2); + } else { + // EOL was "\r" + push(c2); + push(c1); + } + default: + // Fall tru + } + if (numEOL > 0) { + while (numEOL-- > 0) { + push(eol); + normalizedEOL += eol.length; + } + previousWasEOL = true; + thisChar = read(); + } else if (!atEnd) { + previousWasEOL = false; + } + } else { + normalizedEOL--; + } + return thisChar; + } + } + + private static class AddEofFilter extends SimpleFilterReader { + private int lastChar = -1; + + public AddEofFilter(Reader in) { + super(in); + } + + public int read() throws IOException { + int thisChar = super.read(); + + // if source is EOF but last character was NOT ctrl-z, return ctrl-z + if (thisChar == -1) { + if (lastChar != CTRLZ) { + lastChar = CTRLZ; + return lastChar; + } + } else { + lastChar = thisChar; + } + return thisChar; + } + } + + private static class RemoveEofFilter extends SimpleFilterReader { + private int lookAhead = -1; + + public RemoveEofFilter(Reader in) { + super(in); + + try { + lookAhead = in.read(); + } catch (IOException e) { + lookAhead = -1; + } + } + + public int read() throws IOException { + int lookAhead2 = super.read(); + + // If source at EOF and lookAhead is ctrl-z, return EOF (NOT ctrl-z) + if (lookAhead2 == -1 && lookAhead == CTRLZ) { + return -1; + } + // Return current look-ahead + int i = lookAhead; + lookAhead = lookAhead2; + return i; + } + } + + private static class AddTabFilter extends SimpleFilterReader { + private int columnNumber = 0; + + private int tabLength = 0; + + public AddTabFilter(Reader in, int tabLength) { + super(in); + this.tabLength = tabLength; + } + + public int read() throws IOException { + int c = super.read(); + + switch (c) { + case '\r': + case '\n': + columnNumber = 0; + break; + case ' ': + columnNumber++; + if (!editsBlocked()) { + int colNextTab = ((columnNumber + tabLength - 1) / tabLength) * tabLength; + int countSpaces = 1; + int numTabs = 0; + + scanWhitespace: while ((c = super.read()) != -1) { + switch (c) { + case ' ': + if (++columnNumber == colNextTab) { + numTabs++; + countSpaces = 0; + colNextTab += tabLength; + } else { + countSpaces++; + } + break; + case '\t': + columnNumber = colNextTab; + numTabs++; + countSpaces = 0; + colNextTab += tabLength; + break; + default: + push(c); + break scanWhitespace; + } + } + while (countSpaces-- > 0) { + push(' '); + columnNumber--; + } + while (numTabs-- > 0) { + push('\t'); + columnNumber -= tabLength; + } + c = super.read(); + switch (c) { + case ' ': + columnNumber++; + break; + case '\t': + columnNumber += tabLength; + break; + default: + // Fall tru + } + } + break; + case '\t': + columnNumber = ((columnNumber + tabLength - 1) / tabLength) * tabLength; + break; + default: + columnNumber++; + } + return c; + } + } + + private static class RemoveTabFilter extends SimpleFilterReader { + private int columnNumber = 0; + + private int tabLength = 0; + + public RemoveTabFilter(Reader in, int tabLength) { + super(in); + + this.tabLength = tabLength; + } + + public int read() throws IOException { + int c = super.read(); + + switch (c) { + case '\r': + case '\n': + columnNumber = 0; + break; + case '\t': + int width = tabLength - columnNumber % tabLength; + + if (!editsBlocked()) { + for (; width > 1; width--) { + push(' '); + } + c = ' '; + } + columnNumber += width; + break; + default: + columnNumber++; + } + return c; + } + } + + /** + * Enumerated attribute with the values "asis", "add" and "remove". + */ + public static class AddAsisRemove extends EnumeratedAttribute { + private static final AddAsisRemove ASIS = newInstance("asis"); + + private static final AddAsisRemove ADD = newInstance("add"); + + private static final AddAsisRemove REMOVE = newInstance("remove"); + + /** {@inheritDoc}. */ + public String[] getValues() { + return new String[] {"add", "asis", "remove"}; + } + + /** + * Equality depending in the index. + * @param other the object to test equality against. + * @return true if the object has the same index as this. + */ + public boolean equals(Object other) { + return other instanceof AddAsisRemove + && getIndex() == ((AddAsisRemove) other).getIndex(); + } + + /** + * Hashcode depending on the index. + * @return the index as the hashcode. + */ + public int hashCode() { + return getIndex(); + } + + AddAsisRemove resolve() throws IllegalStateException { + if (this.equals(ASIS)) { + return ASIS; + } + if (this.equals(ADD)) { + return ADD; + } + if (this.equals(REMOVE)) { + return REMOVE; + } + throw new IllegalStateException("No replacement for " + this); + } + + // Works like clone() but doesn't show up in the Javadocs + private AddAsisRemove newInstance() { + return newInstance(getValue()); + } + + /** + * Create an instance of this enumerated value based on the string value. + * @param value the value to use. + * @return an enumerated instance. + */ + public static AddAsisRemove newInstance(String value) { + AddAsisRemove a = new AddAsisRemove(); + a.setValue(value); + return a; + } + } + + /** + * Enumerated attribute with the values "asis", "cr", "lf" and "crlf". + */ + public static class CrLf extends EnumeratedAttribute { + private static final CrLf ASIS = newInstance("asis"); + + private static final CrLf CR = newInstance("cr"); + + private static final CrLf CRLF = newInstance("crlf"); + + private static final CrLf DOS = newInstance("dos"); + + private static final CrLf LF = newInstance("lf"); + + private static final CrLf MAC = newInstance("mac"); + + private static final CrLf UNIX = newInstance("unix"); + + /** + * @see EnumeratedAttribute#getValues + */ + /** {@inheritDoc}. */ + public String[] getValues() { + return new String[] {"asis", "cr", "lf", "crlf", "mac", "unix", "dos"}; + } + + /** + * Equality depending in the index. + * @param other the object to test equality against. + * @return true if the object has the same index as this. + */ + public boolean equals(Object other) { + return other instanceof CrLf && getIndex() == ((CrLf) other).getIndex(); + } + + /** + * Hashcode depending on the index. + * @return the index as the hashcode. + */ + public int hashCode() { + return getIndex(); + } + + CrLf resolve() { + if (this.equals(ASIS)) { + return ASIS; + } + if (this.equals(CR) || this.equals(MAC)) { + return CR; + } + if (this.equals(CRLF) || this.equals(DOS)) { + return CRLF; + } + if (this.equals(LF) || this.equals(UNIX)) { + return LF; + } + throw new IllegalStateException("No replacement for " + this); + } + + // Works like clone() but doesn't show up in the Javadocs + private CrLf newInstance() { + return newInstance(getValue()); + } + + /** + * Create an instance of this enumerated value based on the string value. + * @param value the value to use. + * @return an enumerated instance. + */ + public static CrLf newInstance(String value) { + CrLf c = new CrLf(); + c.setValue(value); + return c; + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/HeadFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/HeadFilter.java new file mode 100644 index 00000000..522fe57b --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/HeadFilter.java @@ -0,0 +1,222 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.util.LineTokenizer; + +/** + * Reads the first n lines of a stream. + * (Default is first 10 lines.) + *

    + * Example: + *

    <headfilter lines="3"/>
    + * Or: + *
    <filterreader classname="org.apache.tools.ant.filters.HeadFilter">
    + *    <param name="lines" value="3"/>
    + * </filterreader>
    + * + */ +public final class HeadFilter extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the number of lines to be returned. */ + private static final String LINES_KEY = "lines"; + + /** Parameter name for the number of lines to be skipped. */ + private static final String SKIP_KEY = "skip"; + + /** Number of lines currently read in. */ + private long linesRead = 0; + + /** Default number of lines to show */ + private static final int DEFAULT_NUM_LINES = 10; + + /** Number of lines to be returned in the filtered stream. */ + private long lines = DEFAULT_NUM_LINES; + + /** Number of lines to be skipped. */ + private long skip = 0; + + /** A line tokenizer */ + private LineTokenizer lineTokenizer = null; + + /** the current line from the input stream */ + private String line = null; + /** the position in the current line */ + private int linePos = 0; + + /** Whether this filter is finished */ + private boolean eof; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public HeadFilter() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public HeadFilter(final Reader in) { + super(in); + lineTokenizer = new LineTokenizer(); + lineTokenizer.setIncludeDelims(true); + } + + /** + * Returns the next character in the filtered stream. If the desired + * number of lines have already been read, the resulting stream is + * effectively at an end. Otherwise, the next character from the + * underlying stream is read and returned. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + while (line == null || line.length() == 0) { + line = lineTokenizer.getToken(in); + if (line == null) { + return -1; + } + line = headFilter(line); + if (eof) { + return -1; + } + linePos = 0; + } + + int ch = line.charAt(linePos); + linePos++; + if (linePos == line.length()) { + line = null; + } + return ch; + } + + /** + * Sets the number of lines to be returned in the filtered stream. + * + * @param lines the number of lines to be returned in the filtered stream + */ + public void setLines(final long lines) { + this.lines = lines; + } + + /** + * Returns the number of lines to be returned in the filtered stream. + * + * @return the number of lines to be returned in the filtered stream + */ + private long getLines() { + return lines; + } + + /** + * Sets the number of lines to be skipped in the filtered stream. + * + * @param skip the number of lines to be skipped in the filtered stream + */ + public void setSkip(final long skip) { + this.skip = skip; + } + + /** + * Returns the number of lines to be skipped in the filtered stream. + * + * @return the number of lines to be skipped in the filtered stream + */ + private long getSkip() { + return skip; + } + + /** + * Creates a new HeadFilter using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + HeadFilter newFilter = new HeadFilter(rdr); + newFilter.setLines(getLines()); + newFilter.setSkip(getSkip()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Scans the parameters list for the "lines" parameter and uses + * it to set the number of lines to be returned in the filtered stream. + * also scan for skip parameter. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (LINES_KEY.equals(params[i].getName())) { + lines = Long.parseLong(params[i].getValue()); + continue; + } + if (SKIP_KEY.equals(params[i].getName())) { + skip = Long.parseLong(params[i].getValue()); + continue; + } + } + } + } + + /** + * implements a head filter on the input stream + */ + private String headFilter(String line) { + linesRead++; + if (skip > 0) { + if ((linesRead - 1) < skip) { + return null; + } + } + + if (lines > 0) { + if (linesRead > (lines + skip)) { + eof = true; + return null; + } + } + return line; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContains.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContains.java new file mode 100644 index 00000000..c83cae28 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContains.java @@ -0,0 +1,244 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.Vector; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.Parameter; + +/** + * Filter which includes only those lines that contain all the user-specified + * strings. + * + * Example: + * + *
    <linecontains>
    + *   <contains value="foo">
    + *   <contains value="bar">
    + * </linecontains>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.LineContains">
    + *    <param type="contains" value="foo"/>
    + *    <param type="contains" value="bar"/>
    + * </filterreader>
    + * + * This will include only those lines that contain foo and + * bar. + * + */ +public final class LineContains + extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the words to filter on. */ + private static final String CONTAINS_KEY = "contains"; + + /** Parameter name for the words to filter on. */ + private static final String NEGATE_KEY = "negate"; + + /** Vector that holds the strings that input lines must contain. */ + private Vector contains = new Vector(); + + /** + * Remaining line to be read from this filter, or null if + * the next call to read() should read the original stream + * to find the next matching line. + */ + private String line = null; + + private boolean negate = false; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public LineContains() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public LineContains(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, only including + * lines from the original stream which contain all of the specified words. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (line != null) { + ch = line.charAt(0); + if (line.length() == 1) { + line = null; + } else { + line = line.substring(1); + } + } else { + final int containsSize = contains.size(); + + for (line = readLine(); line != null; line = readLine()) { + boolean matches = true; + for (int i = 0; matches && i < containsSize; i++) { + String containsStr = (String) contains.elementAt(i); + matches = line.indexOf(containsStr) >= 0; + } + if (matches ^ isNegated()) { + break; + } + } + if (line != null) { + return read(); + } + } + return ch; + } + + /** + * Adds a contains element. + * + * @param contains The contains element to add. + * Must not be null. + */ + public void addConfiguredContains(final Contains contains) { + this.contains.addElement(contains.getValue()); + } + + /** + * Set the negation mode. Default false (no negation). + * @param b the boolean negation mode to set. + */ + public void setNegate(boolean b) { + negate = b; + } + + /** + * Find out whether we have been negated. + * @return boolean negation flag. + */ + public boolean isNegated() { + return negate; + } + + /** + * Sets the vector of words which must be contained within a line read + * from the original stream in order for it to match this filter. + * + * @param contains A vector of words which must be contained within a line + * in order for it to match in this filter. Must not be null. + */ + private void setContains(final Vector contains) { + this.contains = contains; + } + + /** + * Returns the vector of words which must be contained within a line read + * from the original stream in order for it to match this filter. + * + * @return the vector of words which must be contained within a line read + * from the original stream in order for it to match this filter. The + * returned object is "live" - in other words, changes made to the + * returned object are mirrored in the filter. + */ + private Vector getContains() { + return contains; + } + + /** + * Creates a new LineContains using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + LineContains newFilter = new LineContains(rdr); + newFilter.setContains(getContains()); + newFilter.setNegate(isNegated()); + return newFilter; + } + + /** + * Parses the parameters to add user-defined contains strings. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (CONTAINS_KEY.equals(params[i].getType())) { + contains.addElement(params[i].getValue()); + } else if (NEGATE_KEY.equals(params[i].getType())) { + setNegate(Project.toBoolean(params[i].getValue())); + } + } + } + } + + /** + * Holds a contains element + */ + public static class Contains { + + /** User defined contains string */ + private String value; + + /** + * Sets the contains string + * + * @param contains The contains string to set. + * Must not be null. + */ + public final void setValue(String contains) { + value = contains; + } + + /** + * Returns the contains string. + * + * @return the contains string for this element + */ + public final String getValue() { + return value; + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java new file mode 100644 index 00000000..23a2005d --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java @@ -0,0 +1,242 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.Vector; + +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.types.RegularExpression; +import org.apache.tools.ant.util.regexp.Regexp; +import org.apache.tools.ant.util.regexp.RegexpUtil; + +/** + * Filter which includes only those lines that contain the user-specified + * regular expression matching strings. + * + * Example: + *
    <linecontainsregexp>
    + *   <regexp pattern="foo*">
    + * </linecontainsregexp>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.LineContainsRegExp">
    + *    <param type="regexp" value="foo*"/>
    + * </filterreader>
    + * + * This will fetch all those lines that contain the pattern foo + * + */ +public final class LineContainsRegExp + extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the regular expression to filter on. */ + private static final String REGEXP_KEY = "regexp"; + + /** Parameter name for the negate attribute. */ + private static final String NEGATE_KEY = "negate"; + + /** Parameter name for the casesensitive attribute. */ + private static final String CS_KEY = "casesensitive"; + + /** Vector that holds the expressions that input lines must contain. */ + private Vector regexps = new Vector(); + + /** + * Remaining line to be read from this filter, or null if + * the next call to read() should read the original stream + * to find the next matching line. + */ + private String line = null; + + private boolean negate = false; + private int regexpOptions = Regexp.MATCH_DEFAULT; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public LineContainsRegExp() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public LineContainsRegExp(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, only including + * lines from the original stream which match all of the specified + * regular expressions. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (line != null) { + ch = line.charAt(0); + if (line.length() == 1) { + line = null; + } else { + line = line.substring(1); + } + } else { + final int regexpsSize = regexps.size(); + + for (line = readLine(); line != null; line = readLine()) { + boolean matches = true; + for (int i = 0; matches && i < regexpsSize; i++) { + RegularExpression regexp + = (RegularExpression) regexps.elementAt(i); + Regexp re = regexp.getRegexp(getProject()); + matches = re.matches(line, regexpOptions); + } + if (matches ^ isNegated()) { + break; + } + } + if (line != null) { + return read(); + } + } + return ch; + } + + /** + * Adds a regexp element. + * + * @param regExp The regexp element to add. + * Must not be null. + */ + public void addConfiguredRegexp(final RegularExpression regExp) { + this.regexps.addElement(regExp); + } + + /** + * Sets the vector of regular expressions which must be contained within + * a line read from the original stream in order for it to match this + * filter. + * + * @param regexps A vector of regular expressions which must be contained + * within a line in order for it to match in this filter. Must not be + * null. + */ + private void setRegexps(final Vector regexps) { + this.regexps = regexps; + } + + /** + * Returns the vector of regular expressions which must be contained within + * a line read from the original stream in order for it to match this + * filter. + * + * @return the vector of regular expressions which must be contained within + * a line read from the original stream in order for it to match this + * filter. The returned object is "live" - in other words, changes made to + * the returned object are mirrored in the filter. + */ + private Vector getRegexps() { + return regexps; + } + + /** + * Creates a new LineContainsRegExp using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + LineContainsRegExp newFilter = new LineContainsRegExp(rdr); + newFilter.setRegexps(getRegexps()); + newFilter.setNegate(isNegated()); + newFilter + .setCaseSensitive(!RegexpUtil.hasFlag(regexpOptions, + Regexp.MATCH_CASE_INSENSITIVE) + ); + return newFilter; + } + + /** + * Set the negation mode. Default false (no negation). + * @param b the boolean negation mode to set. + */ + public void setNegate(boolean b) { + negate = b; + } + + /** + * Whether to match casesensitevly. + * @since Ant 1.8.2 + */ + public void setCaseSensitive(boolean b) { + regexpOptions = RegexpUtil.asOptions(b); + } + + /** + * Find out whether we have been negated. + * @return boolean negation flag. + */ + public boolean isNegated() { + return negate; + } + + /** + * Parses parameters to add user defined regular expressions. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (REGEXP_KEY.equals(params[i].getType())) { + String pattern = params[i].getValue(); + RegularExpression regexp = new RegularExpression(); + regexp.setPattern(pattern); + regexps.addElement(regexp); + } else if (NEGATE_KEY.equals(params[i].getType())) { + setNegate(Project.toBoolean(params[i].getValue())); + } else if (CS_KEY.equals(params[i].getType())) { + setCaseSensitive(Project.toBoolean(params[i].getValue())); + } + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/PrefixLines.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/PrefixLines.java new file mode 100644 index 00000000..324397e8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/PrefixLines.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; + +/** + * Attaches a prefix to every line. + * + * Example: + *
    <prefixlines prefix="Foo"/>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.PrefixLines">
    + *  <param name="prefix" value="Foo"/>
    + * </filterreader>
    + * + */ +public final class PrefixLines + extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the prefix. */ + private static final String PREFIX_KEY = "prefix"; + + /** The prefix to be used. */ + private String prefix = null; + + /** Data that must be read from, if not null. */ + private String queuedData = null; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public PrefixLines() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public PrefixLines(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream. One line is read + * from the original input, and the prefix added. The resulting + * line is then used until it ends, at which point the next original line + * is read, etc. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (queuedData != null && queuedData.length() == 0) { + queuedData = null; + } + + if (queuedData != null) { + ch = queuedData.charAt(0); + queuedData = queuedData.substring(1); + if (queuedData.length() == 0) { + queuedData = null; + } + } else { + queuedData = readLine(); + if (queuedData == null) { + ch = -1; + } else { + if (prefix != null) { + queuedData = prefix + queuedData; + } + return read(); + } + } + return ch; + } + + /** + * Sets the prefix to add at the start of each input line. + * + * @param prefix The prefix to add at the start of each input line. + * May be null, in which case no prefix + * is added. + */ + public void setPrefix(final String prefix) { + this.prefix = prefix; + } + + /** + * Returns the prefix which will be added at the start of each input line. + * + * @return the prefix which will be added at the start of each input line + */ + private String getPrefix() { + return prefix; + } + + /** + * Creates a new PrefixLines filter using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + PrefixLines newFilter = new PrefixLines(rdr); + newFilter.setPrefix(getPrefix()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Initializes the prefix if it is available from the parameters. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (PREFIX_KEY.equals(params[i].getName())) { + prefix = params[i].getValue(); + break; + } + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ReplaceTokens.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ReplaceTokens.java new file mode 100644 index 00000000..21ca3bc9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/ReplaceTokens.java @@ -0,0 +1,379 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Properties; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.util.FileUtils; + +/** + * Replaces tokens in the original input with user-supplied values. + * + * Example: + * + *
    <replacetokens begintoken="#" endtoken="#">
    + *   <token key="DATE" value="${TODAY}"/>
    + * </replacetokens>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens">
    + *   <param type="tokenchar" name="begintoken" value="#"/>
    + *   <param type="tokenchar" name="endtoken" value="#"/>
    + *   <param type="token" name="DATE" value="${TODAY}"/>
    + * </filterreader>
    + * + */ +public final class ReplaceTokens + extends BaseParamFilterReader + implements ChainableReader { + /** Default "begin token" character. */ + private static final String DEFAULT_BEGIN_TOKEN = "@"; + + /** Default "end token" character. */ + private static final String DEFAULT_END_TOKEN = "@"; + + /** Hashtable to holds the original replacee-replacer pairs (String to String). */ + private Hashtable hash = new Hashtable(); + + /** This map holds the "resolved" tokens (begin- and end-tokens are added to make searching simpler) */ + private final TreeMap resolvedTokens = new TreeMap(); + private boolean resolvedTokensBuilt = false; + /** Used for comparisons and lookup into the resolvedTokens map. */ + private String readBuffer = ""; + + /** replacement test from a token */ + private String replaceData = null; + + /** Index into replacement data */ + private int replaceIndex = -1; + + /** Character marking the beginning of a token. */ + private String beginToken = DEFAULT_BEGIN_TOKEN; + + /** Character marking the end of a token. */ + private String endToken = DEFAULT_END_TOKEN; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public ReplaceTokens() {} + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public ReplaceTokens(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, replacing tokens + * from the original stream. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + if (!resolvedTokensBuilt) { + // build the resolved tokens tree map. + for (String key : hash.keySet()) { + resolvedTokens.put(beginToken + key + endToken, hash.get(key)); + } + resolvedTokensBuilt = true; + } + + // are we currently serving replace data? + if (replaceData != null) { + if (replaceIndex < replaceData.length()) { + return replaceData.charAt(replaceIndex++); + } else { + replaceData = null; + } + } + + // is the read buffer empty? + if (readBuffer.length() == 0) { + int next = in.read(); + if (next == -1) { + return next; // end of stream. all buffers empty. + } + readBuffer += (char)next; + } + + for (;;) { + // get the closest tokens + SortedMap possibleTokens = resolvedTokens.tailMap(readBuffer); + if (possibleTokens.isEmpty() || !possibleTokens.firstKey().startsWith(readBuffer)) { // if there is none, then deliver the first char from the buffer. + return getFirstCharacterFromReadBuffer(); + } else if (readBuffer.equals(possibleTokens.firstKey())) { // there exists a nearest token - is it an exact match? + // we have found a token. prepare the replaceData buffer. + replaceData = resolvedTokens.get(readBuffer); + replaceIndex = 0; + readBuffer = ""; // destroy the readBuffer - it's contents are being replaced entirely. + // get the first character via recursive call. + return read(); + } else { // nearest token is not matching exactly - read one character more. + int next = in.read(); + if (next != -1) { + readBuffer += (char)next; + } else { + return getFirstCharacterFromReadBuffer(); // end of stream. deliver remaining characters from buffer. + } + } + } + } + + /** + * @return the first character from the read buffer or -1 if read buffer is empty. + */ + private int getFirstCharacterFromReadBuffer() { + if (readBuffer.length() > 0) { + int chr = readBuffer.charAt(0); + readBuffer = readBuffer.substring(1); + return chr; + } else { + return -1; + } + } + + /** + * Sets the "begin token" character. + * + * @param beginToken the character used to denote the beginning of a token + */ + public void setBeginToken(final String beginToken) { + this.beginToken = beginToken; + } + + /** + * Returns the "begin token" character. + * + * @return the character used to denote the beginning of a token + */ + private String getBeginToken() { + return beginToken; + } + + /** + * Sets the "end token" character. + * + * @param endToken the character used to denote the end of a token + */ + public void setEndToken(final String endToken) { + this.endToken = endToken; + } + + /** + * Returns the "end token" character. + * + * @return the character used to denote the end of a token + */ + private String getEndToken() { + return endToken; + } + + /** + * A resource containing properties, each of which is interpreted + * as a token/value pair. + * + * @since Ant 1.8.0 + */ + public void setPropertiesResource(Resource r) { + makeTokensFromProperties(r); + } + + /** + * Adds a token element to the map of tokens to replace. + * + * @param token The token to add to the map of replacements. + * Must not be null. + */ + public void addConfiguredToken(final Token token) { + hash.put(token.getKey(), token.getValue()); + resolvedTokensBuilt = false; // invalidate to build them again if they have been built already. + } + + /** + * Returns properties from a specified properties file. + * + * @param resource The resource to load properties from. + */ + private Properties getProperties(Resource resource) { + InputStream in = null; + Properties props = new Properties(); + try { + in = resource.getInputStream(); + props.load(in); + } catch (IOException ioe) { + ioe.printStackTrace(); + } finally { + FileUtils.close(in); + } + + return props; + } + + /** + * Sets the map of tokens to replace. + * + * @param hash A map (String->String) of token keys to replacement + * values. Must not be null. + */ + private void setTokens(final Hashtable hash) { + this.hash = hash; + } + + /** + * Returns the map of tokens which will be replaced. + * + * @return a map (String->String) of token keys to replacement + * values + */ + private Hashtable getTokens() { + return hash; + } + + /** + * Creates a new ReplaceTokens using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + ReplaceTokens newFilter = new ReplaceTokens(rdr); + newFilter.setBeginToken(getBeginToken()); + newFilter.setEndToken(getEndToken()); + newFilter.setTokens(getTokens()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Initializes tokens and loads the replacee-replacer hashtable. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (Parameter param : params) { + if (param != null) { + final String type = param.getType(); + if ("tokenchar".equals(type)) { + final String name = param.getName(); + if ("begintoken".equals(name)) { + beginToken = param.getValue(); + } else if ("endtoken".equals(name)) { + endToken = param.getValue(); + } + } else if ("token".equals(type)) { + final String name = param.getName(); + final String value = param.getValue(); + hash.put(name, value); + } else if ("propertiesfile".equals(type)) { + makeTokensFromProperties( + new FileResource(new File(param.getValue()))); + } + } + } + } + } + + private void makeTokensFromProperties(Resource r) { + Properties props = getProperties(r); + for (Enumeration e = props.keys(); e.hasMoreElements();) { + String key = (String) e.nextElement(); + String value = props.getProperty(key); + hash.put(key, value); + } + } + + /** + * Holds a token + */ + public static class Token { + + /** Token key */ + private String key; + + /** Token value */ + private String value; + + /** + * Sets the token key + * + * @param key The key for this token. Must not be null. + */ + public final void setKey(String key) { + this.key = key; + } + + /** + * Sets the token value + * + * @param value The value for this token. Must not be null. + */ + public final void setValue(String value) { + this.value = value; + } + + /** + * Returns the key for this token. + * + * @return the key for this token + */ + public final String getKey() { + return key; + } + + /** + * Returns the value for this token. + * + * @return the value for this token + */ + public final String getValue() { + return value; + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SortFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SortFilter.java new file mode 100644 index 00000000..471660c3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SortFilter.java @@ -0,0 +1,375 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.types.Parameter; + +/** + *

    + * Sort a file before and/or after the file. + *

    + * + *

    + * Examples: + *

    + * + *
    + *   <copy todir="build">
    + *       <fileset dir="input" includes="*.txt"/>
    + *       <filterchain>
    + *           <sortfilter/>
    + *       </filterchain>
    + *   </copy>
    + * 
    + * + *

    + * Sort all files *.txt from src location and copy + * them into build location. The lines of each file are sorted + * in ascendant order comparing the lines via the + * String.compareTo(Object o) method. + *

    + * + *
    + *   <copy todir="build">
    + *       <fileset dir="input" includes="*.txt"/>
    + *       <filterchain>
    + *           <sortfilter reverse="true"/>
    + *       </filterchain>
    + *   </copy>
    + * 
    + * + *

    + * Sort all files *.txt from src location into reverse + * order and copy them into build location. If reverse parameter has + * value true (default value), then the output line of the files + * will be in ascendant order. + *

    + * + *
    + *   <copy todir="build">
    + *       <fileset dir="input" includes="*.txt"/>
    + *       <filterchain>
    + *           <filterreader classname="org.apache.tools.ant.filters.SortFilter">
    + *             <param name="comparator" value="org.apache.tools.ant.filters.EvenFirstCmp"/>
    + *           </filterreader>
    + *       </filterchain>
    + *   </copy>
    + * 
    + * + *

    + * Sort all files *.txt from src location using as + * sorting criterium EvenFirstCmp class, that sorts the file + * lines putting even lines first then odd lines for example. The modified files + * are copied into build location. The EvenFirstCmp, + * has to an instanciable class via Class.newInstance(), + * therefore in case of inner class has to be static. It also has to + * implement java.util.Comparator interface, for example: + *

    + * + *
    + *         package org.apache.tools.ant.filters;
    + *         ...(omitted)
    + *           public final class EvenFirstCmp implements <b>Comparator</b> {
    + *             public int compare(Object o1, Object o2) {
    + *             ...(omitted)
    + *             }
    + *           }
    + * 
    + * + *

    The example above is equivalent to:

    + * + *
    + *   <componentdef name="evenfirst"
    + *                 classname="org.apache.tools.ant.filters.EvenFirstCmp"/>
    + *   <copy todir="build">
    + *       <fileset dir="input" includes="*.txt"/>
    + *       <filterchain>
    + *           <sortfilter>
    + *               <evenfirst/>
    + *           </sortfilter>
    + *       </filterchain>
    + *   </copy>
    + * 
    + * + *

    If parameter comparator is present, then + * reverse parameter will not be taken into account.

    + * + * @since Ant 1.8.0 + */ +public final class SortFilter extends BaseParamFilterReader + implements ChainableReader { + + /** Parameter name for reverse order. */ + private static final String REVERSE_KEY = "reverse"; + + /** + * Parameter name for specifying the comparator criteria via class that + * implement java.util.Comparator interface. + */ + private static final String COMPARATOR_KEY = "comparator"; + + /** + * Instance of comparator class to be used for sorting. + */ + private Comparator comparator = null; + + /** + * Controls if the sorting process will be in ascendant/descendant order. If + * If has value true, then the line of the file will be + * sorted on descendant order. Default value: false. It will + * be considered only if comparator is null. + */ + private boolean reverse; + + /** + * Stores the lines to be sorted. + */ + private List lines; + + /** + * Remaining line to be read from this filter, or null if the + * next call to read() should read the original stream to + * find the next matching line. + */ + private String line = null; + + private Iterator iterator = null; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public SortFilter() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in + * A Reader object providing the underlying stream. Must not be + * null. + */ + public SortFilter(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream. If the desired number + * of lines have already been read, the resulting stream is effectively at + * an end. Otherwise, the next character from the underlying stream is read + * and returned. + * + * @return the next character in the resulting stream, or -1 if the end of + * the resulting stream has been reached + * + * @exception IOException + * if the underlying stream throws an IOException during + * reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + if (line != null) { + /* + * We are on the state: "reading the current line", lines are + * already sorted + */ + ch = line.charAt(0); + if (line.length() == 1) { + line = null; + } else { + line = line.substring(1); + } + } else { + if (lines == null) { + // We read all lines and sort them + lines = new ArrayList(); + for (line = readLine(); line != null; line = readLine()) { + lines.add(line); + } + sort(); + iterator = lines.iterator(); + } + + if (iterator.hasNext()) { + line = (String) iterator.next(); + } else { + line = null; + lines = null; + iterator = null; + } + if (line != null) { + return read(); + } + } + return ch; + } + + /** + * Creates a new SortReader using the passed in Reader for instantiation. + * + * @param rdr + * A Reader object providing the underlying stream. Must not be + * null. + * + * @return a new filter based on this configuration, but filtering the + * specified reader + */ + public Reader chain(final Reader rdr) { + SortFilter newFilter = new SortFilter(rdr); + newFilter.setReverse(isReverse()); + newFilter.setComparator(getComparator()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Returns true if the sorting process will be in reverse + * order, otherwise the sorting process will be in ascendant order. + * + * @return true if the sorting process will be in reverse + * order, otherwise the sorting process will be in ascendant order. + */ + public boolean isReverse() { + return reverse; + } + + /** + * Sets the sorting process will be in ascendant (reverse=false) + * or to descendant (reverse=true). + * + * @param reverse + * Boolean representing reverse ordering process. + */ + public void setReverse(boolean reverse) { + this.reverse = reverse; + } + + /** + * Returns the comparator to be used for sorting. + * + * @return the comparator + */ + public Comparator getComparator() { + return comparator; + } + + /** + * Set the comparator to be used as sorting criterium. + * + * @param comparator + * the comparator to set + */ + public void setComparator(Comparator comparator) { + this.comparator = comparator; + } + + /** + * Set the comparator to be used as sorting criterion as nested element. + * + * @param comparator + * the comparator to set + */ + public void add(Comparator comparator) { + if (this.comparator != null && comparator != null) { + throw new BuildException("can't have more than one comparator"); + } + setComparator(comparator); + } + + /** + * Scans the parameters list + */ + private void initialize() throws IOException { + // get parameters + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + final String paramName = params[i].getName(); + if (REVERSE_KEY.equals(paramName)) { + setReverse(Boolean.valueOf(params[i].getValue()) + .booleanValue()); + continue; + } + if (COMPARATOR_KEY.equals(paramName)) { + try { + String className = (String) params[i].getValue(); + @SuppressWarnings("unchecked") + final Comparator comparatorInstance = (Comparator) (Class + .forName(className).newInstance()); + setComparator(comparatorInstance); + continue; + } catch (InstantiationException e) { + throw new BuildException(e); + } catch (IllegalAccessException e) { + /* + * Probably a inner non-static class, this this case is + * not considered + */ + throw new BuildException(e); + } catch (ClassNotFoundException e) { + throw new BuildException(e); + } catch (ClassCastException e) { + throw new BuildException("Value of comparator attribute" + + " should implement" + + " java.util.Comparator" + + " interface"); + } catch (Exception e) { + throw new BuildException(e); + } + } + } + } + } + + /** + * Sorts the read lines (lines) according to the sorting + * criteria defined by the user. + * + */ + private void sort() { + if (comparator == null) { + if (reverse) { + Collections.sort(lines, new Comparator() { + public int compare(String s1, String s2) { + return (-s1.compareTo(s2)); + } + }); + } else { + Collections.sort(lines); + } + } else { + Collections.sort(lines, comparator); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StringInputStream.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StringInputStream.java new file mode 100644 index 00000000..e150e965 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StringInputStream.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.StringReader; + +import org.apache.tools.ant.util.ReaderInputStream; + +/** + * Wraps a String as an InputStream. + * + */ +public class StringInputStream extends ReaderInputStream { + + /** + * Composes a stream from a String + * + * @param source The string to read from. Must not be null. + */ + public StringInputStream(String source) { + super(new StringReader(source)); + } + + /** + * Composes a stream from a String with the specified encoding + * + * @param source The string to read from. Must not be null. + * @param encoding The encoding scheme. Also must not be null. + */ + public StringInputStream(String source, String encoding) { + super(new StringReader(source), encoding); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripJavaComments.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripJavaComments.java new file mode 100644 index 00000000..65bccd70 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripJavaComments.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +/** + * This is a Java comment and string stripper reader that filters + * those lexical tokens out for purposes of simple Java parsing. + * (if you have more complex Java parsing needs, use a real lexer). + * Since this class heavily relies on the single char read function, + * you are recommended to make it work on top of a buffered reader. + * + */ +public final class StripJavaComments + extends BaseFilterReader + implements ChainableReader { + + /** + * The read-ahead character, used for effectively pushing a single + * character back. A value of -1 indicates that no character is in the + * buffer. + */ + private int readAheadCh = -1; + + /** + * Whether or not the parser is currently in the middle of a string + * literal. + */ + private boolean inString = false; + + /** + * Whether or not the last char has been a backslash. + */ + private boolean quoted = false; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public StripJavaComments() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public StripJavaComments(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, not including + * Java comments. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + int ch = -1; + if (readAheadCh != -1) { + ch = readAheadCh; + readAheadCh = -1; + } else { + ch = in.read(); + if (ch == '"' && !quoted) { + inString = !inString; + quoted = false; + } else if (ch == '\\') { + quoted = !quoted; + } else { + quoted = false; + if (!inString) { + if (ch == '/') { + ch = in.read(); + if (ch == '/') { + while (ch != '\n' && ch != -1 && ch != '\r') { + ch = in.read(); + } + } else if (ch == '*') { + while (ch != -1) { + ch = in.read(); + if (ch == '*') { + ch = in.read(); + while (ch == '*') { + ch = in.read(); + } + + if (ch == '/') { + ch = read(); + break; + } + } + } + } else { + readAheadCh = ch; + ch = '/'; + } + } + } + } + } + + return ch; + } + + /** + * Creates a new StripJavaComments using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + + public Reader chain(final Reader rdr) { + StripJavaComments newFilter = new StripJavaComments(rdr); + return newFilter; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineBreaks.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineBreaks.java new file mode 100644 index 00000000..9a97940a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineBreaks.java @@ -0,0 +1,154 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; + +/** + * Filter to flatten the stream to a single line. + * + * Example: + * + *
    <striplinebreaks/>
    + * + * Or: + * + *
    <filterreader
    + *   classname="org.apache.tools.ant.filters.StripLineBreaks"/>
    + * + */ +public final class StripLineBreaks + extends BaseParamFilterReader + implements ChainableReader { + /** + * Line-breaking characters. + * What should we do on funny IBM mainframes with odd line endings? + */ + private static final String DEFAULT_LINE_BREAKS = "\r\n"; + + /** Parameter name for the line-breaking characters parameter. */ + private static final String LINE_BREAKS_KEY = "linebreaks"; + + /** The characters that are recognized as line breaks. */ + private String lineBreaks = DEFAULT_LINE_BREAKS; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public StripLineBreaks() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public StripLineBreaks(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, only including + * characters not in the set of line-breaking characters. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = in.read(); + while (ch != -1) { + if (lineBreaks.indexOf(ch) == -1) { + break; + } else { + ch = in.read(); + } + } + return ch; + } + + /** + * Sets the line-breaking characters. + * + * @param lineBreaks A String containing all the characters to be + * considered as line-breaking. + */ + public void setLineBreaks(final String lineBreaks) { + this.lineBreaks = lineBreaks; + } + + /** + * Returns the line-breaking characters as a String. + * + * @return a String containing all the characters considered as + * line-breaking + */ + private String getLineBreaks() { + return lineBreaks; + } + + /** + * Creates a new StripLineBreaks using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + StripLineBreaks newFilter = new StripLineBreaks(rdr); + newFilter.setLineBreaks(getLineBreaks()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Parses the parameters to set the line-breaking characters. + */ + private void initialize() { + String userDefinedLineBreaks = null; + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (LINE_BREAKS_KEY.equals(params[i].getName())) { + userDefinedLineBreaks = params[i].getValue(); + break; + } + } + } + if (userDefinedLineBreaks != null) { + lineBreaks = userDefinedLineBreaks; + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineComments.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineComments.java new file mode 100644 index 00000000..e3d240ba --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/StripLineComments.java @@ -0,0 +1,237 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.Vector; + +import org.apache.tools.ant.types.Parameter; + +/** + * This filter strips line comments. + * + * Example: + * + *
    <striplinecomments>
    + *   <comment value="#"/>
    + *   <comment value="--"/>
    + *   <comment value="REM "/>
    + *   <comment value="rem "/>
    + *   <comment value="//"/>
    + * </striplinecomments>
    + * + * Or: + * + *
    <filterreader
    + *      classname="org.apache.tools.ant.filters.StripLineComments">
    + *   <param type="comment" value="#"/>
    + *   <param type="comment" value="--"/>
    + *   <param type="comment" value="REM "/>
    + *   <param type="comment" value="rem "/>
    + *   <param type="comment" value="//"/>
    + * </filterreader>
    + * + */ +public final class StripLineComments + extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the comment prefix. */ + private static final String COMMENTS_KEY = "comment"; + + /** Vector that holds the comment prefixes. */ + private Vector comments = new Vector(); + + /** The line that has been read ahead. */ + private String line = null; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public StripLineComments() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public StripLineComments(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, only including + * lines from the original stream which don't start with any of the + * specified comment prefixes. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (line != null) { + ch = line.charAt(0); + if (line.length() == 1) { + line = null; + } else { + line = line.substring(1); + } + } else { + line = readLine(); + final int commentsSize = comments.size(); + + while (line != null) { + for (int i = 0; i < commentsSize; i++) { + String comment = comments.elementAt(i); + if (line.startsWith(comment)) { + line = null; + break; + } + } + + if (line == null) { + // line started with comment + line = readLine(); + } else { + break; + } + } + + if (line != null) { + return read(); + } + } + + return ch; + } + + /** + * Adds a comment element to the list of prefixes. + * + * @param comment The comment element to add to the + * list of comment prefixes to strip. Must not be null. + */ + public void addConfiguredComment(final Comment comment) { + comments.addElement(comment.getValue()); + } + + /** + * Sets the list of comment prefixes to strip. + * + * @param comments A list of strings, each of which is a prefix + * for a comment line. Must not be null. + */ + private void setComments(final Vector comments) { + this.comments = comments; + } + + /** + * Returns the list of comment prefixes to strip. + * + * @return the list of comment prefixes to strip. + */ + private Vector getComments() { + return comments; + } + + /** + * Creates a new StripLineComments using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + StripLineComments newFilter = new StripLineComments(rdr); + newFilter.setComments(getComments()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Parses the parameters to set the comment prefixes. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (COMMENTS_KEY.equals(params[i].getType())) { + comments.addElement(params[i].getValue()); + } + } + } + } + + /** + * The class that holds a comment representation. + */ + public static class Comment { + + /** The prefix for a line comment. */ + private String value; + + /** + * Sets the prefix for this type of line comment. + * + * @param comment The prefix for a line comment of this type. + * Must not be null. + */ + public final void setValue(String comment) { + if (value != null) { + throw new IllegalStateException("Comment value already set."); + } + value = comment; + } + + /** + * Returns the prefix for this type of line comment. + * + * @return the prefix for this type of line comment. + */ + public final String getValue() { + return value; + } + + /** + * Alt. syntax to set the prefix for this type of line comment. + * + * @param comment The prefix for a line comment of this type. + * Must not be null. + */ + public void addText(String comment) { + setValue(comment); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SuffixLines.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SuffixLines.java new file mode 100644 index 00000000..23d9b534 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/SuffixLines.java @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; + +/** + * Attaches a suffix to every line. + * + * Example: + *
    <suffixlines suffix="Foo"/>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.SuffixLines">
    + *  <param name="suffix" value="Foo"/>
    + * </filterreader>
    + * + * @since Ant 1.8.0 + */ +public final class SuffixLines + extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the prefix. */ + private static final String SUFFIX_KEY = "suffix"; + + /** The suffix to be used. */ + private String suffix = null; + + /** Data that must be read from, if not null. */ + private String queuedData = null; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public SuffixLines() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public SuffixLines(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream. One line is read + * from the original input, and the suffix added. The resulting + * line is then used until it ends, at which point the next original line + * is read, etc. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (queuedData != null && queuedData.length() == 0) { + queuedData = null; + } + + if (queuedData != null) { + ch = queuedData.charAt(0); + queuedData = queuedData.substring(1); + if (queuedData.length() == 0) { + queuedData = null; + } + } else { + queuedData = readLine(); + if (queuedData == null) { + ch = -1; + } else { + if (suffix != null) { + String lf = ""; + if (queuedData.endsWith("\r\n")) { + lf = "\r\n"; + } else if (queuedData.endsWith("\n")) { + lf = "\n"; + } + queuedData = + queuedData.substring(0, + queuedData.length() - lf.length()) + + suffix + lf; + } + return read(); + } + } + return ch; + } + + /** + * Sets the suffix to add at the end of each input line. + * + * @param suffix The suffix to add at the end of each input line. + * May be null, in which case no suffix + * is added. + */ + public void setSuffix(final String suffix) { + this.suffix = suffix; + } + + /** + * Returns the suffix which will be added at the end of each input line. + * + * @return the suffix which will be added at the end of each input line + */ + private String getSuffix() { + return suffix; + } + + /** + * Creates a new SuffixLines filter using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + SuffixLines newFilter = new SuffixLines(rdr); + newFilter.setSuffix(getSuffix()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Initializes the suffix if it is available from the parameters. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (SUFFIX_KEY.equals(params[i].getName())) { + suffix = params[i].getValue(); + break; + } + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TabsToSpaces.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TabsToSpaces.java new file mode 100644 index 00000000..adaaa7af --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TabsToSpaces.java @@ -0,0 +1,155 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +import org.apache.tools.ant.types.Parameter; + +/** + * Converts tabs to spaces. + * + * Example: + * + *
    <tabstospaces tablength="8"/>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.TabsToSpaces">
    + *   <param name="tablength" value="8"/>
    + * </filterreader>
    + * + */ +public final class TabsToSpaces + extends BaseParamFilterReader + implements ChainableReader { + /** The default tab length. */ + private static final int DEFAULT_TAB_LENGTH = 8; + + /** Parameter name for the length of a tab. */ + private static final String TAB_LENGTH_KEY = "tablength"; + + /** Tab length in this filter. */ + private int tabLength = DEFAULT_TAB_LENGTH; + + /** The number of spaces still to be read to represent the last-read tab. */ + private int spacesRemaining = 0; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public TabsToSpaces() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public TabsToSpaces(final Reader in) { + super(in); + } + + /** + * Returns the next character in the filtered stream, converting tabs + * to the specified number of spaces. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (spacesRemaining > 0) { + spacesRemaining--; + ch = ' '; + } else { + ch = in.read(); + if (ch == '\t') { + spacesRemaining = tabLength - 1; + ch = ' '; + } + } + return ch; + } + + /** + * Sets the tab length. + * + * @param tabLength the number of spaces to be used when converting a tab. + */ + public void setTablength(final int tabLength) { + this.tabLength = tabLength; + } + + /** + * Returns the tab length. + * + * @return the number of spaces used when converting a tab + */ + private int getTablength() { + return tabLength; + } + + /** + * Creates a new TabsToSpaces using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + TabsToSpaces newFilter = new TabsToSpaces(rdr); + newFilter.setTablength(getTablength()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Parses the parameters to set the tab length. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (params[i] != null) { + if (TAB_LENGTH_KEY.equals(params[i].getName())) { + tabLength = Integer.parseInt(params[i].getValue()); + break; + } + } + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TailFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TailFilter.java new file mode 100644 index 00000000..fcc84d16 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TailFilter.java @@ -0,0 +1,243 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.LinkedList; + +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.util.LineTokenizer; + +/** + * Reads the last n lines of a stream. (Default is last10 lines.) + * + * Example: + * + *
    <tailfilter lines="3"/>
    + * + * Or: + * + *
    <filterreader classname="org.apache.tools.ant.filters.TailFilter">
    + *   <param name="lines" value="3"/>
    + * </filterreader>
    + * + */ +public final class TailFilter extends BaseParamFilterReader + implements ChainableReader { + /** Parameter name for the number of lines to be returned. */ + private static final String LINES_KEY = "lines"; + + /** Parameter name for the number of lines to be skipped. */ + private static final String SKIP_KEY = "skip"; + + /** Default number of lines to show */ + private static final int DEFAULT_NUM_LINES = 10; + + /** Number of lines to be returned in the filtered stream. */ + private long lines = DEFAULT_NUM_LINES; + + /** Number of lines to be skipped. */ + private long skip = 0; + + /** Whether or not read-ahead been completed. */ + private boolean completedReadAhead = false; + + /** A line tokenizer */ + private LineTokenizer lineTokenizer = null; + + /** the current line from the input stream */ + private String line = null; + /** the position in the current line */ + private int linePos = 0; + + private LinkedList lineList = new LinkedList(); + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public TailFilter() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public TailFilter(final Reader in) { + super(in); + lineTokenizer = new LineTokenizer(); + lineTokenizer.setIncludeDelims(true); + } + + /** + * Returns the next character in the filtered stream. If the read-ahead + * has been completed, the next character in the buffer is returned. + * Otherwise, the stream is read to the end and buffered (with the buffer + * growing as necessary), then the appropriate position in the buffer is + * set to read from. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + public int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + while (line == null || line.length() == 0) { + line = lineTokenizer.getToken(in); + line = tailFilter(line); + if (line == null) { + return -1; + } + linePos = 0; + } + + int ch = line.charAt(linePos); + linePos++; + if (linePos == line.length()) { + line = null; + } + return ch; + } + + /** + * Sets the number of lines to be returned in the filtered stream. + * + * @param lines the number of lines to be returned in the filtered stream + */ + public void setLines(final long lines) { + this.lines = lines; + } + + /** + * Returns the number of lines to be returned in the filtered stream. + * + * @return the number of lines to be returned in the filtered stream + */ + private long getLines() { + return lines; + } + + /** + * Sets the number of lines to be skipped in the filtered stream. + * + * @param skip the number of lines to be skipped in the filtered stream + */ + public void setSkip(final long skip) { + this.skip = skip; + } + + /** + * Returns the number of lines to be skipped in the filtered stream. + * + * @return the number of lines to be skipped in the filtered stream + */ + private long getSkip() { + return skip; + } + + /** + * Creates a new TailFilter using the passed in + * Reader for instantiation. + * + * @param rdr A Reader object providing the underlying stream. + * Must not be null. + * + * @return a new filter based on this configuration, but filtering + * the specified reader + */ + public Reader chain(final Reader rdr) { + TailFilter newFilter = new TailFilter(rdr); + newFilter.setLines(getLines()); + newFilter.setSkip(getSkip()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Scans the parameters list for the "lines" parameter and uses + * it to set the number of lines to be returned in the filtered stream. + * also scan for "skip" parameter. + */ + private void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (LINES_KEY.equals(params[i].getName())) { + setLines(Long.parseLong(params[i].getValue())); + continue; + } + if (SKIP_KEY.equals(params[i].getName())) { + skip = Long.parseLong(params[i].getValue()); + continue; + } + } + } + } + + /** + * implement a tail filter on a stream of lines. + * line = null is the end of the stream. + * @return "" while reading in the lines, + * line while outputting the lines + * null at the end of outputting the lines + */ + private String tailFilter(String line) { + if (!completedReadAhead) { + if (line != null) { + lineList.add(line); + if (lines == -1) { + if (lineList.size() > skip) { + return lineList.removeFirst(); + } + } else { + long linesToKeep = lines + (skip > 0 ? skip : 0); + if (linesToKeep < lineList.size()) { + lineList.removeFirst(); + } + } + return ""; + } + completedReadAhead = true; + if (skip > 0) { + for (int i = 0; i < skip; ++i) { + lineList.removeLast(); + } + } + if (lines > -1) { + while (lineList.size() > lines) { + lineList.removeFirst(); + } + } + } + if (lineList.size() > 0) { + return lineList.removeFirst(); + } + return null; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TokenFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TokenFilter.java new file mode 100644 index 00000000..ebad7602 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/TokenFilter.java @@ -0,0 +1,712 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.Enumeration; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.types.RegularExpression; +import org.apache.tools.ant.types.Substitution; +import org.apache.tools.ant.util.LineTokenizer; +import org.apache.tools.ant.util.StringUtils; +import org.apache.tools.ant.util.Tokenizer; +import org.apache.tools.ant.util.regexp.Regexp; +import org.apache.tools.ant.util.regexp.RegexpUtil; + +/** + * This splits up input into tokens and passes + * the tokens to a sequence of filters. + * + * @since Ant 1.6 + * @see BaseFilterReader + * @see ChainableReader + * @see org.apache.tools.ant.DynamicConfigurator + */ +public class TokenFilter extends BaseFilterReader + implements ChainableReader { + /** + * string filters implement this interface + */ + public interface Filter { + /** + * filter and/of modify a string + * + * @param string the string to filter + * @return the modified string or null if the + * string did not pass the filter + */ + String filter(String string); + } + + + /** string filters */ + private Vector filters = new Vector(); + /** the tokenizer to use on the input stream */ + private Tokenizer tokenizer = null; + /** the output token termination */ + private String delimOutput = null; + /** the current string token from the input stream */ + private String line = null; + /** the position in the current string token */ + private int linePos = 0; + + /** + * Constructor for "dummy" instances. + * + * @see BaseFilterReader#BaseFilterReader() + */ + public TokenFilter() { + super(); + } + + /** + * Creates a new filtered reader. + * + * @param in A Reader object providing the underlying stream. + * Must not be null. + */ + public TokenFilter(final Reader in) { + super(in); + } + + + /** + * Returns the next character in the filtered stream, only including + * lines from the original stream which match all of the specified + * regular expressions. + * + * @return the next character in the resulting stream, or -1 + * if the end of the resulting stream has been reached + * + * @exception IOException if the underlying stream throws an IOException + * during reading + */ + + public int read() throws IOException { + if (tokenizer == null) { + tokenizer = new LineTokenizer(); + } + while (line == null || line.length() == 0) { + line = tokenizer.getToken(in); + if (line == null) { + return -1; + } + for (Enumeration e = filters.elements(); e.hasMoreElements();) { + Filter filter = e.nextElement(); + line = filter.filter(line); + if (line == null) { + break; + } + } + linePos = 0; + if (line != null) { + if (tokenizer.getPostToken().length() != 0) { + if (delimOutput != null) { + line = line + delimOutput; + } else { + line = line + tokenizer.getPostToken(); + } + } + } + } + int ch = line.charAt(linePos); + linePos++; + if (linePos == line.length()) { + line = null; + } + return ch; + } + + /** + * Creates a new TokenFilter using the passed in + * Reader for instantiation. + * + * @param reader A Reader object providing the underlying stream. + * + * @return a new filter based on this configuration + */ + + public final Reader chain(final Reader reader) { + TokenFilter newFilter = new TokenFilter(reader); + newFilter.filters = filters; + newFilter.tokenizer = tokenizer; + newFilter.delimOutput = delimOutput; + newFilter.setProject(getProject()); + return newFilter; + } + + /** + * set the output delimiter. + * @param delimOutput replaces the delim string returned by the + * tokenizer, if present. + */ + + public void setDelimOutput(String delimOutput) { + this.delimOutput = resolveBackSlash(delimOutput); + } + + // ----------------------------------------- + // Predefined tokenizers + // ----------------------------------------- + + /** + * add a line tokenizer - this is the default. + * @param tokenizer the line tokenizer + */ + + public void addLineTokenizer(LineTokenizer tokenizer) { + add(tokenizer); + } + + /** + * add a string tokenizer + * @param tokenizer the string tokenizer + */ + + public void addStringTokenizer(StringTokenizer tokenizer) { + add(tokenizer); + } + + /** + * add a file tokenizer + * @param tokenizer the file tokenizer + */ + public void addFileTokenizer(FileTokenizer tokenizer) { + add(tokenizer); + } + + /** + * add an arbitrary tokenizer + * @param tokenizer the tokenizer to all, only one allowed + */ + + public void add(Tokenizer tokenizer) { + if (this.tokenizer != null) { + throw new BuildException("Only one tokenizer allowed"); + } + this.tokenizer = tokenizer; + } + + // ----------------------------------------- + // Predefined filters + // ----------------------------------------- + + /** + * replace string filter + * @param filter the replace string filter + */ + public void addReplaceString(ReplaceString filter) { + filters.addElement(filter); + } + + /** + * contains string filter + * @param filter the contains string filter + */ + public void addContainsString(ContainsString filter) { + filters.addElement(filter); + } + + /** + * replace regex filter + * @param filter the replace regex filter + */ + public void addReplaceRegex(ReplaceRegex filter) { + filters.addElement(filter); + } + + /** + * contains regex filter + * @param filter the contains regex filter + */ + public void addContainsRegex(ContainsRegex filter) { + filters.addElement(filter); + } + + /** + * trim filter + * @param filter the trim filter + */ + public void addTrim(Trim filter) { + filters.addElement(filter); + } + + /** + * ignore blank filter + * @param filter the ignore blank filter + */ + public void addIgnoreBlank(IgnoreBlank filter) { + filters.addElement(filter); + } + + /** + * delete chars + * @param filter the delete characters filter + */ + public void addDeleteCharacters(DeleteCharacters filter) { + filters.addElement(filter); + } + + /** + * Add an arbitrary filter + * @param filter the filter to add + */ + public void add(Filter filter) { + filters.addElement(filter); + } + + + // -------------------------------------------- + // + // Tokenizer Classes (impls moved to oata.util) + // + // -------------------------------------------- + + /** + * class to read the complete input into a string + */ + public static class FileTokenizer + extends org.apache.tools.ant.util.FileTokenizer { + } + + /** + * class to tokenize the input as areas separated + * by white space, or by a specified list of + * delim characters. Behaves like java.util.StringTokenizer. + * if the stream starts with delim characters, the first + * token will be an empty string (unless the treat delims + * as tokens flag is set). + */ + public static class StringTokenizer + extends org.apache.tools.ant.util.StringTokenizer { + } + + // -------------------------------------------- + // + // Filter classes + // + // -------------------------------------------- + + /** + * Abstract class that converts derived filter classes into + * ChainableReaderFilter's + */ + public abstract static class ChainableReaderFilter extends ProjectComponent + implements ChainableReader, Filter { + private boolean byLine = true; + + /** + * set whether to use filetokenizer or line tokenizer + * @param byLine if true use a linetokenizer (default) otherwise + * use a filetokenizer + */ + public void setByLine(boolean byLine) { + this.byLine = byLine; + } + + /** + * Chain a tokenfilter reader to a reader, + * + * @param reader the input reader object + * @return the chained reader object + */ + public Reader chain(Reader reader) { + TokenFilter tokenFilter = new TokenFilter(reader); + if (!byLine) { + tokenFilter.add(new FileTokenizer()); + } + tokenFilter.add(this); + return tokenFilter; + } + } + + /** + * Simple replace string filter. + */ + public static class ReplaceString extends ChainableReaderFilter { + private String from; + private String to; + + /** + * the from attribute + * + * @param from the string to replace + */ + public void setFrom(String from) { + this.from = from; + } + + /** + * the to attribute + * + * @param to the string to replace 'from' with + */ + public void setTo(String to) { + this.to = to; + } + + /** + * Filter a string 'line' replacing from with to + * (Copy&Paste from the Replace task) + * @param line the string to be filtered + * @return the filtered line + */ + public String filter(String line) { + if (from == null) { + throw new BuildException("Missing from in stringreplace"); + } + StringBuffer ret = new StringBuffer(); + int start = 0; + int found = line.indexOf(from); + while (found >= 0) { + // write everything up to the from + if (found > start) { + ret.append(line.substring(start, found)); + } + + // write the replacement to + if (to != null) { + ret.append(to); + } + + // search again + start = found + from.length(); + found = line.indexOf(from, start); + } + + // write the remaining characters + if (line.length() > start) { + ret.append(line.substring(start, line.length())); + } + + return ret.toString(); + } + } + + /** + * Simple filter to filter lines contains strings + */ + public static class ContainsString extends ProjectComponent + implements Filter { + private String contains; + + /** + * the contains attribute + * @param contains the string that the token should contain + */ + public void setContains(String contains) { + this.contains = contains; + } + + /** + * Filter strings that contain the contains attribute + * + * @param string the string to be filtered + * @return null if the string does not contain "contains", + * string otherwise + */ + public String filter(String string) { + if (contains == null) { + throw new BuildException("Missing contains in containsstring"); + } + if (string.indexOf(contains) > -1) { + return string; + } + return null; + } + } + + /** + * filter to replace regex. + */ + public static class ReplaceRegex extends ChainableReaderFilter { + private String from; + private String to; + private RegularExpression regularExpression; + private Substitution substitution; + private boolean initialized = false; + private String flags = ""; + private int options; + private Regexp regexp; + + /** + * the from attribute + * @param from the regex string + */ + public void setPattern(String from) { + this.from = from; + } + /** + * the to attribute + * @param to the replacement string + */ + public void setReplace(String to) { + this.to = to; + } + + /** + * @param flags the regex flags + */ + public void setFlags(String flags) { + this.flags = flags; + } + + private void initialize() { + if (initialized) { + return; + } + options = convertRegexOptions(flags); + if (from == null) { + throw new BuildException("Missing pattern in replaceregex"); + } + regularExpression = new RegularExpression(); + regularExpression.setPattern(from); + regexp = regularExpression.getRegexp(getProject()); + if (to == null) { + to = ""; + } + substitution = new Substitution(); + substitution.setExpression(to); + } + + /** + * @param line the string to modify + * @return the modified string + */ + public String filter(String line) { + initialize(); + + if (!regexp.matches(line, options)) { + return line; + } + return regexp.substitute( + line, substitution.getExpression(getProject()), options); + } + } + + /** + * filter to filter tokens matching regular expressions. + */ + public static class ContainsRegex extends ChainableReaderFilter { + private String from; + private String to; + private RegularExpression regularExpression; + private Substitution substitution; + private boolean initialized = false; + private String flags = ""; + private int options; + private Regexp regexp; + + + /** + * @param from the regex pattern + */ + public void setPattern(String from) { + this.from = from; + } + + /** + * @param to the replacement string + */ + public void setReplace(String to) { + this.to = to; + } + + /** + * @param flags the regex flags + */ + public void setFlags(String flags) { + this.flags = flags; + } + + private void initialize() { + if (initialized) { + return; + } + options = convertRegexOptions(flags); + if (from == null) { + throw new BuildException("Missing from in containsregex"); + } + regularExpression = new RegularExpression(); + regularExpression.setPattern(from); + regexp = regularExpression.getRegexp(getProject()); + if (to == null) { + return; + } + substitution = new Substitution(); + substitution.setExpression(to); + } + + /** + * apply regex and substitution on a string + * @param string the string to apply filter on + * @return the filtered string + */ + public String filter(String string) { + initialize(); + if (!regexp.matches(string, options)) { + return null; + } + if (substitution == null) { + return string; + } + return regexp.substitute( + string, substitution.getExpression(getProject()), options); + } + } + + /** Filter to trim white space */ + public static class Trim extends ChainableReaderFilter { + /** + * @param line the string to be trimmed + * @return the trimmed string + */ + public String filter(String line) { + return line.trim(); + } + } + + + + /** Filter remove empty tokens */ + public static class IgnoreBlank extends ChainableReaderFilter { + /** + * @param line the line to modify + * @return the trimmed line + */ + public String filter(String line) { + if (line.trim().length() == 0) { + return null; + } + return line; + } + } + + /** + * Filter to delete characters + */ + public static class DeleteCharacters extends ProjectComponent + implements Filter, ChainableReader { + // Attributes + /** the list of characters to remove from the input */ + private String deleteChars = ""; + + /** + * Set the list of characters to delete + * @param deleteChars the list of characters + */ + public void setChars(String deleteChars) { + this.deleteChars = resolveBackSlash(deleteChars); + } + + /** + * remove characters from a string + * @param string the string to remove the characters from + * @return the converted string + */ + public String filter(String string) { + StringBuffer output = new StringBuffer(string.length()); + for (int i = 0; i < string.length(); ++i) { + char ch = string.charAt(i); + if (!(isDeleteCharacter(ch))) { + output.append(ch); + } + } + return output.toString(); + } + + /** + * factory method to provide a reader that removes + * the characters from a reader as part of a filter + * chain + * @param reader the reader object + * @return the chained reader object + */ + public Reader chain(Reader reader) { + return new BaseFilterReader(reader) { + /** + * @return the next non delete character + */ + public int read() + throws IOException { + while (true) { + int c = in.read(); + if (c == -1) { + return c; + } + if (!(isDeleteCharacter((char) c))) { + return c; + } + } + } + }; + } + + /** + * check if the character c is to be deleted + * + * @param c char to test + * @return true if the supplied char is in the list to be stripped. + */ + private boolean isDeleteCharacter(char c) { + for (int d = 0; d < deleteChars.length(); ++d) { + if (deleteChars.charAt(d) == c) { + return true; + } + } + return false; + } + } + + // -------------------------------------------------------- + // static utility methods - could be placed somewhere else + // -------------------------------------------------------- + + /** + * xml does not do "c" like interpretation of strings. + * i.e. \n\r\t etc. + * this method processes \n, \r, \t, \f, \\ + * also subs \s with " \n\r\t\f" + * a trailing '\' will be ignored + * + * @param input raw string with possible embedded '\'s + * @return converted string + */ + public static String resolveBackSlash(String input) { + return StringUtils.resolveBackSlash(input); + } + + /** + * convert regex option flag characters to regex options + *
      + *
    • g - Regexp.REPLACE_ALL
    • + *
    • i - Regexp.MATCH_CASE_INSENSITIVE
    • + *
    • m - Regexp.MATCH_MULTILINE
    • + *
    • s - Regexp.MATCH_SINGLELINE
    • + *
    + * @param flags the string containing the flags + * @return the Regexp option bits + */ + public static int convertRegexOptions(String flags) { + return RegexpUtil.asOptions(flags); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/UniqFilter.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/UniqFilter.java new file mode 100644 index 00000000..e72d5f58 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/UniqFilter.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters; + +/** + * Like the Unix uniq(1) command, only returns tokens that are + * different from their ancestor token. + * + *

    This filter is probably most useful if used together with a + * sortfilter.

    + * + * @since Ant 1.8.0 + */ +public class UniqFilter extends TokenFilter.ChainableReaderFilter { + + private String lastLine = null; + + public String filter(String string) { + return lastLine == null || !lastLine.equals(string) + ? (lastLine = string) : null; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java new file mode 100644 index 00000000..f176c331 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java @@ -0,0 +1,288 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters.util; + +import java.io.FilterReader; +import java.io.IOException; +import java.io.Reader; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + +import org.apache.tools.ant.AntClassLoader; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.filters.BaseFilterReader; +import org.apache.tools.ant.filters.ChainableReader; +import org.apache.tools.ant.types.AntFilterReader; +import org.apache.tools.ant.types.FilterChain; +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.types.Parameterizable; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.util.FileUtils; + +/** + * Process a FilterReader chain. + * + */ +public final class ChainReaderHelper { + + // default buffer size + private static final int DEFAULT_BUFFER_SIZE = 8192; + // CheckStyle:VisibilityModifier OFF - bc + /** + * The primary reader to which the reader chain is to be attached. + */ + public Reader primaryReader; + + /** + * The size of the buffer to be used. + */ + public int bufferSize = DEFAULT_BUFFER_SIZE; + + /** + * Chain of filters + */ + public Vector filterChains = new Vector(); + + /** The Ant project */ + private Project project = null; + + // CheckStyle:VisibilityModifier ON + + /** + * Sets the primary reader + * @param rdr the reader object + */ + public void setPrimaryReader(Reader rdr) { + primaryReader = rdr; + } + + /** + * Set the project to work with + * @param project the current project + */ + public void setProject(final Project project) { + this.project = project; + } + + /** + * Get the project + * + * @return the current project + */ + public Project getProject() { + return project; + } + + /** + * Sets the buffer size to be used. Defaults to 8192, + * if this method is not invoked. + * @param size the buffer size to use + */ + public void setBufferSize(int size) { + bufferSize = size; + } + + /** + * Sets the collection of filter reader sets + * + * @param fchain the filter chains collection + */ + public void setFilterChains(Vector fchain) { + filterChains = fchain; + } + + /** + * Assemble the reader + * @return the assembled reader + * @exception BuildException if an error occurs + */ + public Reader getAssembledReader() throws BuildException { + if (primaryReader == null) { + throw new BuildException("primaryReader must not be null."); + } + + Reader instream = primaryReader; + final int filterReadersCount = filterChains.size(); + final Vector finalFilters = new Vector(); + final ArrayList classLoadersToCleanUp = + new ArrayList(); + + for (int i = 0; i < filterReadersCount; i++) { + final FilterChain filterchain = + filterChains.elementAt(i); + final Vector filterReaders = filterchain.getFilterReaders(); + final int readerCount = filterReaders.size(); + for (int j = 0; j < readerCount; j++) { + finalFilters.addElement(filterReaders.elementAt(j)); + } + } + + final int filtersCount = finalFilters.size(); + + if (filtersCount > 0) { + boolean success = false; + try { + for (int i = 0; i < filtersCount; i++) { + Object o = finalFilters.elementAt(i); + + if (o instanceof AntFilterReader) { + instream = + expandReader((AntFilterReader) finalFilters.elementAt(i), + instream, classLoadersToCleanUp); + } else if (o instanceof ChainableReader) { + setProjectOnObject(o); + instream = ((ChainableReader) o).chain(instream); + setProjectOnObject(instream); + } + } + success = true; + } finally { + if (!success && classLoadersToCleanUp.size() > 0) { + cleanUpClassLoaders(classLoadersToCleanUp); + } + } + } + final Reader finalReader = instream; + return classLoadersToCleanUp.size() == 0 ? finalReader + : new FilterReader(finalReader) { + public void close() throws IOException { + FileUtils.close(in); + cleanUpClassLoaders(classLoadersToCleanUp); + } + protected void finalize() throws Throwable { + try { + close(); + } finally { + super.finalize(); + } + } + }; + } + + /** + * helper method to set the project on an object. + * the reflection setProject does not work for anonymous/protected/private + * classes, even if they have public methods. + */ + private void setProjectOnObject(Object obj) { + if (project == null) { + return; + } + if (obj instanceof BaseFilterReader) { + ((BaseFilterReader) obj).setProject(project); + return; + } + project.setProjectReference(obj); + } + + /** + * Deregisters Classloaders from the project so GC can remove them later. + */ + private static void cleanUpClassLoaders(List loaders) { + for (Iterator it = loaders.iterator(); it.hasNext();) { + it.next().cleanup(); + } + } + + /** + * Read data from the reader and return the + * contents as a string. + * @param rdr the reader object + * @return the contents of the file as a string + * @exception IOException if an error occurs + */ + public String readFully(Reader rdr) + throws IOException { + return FileUtils.readFully(rdr, bufferSize); + } + + /** + * Creates and parameterizes a new FilterReader from a + * <filterreader> element. + * + * @since Ant 1.8.0 + */ + private Reader expandReader(final AntFilterReader filter, + final Reader ancestor, + final List classLoadersToCleanUp) { + final String className = filter.getClassName(); + final Path classpath = filter.getClasspath(); + final Project pro = filter.getProject(); + if (className != null) { + try { + Class clazz = null; + if (classpath == null) { + clazz = Class.forName(className); + } else { + AntClassLoader al = pro.createClassLoader(classpath); + classLoadersToCleanUp.add(al); + clazz = Class.forName(className, true, al); + } + if (clazz != null) { + if (!FilterReader.class.isAssignableFrom(clazz)) { + throw new BuildException(className + " does not extend" + + " java.io.FilterReader"); + } + final Constructor[] constructors = clazz.getConstructors(); + int j = 0; + boolean consPresent = false; + for (; j < constructors.length; j++) { + Class[] types = constructors[j].getParameterTypes(); + if (types.length == 1 + && types[0].isAssignableFrom(Reader.class)) { + consPresent = true; + break; + } + } + if (!consPresent) { + throw new BuildException(className + " does not define" + + " a public constructor" + + " that takes in a Reader" + + " as its single argument."); + } + final Reader[] rdr = {ancestor}; + Reader instream = + (Reader) constructors[j].newInstance((Object[]) rdr); + setProjectOnObject(instream); + if (Parameterizable.class.isAssignableFrom(clazz)) { + final Parameter[] params = filter.getParams(); + ((Parameterizable) instream).setParameters(params); + } + return instream; + } + } catch (final ClassNotFoundException cnfe) { + throw new BuildException(cnfe); + } catch (final InstantiationException ie) { + throw new BuildException(ie); + } catch (final IllegalAccessException iae) { + throw new BuildException(iae); + } catch (final InvocationTargetException ite) { + throw new BuildException(ite); + } + } + // Ant 1.7.1 and earlier ignore without a + // classname attribute, not sure this is a good idea - + // backwards compatibility makes it hard to change, though. + return ancestor; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/JavaClassHelper.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/JavaClassHelper.java new file mode 100644 index 00000000..b0c67ce2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/filters/util/JavaClassHelper.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.filters.util; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; + +// CheckStyle:HideUtilityClassConstructorCheck OFF - bc +/** + * Helper class that filters constants from a Java Class + * + */ +public final class JavaClassHelper { + /** System specific line separator. */ + private static final String LS = System.getProperty("line.separator"); + + /** + * Get the constants declared in a file as name=value + * + * @param bytes the class as a array of bytes + * @return a StringBuffer contains the name=value pairs + * @exception IOException if an error occurs + */ + public static StringBuffer getConstants(final byte[] bytes) + throws IOException { + final StringBuffer sb = new StringBuffer(); + final ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + final ClassParser parser = new ClassParser(bis, ""); + final JavaClass javaClass = parser.parse(); + final Field[] fields = javaClass.getFields(); + for (int i = 0; i < fields.length; i++) { + final Field field = fields[i]; + if (field != null) { + final ConstantValue cv = field.getConstantValue(); + if (cv != null) { + String cvs = cv.toString(); + //Remove start and end quotes if field is a String + if (cvs.startsWith("\"") && cvs.endsWith("\"")) { + cvs = cvs.substring(1, cvs.length() - 1); + } + sb.append(field.getName()); + sb.append('='); + sb.append(cvs); + sb.append(LS); + } + } + } + return sb; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java new file mode 100644 index 00000000..99e3d1a1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/AntXMLContext.java @@ -0,0 +1,417 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.helper; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Location; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.RuntimeConfigurable; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.util.FileUtils; +import org.xml.sax.Attributes; +import org.xml.sax.Locator; + +/** + * Context information for the ant processing. + * + */ +public class AntXMLContext { + /** The project to configure. */ + private Project project; + + /** The configuration file to parse. */ + private File buildFile; + + /** The configuration file to parse. */ + private URL buildFileURL; + + /** Vector with all the targets, in the order they are + * defined. Project maintains a Hashtable, which is not ordered. + * This will allow description to know the original order. + */ + private Vector targetVector = new Vector(); + + /** + * Parent directory of the build file. Used for resolving entities + * and setting the project's base directory. + */ + private File buildFileParent; + + /** + * Parent directory of the build file. Used for resolving entities + * and setting the project's base directory. + */ + private URL buildFileParentURL; + + /** Name of the current project */ + private String currentProjectName; + + /** + * Locator for the configuration file parser. + * Used for giving locations of errors etc. + */ + private Locator locator; + + /** + * Target that all other targets will depend upon implicitly. + * + *

    This holds all tasks and data type definitions that have + * been placed outside of targets.

    + */ + private Target implicitTarget = new Target(); + + /** Current target ( no need for a stack as the processing model + allows only one level of target ) */ + private Target currentTarget = null; + + /** The stack of RuntimeConfigurable2 wrapping the + objects. + */ + private Vector wStack = new Vector(); + + /** + * Indicates whether the project tag attributes are to be ignored + * when processing a particular build file. + */ + private boolean ignoreProjectTag = false; + + /** Keeps track of prefix -> uri mapping during parsing */ + private Map> prefixMapping = new HashMap>(); + + + /** Keeps track of targets in files */ + private Map currentTargets = null; + + /** + * constructor + * @param project the project to which this antxml context belongs to + */ + public AntXMLContext(Project project) { + this.project = project; + implicitTarget.setProject(project); + implicitTarget.setName(""); + targetVector.addElement(implicitTarget); + } + + /** + * sets the build file to which the XML context belongs + * @param buildFile ant build file + */ + public void setBuildFile(File buildFile) { + this.buildFile = buildFile; + if (buildFile != null) { + this.buildFileParent = new File(buildFile.getParent()); + implicitTarget.setLocation(new Location(buildFile.getAbsolutePath())); + try { + setBuildFile(FileUtils.getFileUtils().getFileURL(buildFile)); + } catch (MalformedURLException ex) { + throw new BuildException(ex); + } + } else { + this.buildFileParent = null; + } + } + + /** + * sets the build file to which the XML context belongs + * @param buildFile ant build file + * @since Ant 1.8.0 + */ + public void setBuildFile(URL buildFile) throws MalformedURLException { + this.buildFileURL = buildFile; + this.buildFileParentURL = new URL(buildFile, "."); + if (implicitTarget.getLocation() == null) { + implicitTarget.setLocation(new Location(buildFile.toString())); + } + } + + /** + * find out the build file + * @return the build file to which the xml context belongs + */ + public File getBuildFile() { + return buildFile; + } + + /** + * find out the parent build file of this build file + * @return the parent build file of this build file + */ + public File getBuildFileParent() { + return buildFileParent; + } + + /** + * find out the build file + * @return the build file to which the xml context belongs + * @since Ant 1.8.0 + */ + public URL getBuildFileURL() { + return buildFileURL; + } + + /** + * find out the parent build file of this build file + * @return the parent build file of this build file + * @since Ant 1.8.0 + */ + public URL getBuildFileParentURL() { + return buildFileParentURL; + } + + /** + * find out the project to which this antxml context belongs + * @return project + */ + public Project getProject() { + return project; + } + + /** + * find out the current project name + * @return current project name + */ + public String getCurrentProjectName() { + return currentProjectName; + } + + /** + * set the name of the current project + * @param name name of the current project + */ + public void setCurrentProjectName(String name) { + this.currentProjectName = name; + } + + /** + * get the current runtime configurable wrapper + * can return null + * @return runtime configurable wrapper + */ + public RuntimeConfigurable currentWrapper() { + if (wStack.size() < 1) { + return null; + } + return (RuntimeConfigurable) wStack.elementAt(wStack.size() - 1); + } + + /** + * get the runtime configurable wrapper of the parent project + * can return null + * @return runtime configurable wrapper of the parent project + */ + public RuntimeConfigurable parentWrapper() { + if (wStack.size() < 2) { + return null; + } + return (RuntimeConfigurable) wStack.elementAt(wStack.size() - 2); + } + + /** + * add a runtime configurable wrapper to the internal stack + * @param wrapper runtime configurable wrapper + */ + public void pushWrapper(RuntimeConfigurable wrapper) { + wStack.addElement(wrapper); + } + + /** + * remove a runtime configurable wrapper from the stack + */ + public void popWrapper() { + if (wStack.size() > 0) { + wStack.removeElementAt(wStack.size() - 1); + } + } + + /** + * access the stack of wrappers + * @return the stack of wrappers + */ + public Vector getWrapperStack() { + return wStack; + } + + /** + * add a new target + * @param target target to add + */ + public void addTarget(Target target) { + targetVector.addElement(target); + currentTarget = target; + } + + /** + * get the current target + * @return current target + */ + public Target getCurrentTarget() { + return currentTarget; + } + + /** + * get the implicit target + * @return implicit target + */ + public Target getImplicitTarget() { + return implicitTarget; + } + + /** + * sets the current target + * @param target current target + */ + public void setCurrentTarget(Target target) { + this.currentTarget = target; + } + + /** + * sets the implicit target + * @param target the implicit target + */ + public void setImplicitTarget(Target target) { + this.implicitTarget = target; + } + + /** + * access the vector of targets + * @return vector of targets + */ + public Vector getTargets() { + return targetVector; + } + + /** + * Scans an attribute list for the id attribute and + * stores a reference to the target object in the project if an + * id is found. + *

    + * This method was moved out of the configure method to allow + * it to be executed at parse time. + * @param element the current element + * @param attr attributes of the current element + */ + public void configureId(Object element, Attributes attr) { + String id = attr.getValue("id"); + if (id != null) { + project.addIdReference(id, element); + } + } + + /** + * access the locator + * @return locator + */ + public Locator getLocator() { + return locator; + } + + /** + * sets the locator + * @param locator locator + */ + public void setLocator(Locator locator) { + this.locator = locator; + } + + /** + * tells whether the project tag is being ignored + * @return whether the project tag is being ignored + */ + public boolean isIgnoringProjectTag() { + return ignoreProjectTag; + } + + /** + * sets the flag to ignore the project tag + * @param flag to ignore the project tag + */ + public void setIgnoreProjectTag(boolean flag) { + this.ignoreProjectTag = flag; + } + + /** + * Called during parsing, stores the prefix to uri mapping. + * + * @param prefix a namespace prefix + * @param uri a namespace uri + */ + public void startPrefixMapping(String prefix, String uri) { + List list = prefixMapping.get(prefix); + if (list == null) { + list = new ArrayList(); + prefixMapping.put(prefix, list); + } + list.add(uri); + } + + /** + * End of prefix to uri mapping. + * + * @param prefix the namespace prefix + */ + public void endPrefixMapping(String prefix) { + List list = prefixMapping.get(prefix); + if (list == null || list.size() == 0) { + return; // Should not happen + } + list.remove(list.size() - 1); + } + + /** + * prefix to namespace uri mapping + * + * @param prefix the prefix to map + * @return the uri for this prefix, null if not present + */ + public String getPrefixMapping(String prefix) { + List list = prefixMapping.get(prefix); + if (list == null || list.size() == 0) { + return null; + } + return (String) list.get(list.size() - 1); + } + + /** + * Get the targets in the current source file. + * @return the current targets. + */ + public Map getCurrentTargets() { + return currentTargets; + } + + /** + * Set the map of the targets in the current source file. + * @param currentTargets a map of targets. + */ + public void setCurrentTargets(Map currentTargets) { + this.currentTargets = currentTargets; + } + +} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/DefaultExecutor.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/DefaultExecutor.java new file mode 100644 index 00000000..cdbc587c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/DefaultExecutor.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.helper; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Executor; +import org.apache.tools.ant.Project; + +/** + * Default Target executor implementation. Runs each target individually + * (including all of its dependencies). If an error occurs, behavior is + * determined by the Project's "keep-going" mode. + * @since Ant 1.6.3 + */ +public class DefaultExecutor implements Executor { + + private static final SingleCheckExecutor SUB_EXECUTOR = new SingleCheckExecutor(); + + /** {@inheritDoc}. */ + public void executeTargets(Project project, String[] targetNames) + throws BuildException { + BuildException thrownException = null; + for (int i = 0; i < targetNames.length; i++) { + try { + project.executeTarget(targetNames[i]); + } catch (BuildException ex) { + if (project.isKeepGoingMode()) { + thrownException = ex; + } else { + throw ex; + } + } + } + if (thrownException != null) { + throw thrownException; + } + } + + /** {@inheritDoc}. */ + public Executor getSubProjectExecutor() { + return SUB_EXECUTOR; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/IgnoreDependenciesExecutor.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/IgnoreDependenciesExecutor.java new file mode 100644 index 00000000..da85dba7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/IgnoreDependenciesExecutor.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.helper; + +import java.util.Hashtable; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Executor; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Target; + +/** + * Target executor implementation that ignores dependencies. Runs each + * target by calling target.performTasks() directly. If an + * error occurs, behavior is determined by the Project's "keep-going" mode. + * To be used when you know what you're doing. + * + * @since Ant 1.7.1 + */ +public class IgnoreDependenciesExecutor implements Executor { + + private static final SingleCheckExecutor SUB_EXECUTOR = new SingleCheckExecutor(); + + /** {@inheritDoc}. */ + public void executeTargets(Project project, String[] targetNames) + throws BuildException { + Hashtable targets = project.getTargets(); + BuildException thrownException = null; + for (int i = 0; i < targetNames.length; i++) { + try { + Target t = targets.get(targetNames[i]); + if (t == null) { + throw new BuildException("Unknown target " + targetNames[i]); + } + t.performTasks(); + } catch (BuildException ex) { + if (project.isKeepGoingMode()) { + thrownException = ex; + } else { + throw ex; + } + } + } + if (thrownException != null) { + throw thrownException; + } + } + + /** {@inheritDoc}. */ + public Executor getSubProjectExecutor() { + return SUB_EXECUTOR; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelper2.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelper2.java new file mode 100644 index 00000000..67e1decb --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelper2.java @@ -0,0 +1,1238 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.helper; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLConnection; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; +import java.util.Stack; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.ExtensionPoint; +import org.apache.tools.ant.Location; +import org.apache.tools.ant.MagicNames; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectHelper; +import org.apache.tools.ant.RuntimeConfigurable; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.UnknownElement; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.FileProvider; +import org.apache.tools.ant.types.resources.URLProvider; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.JAXPUtils; +import org.apache.tools.zip.ZipFile; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Sax2 based project reader + * + */ +public class ProjectHelper2 extends ProjectHelper { + + /** Reference holding the (ordered) target Vector */ + public static final String REFID_TARGETS = "ant.targets"; + + /* Stateless */ + + // singletons - since all state is in the context + private static AntHandler elementHandler = new ElementHandler(); + private static AntHandler targetHandler = new TargetHandler(); + private static AntHandler mainHandler = new MainHandler(); + private static AntHandler projectHandler = new ProjectHandler(); + + /** Specific to ProjectHelper2 so not a true Ant "magic name:" */ + private static final String REFID_CONTEXT = "ant.parsing.context"; + + /** + * helper for path -> URI and URI -> path conversions. + */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** + * Whether this instance of ProjectHelper can parse an Antlib + * descriptor given by the URL and return its content as an + * UnknownElement ready to be turned into an Antlib task. + * + *

    This implementation returns true.

    + * + * @since Ant 1.8.0 + */ + public boolean canParseAntlibDescriptor(Resource resource) { + return true; + } + + /** + * Parse the given URL as an antlib descriptor and return the + * content as something that can be turned into an Antlib task. + * + *

    simply delegates to {@link #parseUnknownElement + * parseUnknownElement} if the resource provides an URL and throws + * an exception otherwise.

    + * + * @since Ant 1.8.0 + */ + public UnknownElement parseAntlibDescriptor(Project containingProject, + Resource resource) { + URLProvider up = resource.as(URLProvider.class); + if (up == null) { + throw new BuildException("Unsupported resource type: " + resource); + } + return parseUnknownElement(containingProject, up.getURL()); + } + + /** + * Parse an unknown element from a url + * + * @param project the current project + * @param source the url containing the task + * @return a configured task + * @exception BuildException if an error occurs + */ + public UnknownElement parseUnknownElement(Project project, URL source) + throws BuildException { + Target dummyTarget = new Target(); + dummyTarget.setProject(project); + + AntXMLContext context = new AntXMLContext(project); + context.addTarget(dummyTarget); + context.setImplicitTarget(dummyTarget); + + parse(context.getProject(), source, new RootHandler(context, elementHandler)); + Task[] tasks = dummyTarget.getTasks(); + if (tasks.length != 1) { + throw new BuildException("No tasks defined"); + } + return (UnknownElement) tasks[0]; + } + + /** + * Parse a source xml input. + * + * @param project the current project + * @param source the xml source + * @exception BuildException if an error occurs + */ + public void parse(Project project, Object source) throws BuildException { + getImportStack().addElement(source); + AntXMLContext context = null; + context = (AntXMLContext) project.getReference(REFID_CONTEXT); + if (context == null) { + context = new AntXMLContext(project); + project.addReference(REFID_CONTEXT, context); + project.addReference(REFID_TARGETS, context.getTargets()); + } + if (getImportStack().size() > 1) { + // we are in an imported file. + context.setIgnoreProjectTag(true); + Target currentTarget = context.getCurrentTarget(); + Target currentImplicit = context.getImplicitTarget(); + Map currentTargets = context.getCurrentTargets(); + try { + Target newCurrent = new Target(); + newCurrent.setProject(project); + newCurrent.setName(""); + context.setCurrentTarget(newCurrent); + context.setCurrentTargets(new HashMap()); + context.setImplicitTarget(newCurrent); + parse(project, source, new RootHandler(context, mainHandler)); + newCurrent.execute(); + } finally { + context.setCurrentTarget(currentTarget); + context.setImplicitTarget(currentImplicit); + context.setCurrentTargets(currentTargets); + } + } else { + // top level file + context.setCurrentTargets(new HashMap()); + parse(project, source, new RootHandler(context, mainHandler)); + // Execute the top-level target + context.getImplicitTarget().execute(); + + // resolve extensionOf attributes + resolveExtensionOfAttributes(project); + } + } + + /** + * Parses the project file, configuring the project as it goes. + * + * @param project the current project + * @param source the xml source + * @param handler the root handler to use (contains the current context) + * @exception BuildException if the configuration is invalid or cannot + * be read + */ + public void parse(Project project, Object source, RootHandler handler) throws BuildException { + + AntXMLContext context = handler.context; + + File buildFile = null; + URL url = null; + String buildFileName = null; + + if (source instanceof File) { + buildFile = (File) source; + } else if (source instanceof URL) { + url = (URL) source; + } else if (source instanceof Resource) { + FileProvider fp = + ((Resource) source).as(FileProvider.class); + if (fp != null) { + buildFile = fp.getFile(); + } else { + URLProvider up = + ((Resource) source).as(URLProvider.class); + if (up != null) { + url = up.getURL(); + } + } + } + if (buildFile != null) { + buildFile = FILE_UTILS.normalize(buildFile.getAbsolutePath()); + context.setBuildFile(buildFile); + buildFileName = buildFile.toString(); + } else if (url != null) { + try { + context.setBuildFile((File) null); + context.setBuildFile(url); + } catch (java.net.MalformedURLException ex) { + throw new BuildException(ex); + } + buildFileName = url.toString(); + } else { + throw new BuildException("Source " + source.getClass().getName() + + " not supported by this plugin"); + } + InputStream inputStream = null; + InputSource inputSource = null; + ZipFile zf = null; + + try { + /** + * SAX 2 style parser used to parse the given file. + */ + XMLReader parser = JAXPUtils.getNamespaceXMLReader(); + + String uri = null; + if (buildFile != null) { + uri = FILE_UTILS.toURI(buildFile.getAbsolutePath()); + inputStream = new FileInputStream(buildFile); + } else { + uri = url.toString(); + int pling = -1; + if (uri.startsWith("jar:file") + && (pling = uri.indexOf("!/")) > -1) { + zf = new ZipFile(org.apache.tools.ant.launch.Locator + .fromJarURI(uri), "UTF-8"); + inputStream = + zf.getInputStream(zf.getEntry(uri.substring(pling + 1))); + } else { + URLConnection conn = url.openConnection(); + conn.setUseCaches(false); + inputStream = conn.getInputStream(); + } + } + + inputSource = new InputSource(inputStream); + if (uri != null) { + inputSource.setSystemId(uri); + } + project.log("parsing buildfile " + buildFileName + " with URI = " + + uri + (zf != null ? " from a zip file" : ""), + Project.MSG_VERBOSE); + + DefaultHandler hb = handler; + + parser.setContentHandler(hb); + parser.setEntityResolver(hb); + parser.setErrorHandler(hb); + parser.setDTDHandler(hb); + parser.parse(inputSource); + } catch (SAXParseException exc) { + Location location = new Location(exc.getSystemId(), exc.getLineNumber(), exc + .getColumnNumber()); + + Throwable t = exc.getException(); + if (t instanceof BuildException) { + BuildException be = (BuildException) t; + if (be.getLocation() == Location.UNKNOWN_LOCATION) { + be.setLocation(location); + } + throw be; + } + throw new BuildException(exc.getMessage(), t == null ? exc : t, location); + } catch (SAXException exc) { + Throwable t = exc.getException(); + if (t instanceof BuildException) { + throw (BuildException) t; + } + throw new BuildException(exc.getMessage(), t == null ? exc : t); + } catch (FileNotFoundException exc) { + throw new BuildException(exc); + } catch (UnsupportedEncodingException exc) { + throw new BuildException("Encoding of project file " + buildFileName + " is invalid.", + exc); + } catch (IOException exc) { + throw new BuildException("Error reading project file " + buildFileName + ": " + + exc.getMessage(), exc); + } finally { + FileUtils.close(inputStream); + ZipFile.closeQuietly(zf); + } + } + + /** + * Returns main handler + * @return main handler + */ + protected static AntHandler getMainHandler() { + return mainHandler; + } + + /** + * Sets main handler + * @param handler new main handler + */ + protected static void setMainHandler(AntHandler handler) { + mainHandler = handler; + } + + /** + * Returns project handler + * @return project handler + */ + protected static AntHandler getProjectHandler() { + return projectHandler; + } + + /** + * Sets project handler + * @param handler new project handler + */ + protected static void setProjectHandler(AntHandler handler) { + projectHandler = handler; + } + + /** + * Returns target handler + * @return target handler + */ + protected static AntHandler getTargetHandler() { + return targetHandler; + } + + /** + * Sets target handler + * @param handler new target handler + */ + protected static void setTargetHandler(AntHandler handler) { + targetHandler = handler; + } + + /** + * Returns element handler + * @return element handler + */ + protected static AntHandler getElementHandler() { + return elementHandler; + } + + /** + * Sets element handler + * @param handler new element handler + */ + protected static void setElementHandler(AntHandler handler) { + elementHandler = handler; + } + + /** + * The common superclass for all SAX event handlers used to parse + * the configuration file. + * + * The context will hold all state information. At each time + * there is one active handler for the current element. It can + * use onStartChild() to set an alternate handler for the child. + */ + public static class AntHandler { + /** + * Handles the start of an element. This base implementation does + * nothing. + * + * @param uri the namespace URI for the tag + * @param tag The name of the element being started. + * Will not be null. + * @param qname The qualified name of the element. + * @param attrs Attributes of the element being started. + * Will not be null. + * @param context The context that this element is in. + * + * @exception SAXParseException if this method is not overridden, or in + * case of error in an overridden version + */ + public void onStartElement(String uri, String tag, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + } + + /** + * Handles the start of an element. This base implementation just + * throws an exception - you must override this method if you expect + * child elements. + * + * @param uri The namespace uri for this element. + * @param tag The name of the element being started. + * Will not be null. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element being started. + * Will not be null. + * @param context The current context. + * @return a handler (in the derived classes) + * + * @exception SAXParseException if this method is not overridden, or in + * case of error in an overridden version + */ + public AntHandler onStartChild(String uri, String tag, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + throw new SAXParseException("Unexpected element \"" + qname + " \"", context + .getLocator()); + } + + /** + * Handle the end of a element. + * + * @param uri the namespace uri of the element + * @param tag the tag of the element + * @param qname the qualified name of the element + * @param context the current context + * @exception SAXParseException if an error occurs + */ + public void onEndChild(String uri, String tag, String qname, AntXMLContext context) + throws SAXParseException { + } + + /** + * This method is called when this element and all elements nested into it have been + * handled. I.e., this happens at the </end_tag_of_the_element>. + * @param uri the namespace uri for this element + * @param tag the element name + * @param context the current context + */ + public void onEndElement(String uri, String tag, AntXMLContext context) { + } + + /** + * Handles text within an element. This base implementation just + * throws an exception, you must override it if you expect content. + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + * @param context The current context. + * + * @exception SAXParseException if this method is not overridden, or in + * case of error in an overridden version + */ + public void characters(char[] buf, int start, int count, AntXMLContext context) + throws SAXParseException { + String s = new String(buf, start, count).trim(); + + if (s.length() > 0) { + throw new SAXParseException("Unexpected text \"" + s + "\"", context.getLocator()); + } + } + + /** + * Will be called every time a namespace is reached. + * It'll verify if the ns was processed, and if not load the task definitions. + * @param uri The namespace uri. + */ + protected void checkNamespace(String uri) { + } + } + + /** + * Handler for ant processing. Uses a stack of AntHandlers to + * implement each element ( the original parser used a recursive behavior, + * with the implicit execution stack ) + */ + public static class RootHandler extends DefaultHandler { + private Stack antHandlers = new Stack(); + private AntHandler currentHandler = null; + private AntXMLContext context; + + /** + * Creates a new RootHandler instance. + * + * @param context The context for the handler. + * @param rootHandler The handler for the root element. + */ + public RootHandler(AntXMLContext context, AntHandler rootHandler) { + currentHandler = rootHandler; + antHandlers.push(currentHandler); + this.context = context; + } + + /** + * Returns the current ant handler object. + * @return the current ant handler. + */ + public AntHandler getCurrentAntHandler() { + return currentHandler; + } + + /** + * Resolves file: URIs relative to the build file. + * + * @param publicId The public identifier, or null + * if none is available. Ignored in this + * implementation. + * @param systemId The system identifier provided in the XML + * document. Will not be null. + * @return an inputsource for this identifier + */ + public InputSource resolveEntity(String publicId, String systemId) { + + context.getProject().log("resolving systemId: " + systemId, Project.MSG_VERBOSE); + + if (systemId.startsWith("file:")) { + String path = FILE_UTILS.fromURI(systemId); + + File file = new File(path); + if (!file.isAbsolute()) { + file = FILE_UTILS.resolveFile(context.getBuildFileParent(), path); + context.getProject().log( + "Warning: '" + systemId + "' in " + context.getBuildFile() + + " should be expressed simply as '" + path.replace('\\', '/') + + "' for compliance with other XML tools", Project.MSG_WARN); + } + context.getProject().log("file=" + file, Project.MSG_DEBUG); + try { + InputSource inputSource = new InputSource(new FileInputStream(file)); + inputSource.setSystemId(FILE_UTILS.toURI(file.getAbsolutePath())); + return inputSource; + } catch (FileNotFoundException fne) { + context.getProject().log(file.getAbsolutePath() + " could not be found", + Project.MSG_WARN); + } + + } + // use default if not file or file not found + context.getProject().log("could not resolve systemId", Project.MSG_DEBUG); + return null; + } + + /** + * Handles the start of a project element. A project handler is created + * and initialised with the element name and attributes. + * + * @param uri The namespace uri for this element. + * @param tag The name of the element being started. + * Will not be null. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception org.xml.sax.SAXParseException if the tag given is not + * "project" + */ + public void startElement(String uri, String tag, String qname, Attributes attrs) + throws SAXParseException { + AntHandler next = currentHandler.onStartChild(uri, tag, qname, attrs, context); + antHandlers.push(currentHandler); + currentHandler = next; + currentHandler.onStartElement(uri, tag, qname, attrs, context); + } + + /** + * Sets the locator in the project helper for future reference. + * + * @param locator The locator used by the parser. + * Will not be null. + */ + public void setDocumentLocator(Locator locator) { + context.setLocator(locator); + } + + /** + * Handles the end of an element. Any required clean-up is performed + * by the onEndElement() method and then the original handler is restored to the parser. + * + * @param uri The namespace URI for this element. + * @param name The name of the element which is ending. + * Will not be null. + * @param qName The qualified name for this element. + * + * @exception SAXException in case of error (not thrown in this implementation) + */ + public void endElement(String uri, String name, String qName) throws SAXException { + currentHandler.onEndElement(uri, name, context); + AntHandler prev = (AntHandler) antHandlers.pop(); + currentHandler = prev; + if (currentHandler != null) { + currentHandler.onEndChild(uri, name, qName, context); + } + } + + /** + * Handle text within an element, calls currentHandler.characters. + * + * @param buf A character array of the test. + * @param start The start offset in the array. + * @param count The number of characters to read. + * @exception SAXParseException if an error occurs + */ + public void characters(char[] buf, int start, int count) throws SAXParseException { + currentHandler.characters(buf, start, count, context); + } + + /** + * Start a namespace prefix to uri mapping + * + * @param prefix the namespace prefix + * @param uri the namespace uri + */ + public void startPrefixMapping(String prefix, String uri) { + context.startPrefixMapping(prefix, uri); + } + + /** + * End a namespace prefix to uri mapping + * + * @param prefix the prefix that is not mapped anymore + */ + public void endPrefixMapping(String prefix) { + context.endPrefixMapping(prefix); + } + } + + /** + * The main handler - it handles the <project> tag. + * + * @see org.apache.tools.ant.helper.ProjectHelper2.AntHandler + */ + public static class MainHandler extends AntHandler { + + /** + * Handle the project tag + * + * @param uri The namespace uri. + * @param name The element tag. + * @param qname The element qualified name. + * @param attrs The attributes of the element. + * @param context The current context. + * @return The project handler that handles subelements of project + * @exception SAXParseException if the qualified name is not "project". + */ + public AntHandler onStartChild(String uri, String name, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + if (name.equals("project") + && (uri.equals("") || uri.equals(ANT_CORE_URI))) { + return ProjectHelper2.projectHandler; + } + if (name.equals(qname)) { + throw new SAXParseException("Unexpected element \"{" + uri + + "}" + name + "\" {" + ANT_CORE_URI + "}" + name, context.getLocator()); + } + throw new SAXParseException("Unexpected element \"" + qname + + "\" " + name, context.getLocator()); + } + } + + /** + * Handler for the top level "project" element. + */ + public static class ProjectHandler extends AntHandler { + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. The attributes which + * this handler can deal with are: "default", + * "name", "id" and "basedir". + * + * @param uri The namespace URI for this element. + * @param tag Name of the element which caused this handler + * to be created. Should not be null. + * Ignored in this implementation. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * @param context The current context. + * + * @exception SAXParseException if an unexpected attribute is + * encountered or if the "default" attribute + * is missing. + */ + public void onStartElement(String uri, String tag, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + String baseDir = null; + boolean nameAttributeSet = false; + + Project project = context.getProject(); + // Set the location of the implicit target associated with the project tag + context.getImplicitTarget().setLocation(new Location(context.getLocator())); + + /** TODO I really don't like this - the XML processor is still + * too 'involved' in the processing. A better solution (IMO) + * would be to create UE for Project and Target too, and + * then process the tree and have Project/Target deal with + * its attributes ( similar with Description ). + * + * If we eventually switch to ( or add support for ) DOM, + * things will work smoothly - UE can be avoided almost completely + * ( it could still be created on demand, for backward compatibility ) + */ + + for (int i = 0; i < attrs.getLength(); i++) { + String attrUri = attrs.getURI(i); + if (attrUri != null && !attrUri.equals("") && !attrUri.equals(uri)) { + continue; // Ignore attributes from unknown uris + } + String key = attrs.getLocalName(i); + String value = attrs.getValue(i); + + if (key.equals("default")) { + if (value != null && !value.equals("")) { + if (!context.isIgnoringProjectTag()) { + project.setDefault(value); + } + } + } else if (key.equals("name")) { + if (value != null) { + context.setCurrentProjectName(value); + nameAttributeSet = true; + if (!context.isIgnoringProjectTag()) { + project.setName(value); + project.addReference(value, project); + } else if (isInIncludeMode()) { + if (!"".equals(value) && getCurrentTargetPrefix()!= null && getCurrentTargetPrefix().endsWith(ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX)) { + String newTargetPrefix = getCurrentTargetPrefix().replace(ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX, value); + // help nested include tasks + setCurrentTargetPrefix(newTargetPrefix); + } + } + } + } else if (key.equals("id")) { + if (value != null) { + // What's the difference between id and name ? + if (!context.isIgnoringProjectTag()) { + project.addReference(value, project); + } + } + } else if (key.equals("basedir")) { + if (!context.isIgnoringProjectTag()) { + baseDir = value; + } + } else { + // TODO ignore attributes in a different NS ( maybe store them ? ) + throw new SAXParseException("Unexpected attribute \"" + attrs.getQName(i) + + "\"", context.getLocator()); + } + } + + // TODO Move to Project ( so it is shared by all helpers ) + String antFileProp = + MagicNames.ANT_FILE + "." + context.getCurrentProjectName(); + String dup = project.getProperty(antFileProp); + String typeProp = + MagicNames.ANT_FILE_TYPE + "." + context.getCurrentProjectName(); + String dupType = project.getProperty(typeProp); + if (dup != null && nameAttributeSet) { + Object dupFile = null; + Object contextFile = null; + if (MagicNames.ANT_FILE_TYPE_URL.equals(dupType)) { + try { + dupFile = new URL(dup); + } catch (java.net.MalformedURLException mue) { + throw new BuildException("failed to parse " + + dup + " as URL while looking" + + " at a duplicate project" + + " name.", mue); + } + contextFile = context.getBuildFileURL(); + } else { + dupFile = new File(dup); + contextFile = context.getBuildFile(); + } + + if (context.isIgnoringProjectTag() && !dupFile.equals(contextFile)) { + project.log("Duplicated project name in import. Project " + + context.getCurrentProjectName() + " defined first in " + dup + + " and again in " + contextFile, Project.MSG_WARN); + } + } + if (nameAttributeSet) { + if (context.getBuildFile() != null) { + project.setUserProperty(antFileProp, + context.getBuildFile().toString()); + project.setUserProperty(typeProp, + MagicNames.ANT_FILE_TYPE_FILE); + } else if (context.getBuildFileURL() != null) { + project.setUserProperty(antFileProp, + context.getBuildFileURL().toString()); + project.setUserProperty(typeProp, + MagicNames.ANT_FILE_TYPE_URL); + } + } + if (context.isIgnoringProjectTag()) { + // no further processing + return; + } + // set explicitly before starting ? + if (project.getProperty("basedir") != null) { + project.setBasedir(project.getProperty("basedir")); + } else { + // Default for baseDir is the location of the build file. + if (baseDir == null) { + project.setBasedir(context.getBuildFileParent().getAbsolutePath()); + } else { + // check whether the user has specified an absolute path + if ((new File(baseDir)).isAbsolute()) { + project.setBasedir(baseDir); + } else { + project.setBaseDir(FILE_UTILS.resolveFile(context.getBuildFileParent(), + baseDir)); + } + } + } + project.addTarget("", context.getImplicitTarget()); + context.setCurrentTarget(context.getImplicitTarget()); + } + + /** + * Handles the start of a top-level element within the project. An + * appropriate handler is created and initialised with the details + * of the element. + * + * @param uri The namespace URI for this element. + * @param name The name of the element being started. + * Will not be null. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element being started. + * Will not be null. + * @param context The context for this element. + * @return a target or an element handler. + * + * @exception org.xml.sax.SAXParseException if the tag given is not + * "taskdef", "typedef", + * "property", "target", + * "extension-point" + * or a data type definition + */ + public AntHandler onStartChild(String uri, String name, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + return (name.equals("target") || name.equals("extension-point")) + && (uri.equals("") || uri.equals(ANT_CORE_URI)) + ? ProjectHelper2.targetHandler : ProjectHelper2.elementHandler; + } + } + + /** + * Handler for "target" and "extension-point" elements. + */ + public static class TargetHandler extends AntHandler { + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. The attributes which + * this handler can deal with are: "name", + * "depends", "if", + * "unless", "id" and + * "description". + * + * @param uri The namespace URI for this element. + * @param tag Name of the element which caused this handler + * to be created. Should not be null. + * Ignored in this implementation. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * @param context The current context. + * + * @exception SAXParseException if an unexpected attribute is encountered + * or if the "name" attribute is missing. + */ + public void onStartElement(String uri, String tag, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + String name = null; + String depends = ""; + String extensionPoint = null; + OnMissingExtensionPoint extensionPointMissing = null; + + Project project = context.getProject(); + Target target = "target".equals(tag) + ? new Target() : new ExtensionPoint(); + target.setProject(project); + target.setLocation(new Location(context.getLocator())); + context.addTarget(target); + + for (int i = 0; i < attrs.getLength(); i++) { + String attrUri = attrs.getURI(i); + if (attrUri != null && !attrUri.equals("") && !attrUri.equals(uri)) { + continue; // Ignore attributes from unknown uris + } + String key = attrs.getLocalName(i); + String value = attrs.getValue(i); + + if (key.equals("name")) { + name = value; + if ("".equals(name)) { + throw new BuildException("name attribute must " + "not be empty"); + } + } else if (key.equals("depends")) { + depends = value; + } else if (key.equals("if")) { + target.setIf(value); + } else if (key.equals("unless")) { + target.setUnless(value); + } else if (key.equals("id")) { + if (value != null && !value.equals("")) { + context.getProject().addReference(value, target); + } + } else if (key.equals("description")) { + target.setDescription(value); + } else if (key.equals("extensionOf")) { + extensionPoint = value; + } else if (key.equals("onMissingExtensionPoint")) { + try { + extensionPointMissing = OnMissingExtensionPoint.valueOf(value); + } catch (IllegalArgumentException e) { + throw new BuildException("Invalid onMissingExtensionPoint " + value); + } + } else { + throw new SAXParseException("Unexpected attribute \"" + key + "\"", context + .getLocator()); + } + } + + if (name == null) { + throw new SAXParseException("target element appears without a name attribute", + context.getLocator()); + } + + String prefix = null; + boolean isInIncludeMode = + context.isIgnoringProjectTag() && isInIncludeMode(); + String sep = getCurrentPrefixSeparator(); + + if (isInIncludeMode) { + prefix = getTargetPrefix(context); + if (prefix == null) { + throw new BuildException("can't include build file " + + context.getBuildFileURL() + + ", no as attribute has been given" + + " and the project tag doesn't" + + " specify a name attribute"); + } + name = prefix + sep + name; + } + + // Check if this target is in the current build file + if (context.getCurrentTargets().get(name) != null) { + throw new BuildException("Duplicate target '" + name + "'", + target.getLocation()); + } + Hashtable projectTargets = project.getTargets(); + boolean usedTarget = false; + // If the name has not already been defined define it + if (projectTargets.containsKey(name)) { + project.log("Already defined in main or a previous import, ignore " + name, + Project.MSG_VERBOSE); + } else { + target.setName(name); + context.getCurrentTargets().put(name, target); + project.addOrReplaceTarget(name, target); + usedTarget = true; + } + + if (depends.length() > 0) { + if (!isInIncludeMode) { + target.setDepends(depends); + } else { + for (String string : Target.parseDepends(depends, name, "depends")) { + target.addDependency(prefix + sep + string); + } + } + } + if (!isInIncludeMode && context.isIgnoringProjectTag() + && (prefix = getTargetPrefix(context)) != null) { + // In an imported file (and not completely + // ignoring the project tag or having a preconfigured prefix) + String newName = prefix + sep + name; + Target newTarget = target; + if (usedTarget) { + newTarget = "target".equals(tag) + ? new Target(target) : new ExtensionPoint(target); + } + newTarget.setName(newName); + context.getCurrentTargets().put(newName, newTarget); + project.addOrReplaceTarget(newName, newTarget); + } + if (extensionPointMissing != null && extensionPoint == null) { + throw new BuildException("onMissingExtensionPoint attribute cannot " + + "be specified unless extensionOf is specified", + target.getLocation()); + + } + if (extensionPoint != null) { + ProjectHelper helper = + (ProjectHelper) context.getProject(). + getReference(ProjectHelper.PROJECTHELPER_REFERENCE); + for (String extPointName : Target.parseDepends(extensionPoint, name, "extensionOf")) { + if (extensionPointMissing == null) { + extensionPointMissing = OnMissingExtensionPoint.FAIL; + } + // defer extensionpoint resolution until the full + // import stack has been processed + if (isInIncludeMode()) { + // if in include mode, provide prefix we're including by + // so that we can try and resolve extension point from + // the local file first + helper.getExtensionStack().add( + new String[] {extPointName, target.getName(), + extensionPointMissing.name(), prefix + sep}); + } else { + helper.getExtensionStack().add( + new String[] {extPointName, target.getName(), + extensionPointMissing.name()}); + } + } + } + } + + private String getTargetPrefix(AntXMLContext context) { + String configuredValue = getCurrentTargetPrefix(); + if (configuredValue != null && configuredValue.length() == 0) { + configuredValue = null; + } + if (configuredValue != null) { + return configuredValue; + } + + String projectName = context.getCurrentProjectName(); + if ("".equals(projectName)) { + projectName = null; + } + + return projectName; + } + + /** + * Handles the start of an element within a target. + * + * @param uri The namespace URI for this element. + * @param name The name of the element being started. + * Will not be null. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element being started. + * Will not be null. + * @param context The current context. + * @return an element handler. + * + * @exception SAXParseException if an error occurs when initialising + * the appropriate child handler + */ + public AntHandler onStartChild(String uri, String name, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + return ProjectHelper2.elementHandler; + } + + /** + * Handle the end of the project, sets the current target of the + * context to be the implicit target. + * + * @param uri The namespace URI of the element. + * @param tag The name of the element. + * @param context The current context. + */ + public void onEndElement(String uri, String tag, AntXMLContext context) { + context.setCurrentTarget(context.getImplicitTarget()); + } + } + + /** + * Handler for all project elements ( tasks, data types ) + */ + public static class ElementHandler extends AntHandler { + + /** + * Constructor. + */ + public ElementHandler() { + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. This configures + * the element with its attributes and sets it up with + * its parent container (if any). Nested elements are then + * added later as the parser encounters them. + * + * @param uri The namespace URI for this element. + * @param tag Name of the element which caused this handler + * to be created. Must not be null. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * @param context The current context. + * + * @exception SAXParseException in case of error (not thrown in + * this implementation) + */ + public void onStartElement(String uri, String tag, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + RuntimeConfigurable parentWrapper = context.currentWrapper(); + Object parent = null; + + if (parentWrapper != null) { + parent = parentWrapper.getProxy(); + } + + /* UnknownElement is used for tasks and data types - with + delayed eval */ + UnknownElement task = new UnknownElement(tag); + task.setProject(context.getProject()); + task.setNamespace(uri); + task.setQName(qname); + task.setTaskType(ProjectHelper.genComponentName(task.getNamespace(), tag)); + task.setTaskName(qname); + + Location location = new Location(context.getLocator().getSystemId(), context + .getLocator().getLineNumber(), context.getLocator().getColumnNumber()); + task.setLocation(location); + task.setOwningTarget(context.getCurrentTarget()); + + if (parent != null) { + // Nested element + ((UnknownElement) parent).addChild(task); + } else { + // Task included in a target ( including the default one ). + context.getCurrentTarget().addTask(task); + } + + context.configureId(task, attrs); + + // container.addTask(task); + // This is a nop in UE: task.init(); + + RuntimeConfigurable wrapper = new RuntimeConfigurable(task, task.getTaskName()); + + for (int i = 0; i < attrs.getLength(); i++) { + String name = attrs.getLocalName(i); + String attrUri = attrs.getURI(i); + if (attrUri != null && !attrUri.equals("") && !attrUri.equals(uri)) { + name = attrUri + ":" + attrs.getQName(i); + } + String value = attrs.getValue(i); + // PR: Hack for ant-type value + // an ant-type is a component name which can + // be namespaced, need to extract the name + // and convert from qualified name to uri/name + if (ANT_TYPE.equals(name) + || (ANT_CORE_URI.equals(attrUri) + && ANT_TYPE.equals(attrs.getLocalName(i)))) { + name = ANT_TYPE; + int index = value.indexOf(":"); + if (index >= 0) { + String prefix = value.substring(0, index); + String mappedUri = context.getPrefixMapping(prefix); + if (mappedUri == null) { + throw new BuildException("Unable to find XML NS prefix \"" + prefix + + "\""); + } + value = ProjectHelper.genComponentName(mappedUri, value + .substring(index + 1)); + } + } + wrapper.setAttribute(name, value); + } + if (parentWrapper != null) { + parentWrapper.addChild(wrapper); + } + context.pushWrapper(wrapper); + } + + /** + * Adds text to the task, using the wrapper + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + * @param context The current context. + * + * @exception SAXParseException if the element doesn't support text + * + * @see ProjectHelper#addText(Project,java.lang.Object,char[],int,int) + */ + public void characters(char[] buf, int start, int count, + AntXMLContext context) throws SAXParseException { + RuntimeConfigurable wrapper = context.currentWrapper(); + wrapper.addText(buf, start, count); + } + + /** + * Handles the start of an element within a target. Task containers + * will always use another task handler, and all other tasks + * will always use a nested element handler. + * + * @param uri The namespace URI for this element. + * @param tag The name of the element being started. + * Will not be null. + * @param qname The qualified name for this element. + * @param attrs Attributes of the element being started. + * Will not be null. + * @param context The current context. + * @return The handler for elements. + * + * @exception SAXParseException if an error occurs when initialising + * the appropriate child handler + */ + public AntHandler onStartChild(String uri, String tag, String qname, Attributes attrs, + AntXMLContext context) throws SAXParseException { + return ProjectHelper2.elementHandler; + } + + /** + * Handles the end of the element. This pops the wrapper from + * the context. + * + * @param uri The namespace URI for the element. + * @param tag The name of the element. + * @param context The current context. + */ + public void onEndElement(String uri, String tag, AntXMLContext context) { + context.popWrapper(); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelperImpl.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelperImpl.java new file mode 100644 index 00000000..f828d292 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/ProjectHelperImpl.java @@ -0,0 +1,1026 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.helper; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Locale; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.IntrospectionHelper; +import org.apache.tools.ant.Location; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectHelper; +import org.apache.tools.ant.RuntimeConfigurable; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.TaskContainer; +import org.apache.tools.ant.TypeAdapter; +import org.apache.tools.ant.UnknownElement; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.JAXPUtils; +import org.xml.sax.AttributeList; +import org.xml.sax.DocumentHandler; +import org.xml.sax.HandlerBase; +import org.xml.sax.InputSource; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.XMLReaderAdapter; + +/** + * Original helper. + * + */ +public class ProjectHelperImpl extends ProjectHelper { + + /** + * helper for path -> URI and URI -> path conversions. + */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** + * SAX 1 style parser used to parse the given file. This may + * in fact be a SAX 2 XMLReader wrapped in an XMLReaderAdapter. + */ + private org.xml.sax.Parser parser; + + /** The project to configure. */ + private Project project; + + /** The configuration file to parse. */ + private File buildFile; + + /** + * Parent directory of the build file. Used for resolving entities + * and setting the project's base directory. + */ + private File buildFileParent; + + /** + * Locator for the configuration file parser. + * Used for giving locations of errors etc. + */ + private Locator locator; + + /** + * Target that all other targets will depend upon implicitly. + * + *

    This holds all tasks and data type definitions that have + * been placed outside of targets.

    + */ + private Target implicitTarget = new Target(); + + /** + * default constructor + */ + public ProjectHelperImpl() { + implicitTarget.setName(""); + } + + /** + * Parses the project file, configuring the project as it goes. + * + * @param project project instance to be configured. + * @param source the source from which the project is read. + * @exception BuildException if the configuration is invalid or cannot + * be read. + */ + public void parse(Project project, Object source) throws BuildException { + if (!(source instanceof File)) { + throw new BuildException("Only File source supported by " + + "default plugin"); + } + File bFile = (File) source; + FileInputStream inputStream = null; + InputSource inputSource = null; + + this.project = project; + this.buildFile = new File(bFile.getAbsolutePath()); + buildFileParent = new File(this.buildFile.getParent()); + + try { + try { + parser = JAXPUtils.getParser(); + } catch (BuildException e) { + parser = new XMLReaderAdapter(JAXPUtils.getXMLReader()); + } + String uri = FILE_UTILS.toURI(bFile.getAbsolutePath()); + inputStream = new FileInputStream(bFile); + inputSource = new InputSource(inputStream); + inputSource.setSystemId(uri); + project.log("parsing buildfile " + bFile + " with URI = " + uri, Project.MSG_VERBOSE); + HandlerBase hb = new RootHandler(this); + parser.setDocumentHandler(hb); + parser.setEntityResolver(hb); + parser.setErrorHandler(hb); + parser.setDTDHandler(hb); + parser.parse(inputSource); + } catch (SAXParseException exc) { + Location location = new Location(exc.getSystemId(), exc.getLineNumber(), exc + .getColumnNumber()); + + Throwable t = exc.getException(); + if (t instanceof BuildException) { + BuildException be = (BuildException) t; + if (be.getLocation() == Location.UNKNOWN_LOCATION) { + be.setLocation(location); + } + throw be; + } + throw new BuildException(exc.getMessage(), t, location); + } catch (SAXException exc) { + Throwable t = exc.getException(); + if (t instanceof BuildException) { + throw (BuildException) t; + } + throw new BuildException(exc.getMessage(), t); + } catch (FileNotFoundException exc) { + throw new BuildException(exc); + } catch (UnsupportedEncodingException exc) { + throw new BuildException("Encoding of project file is invalid.", exc); + } catch (IOException exc) { + throw new BuildException("Error reading project file: " + exc.getMessage(), exc); + } finally { + FileUtils.close(inputStream); + } + } + + /** + * The common superclass for all SAX event handlers used to parse + * the configuration file. Each method just throws an exception, + * so subclasses should override what they can handle. + * + * Each type of XML element (task, target, etc.) in Ant has + * a specific subclass. + * + * In the constructor, this class takes over the handling of SAX + * events from the parent handler and returns + * control back to the parent in the endElement method. + */ + static class AbstractHandler extends HandlerBase { + // CheckStyle:VisibilityModifier OFF - bc + + /** + * Previous handler for the document. + * When the next element is finished, control returns + * to this handler. + */ + protected DocumentHandler parentHandler; + + /** Helper impl. With non-static internal classes, the compiler will generate + this automatically - but this will fail with some compilers ( reporting + "Expecting to find object/array on stack" ). If we pass it + explicitly it'll work with more compilers. + */ + ProjectHelperImpl helperImpl; + // CheckStyle:VisibilityModifier ON + + /** + * Creates a handler and sets the parser to use it + * for the current element. + * + * @param helperImpl the ProjectHelperImpl instance associated + * with this handler. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + */ + public AbstractHandler(ProjectHelperImpl helperImpl, DocumentHandler parentHandler) { + this.parentHandler = parentHandler; + this.helperImpl = helperImpl; + + // Start handling SAX events + helperImpl.parser.setDocumentHandler(this); + } + + /** + * Handles the start of an element. This base implementation just + * throws an exception. + * + * @param tag The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if this method is not overridden, or in + * case of error in an overridden version + */ + public void startElement(String tag, AttributeList attrs) throws SAXParseException { + throw new SAXParseException("Unexpected element \"" + tag + "\"", helperImpl.locator); + } + + /** + * Handles text within an element. This base implementation just + * throws an exception. + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + * + * @exception SAXParseException if this method is not overridden, or in + * case of error in an overridden version + */ + public void characters(char[] buf, int start, int count) throws SAXParseException { + String s = new String(buf, start, count).trim(); + + if (s.length() > 0) { + throw new SAXParseException("Unexpected text \"" + s + "\"", helperImpl.locator); + } + } + + /** + * Handles the end of an element. Any required clean-up is performed + * by the finished() method and then the original handler is restored to + * the parser. + * + * @param name The name of the element which is ending. + * Will not be null. + * + * @exception SAXException in case of error (not thrown in + * this implementation) + */ + public void endElement(String name) throws SAXException { + // Let parent resume handling SAX events + helperImpl.parser.setDocumentHandler(parentHandler); + } + } + + /** + * Handler for the root element. Its only child must be the "project" element. + */ + static class RootHandler extends HandlerBase { + // CheckStyle:VisibilityModifier OFF - bc + ProjectHelperImpl helperImpl; + // CheckStyle:VisibilityModifier ON + + public RootHandler(ProjectHelperImpl helperImpl) { + this.helperImpl = helperImpl; + } + + /** + * Resolves file: URIs relative to the build file. + * + * @param publicId The public identifier, or null + * if none is available. Ignored in this + * implementation. + * @param systemId The system identifier provided in the XML + * document. Will not be null. + */ + public InputSource resolveEntity(String publicId, String systemId) { + + helperImpl.project.log("resolving systemId: " + systemId, Project.MSG_VERBOSE); + + if (systemId.startsWith("file:")) { + String path = FILE_UTILS.fromURI(systemId); + + File file = new File(path); + if (!file.isAbsolute()) { + file = FILE_UTILS.resolveFile(helperImpl.buildFileParent, path); + helperImpl.project.log("Warning: '" + systemId + "' in " + helperImpl.buildFile + + " should be expressed simply as '" + path.replace('\\', '/') + + "' for compliance with other XML tools", Project.MSG_WARN); + } + try { + InputSource inputSource = new InputSource(new FileInputStream(file)); + inputSource.setSystemId(FILE_UTILS.toURI(file.getAbsolutePath())); + return inputSource; + } catch (FileNotFoundException fne) { + helperImpl.project.log(file.getAbsolutePath() + " could not be found", + Project.MSG_WARN); + } + } + // use default if not file or file not found + return null; + } + + /** + * Handles the start of a project element. A project handler is created + * and initialised with the element name and attributes. + * + * @param tag The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if the tag given is not + * "project" + */ + public void startElement(String tag, AttributeList attrs) throws SAXParseException { + if (tag.equals("project")) { + new ProjectHandler(helperImpl, this).init(tag, attrs); + } else { + throw new SAXParseException("Config file is not of expected " + "XML type", + helperImpl.locator); + } + } + + /** + * Sets the locator in the project helper for future reference. + * + * @param locator The locator used by the parser. + * Will not be null. + */ + public void setDocumentLocator(Locator locator) { + helperImpl.locator = locator; + } + } + + /** + * Handler for the top level "project" element. + */ + static class ProjectHandler extends AbstractHandler { + + /** + * Constructor which just delegates to the superconstructor. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + */ + public ProjectHandler(ProjectHelperImpl helperImpl, DocumentHandler parentHandler) { + super(helperImpl, parentHandler); + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. The attributes which + * this handler can deal with are: "default", + * "name", "id" and "basedir". + * + * @param tag Name of the element which caused this handler + * to be created. Should not be null. + * Ignored in this implementation. + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * + * @exception SAXParseException if an unexpected attribute is + * encountered or if the "default" attribute + * is missing. + */ + public void init(String tag, AttributeList attrs) throws SAXParseException { + String def = null; + String name = null; + String id = null; + String baseDir = null; + + for (int i = 0; i < attrs.getLength(); i++) { + String key = attrs.getName(i); + String value = attrs.getValue(i); + + if (key.equals("default")) { + def = value; + } else if (key.equals("name")) { + name = value; + } else if (key.equals("id")) { + id = value; + } else if (key.equals("basedir")) { + baseDir = value; + } else { + throw new SAXParseException( + "Unexpected attribute \"" + attrs.getName(i) + + "\"", helperImpl.locator); + } + } + + if (def != null && !def.equals("")) { + helperImpl.project.setDefault(def); + } else { + throw new BuildException("The default attribute is required"); + } + + if (name != null) { + helperImpl.project.setName(name); + helperImpl.project.addReference(name, helperImpl.project); + } + + if (id != null) { + helperImpl.project.addReference(id, helperImpl.project); + } + + if (helperImpl.project.getProperty("basedir") != null) { + helperImpl.project.setBasedir(helperImpl.project.getProperty("basedir")); + } else { + if (baseDir == null) { + helperImpl.project.setBasedir(helperImpl.buildFileParent.getAbsolutePath()); + } else { + // check whether the user has specified an absolute path + if ((new File(baseDir)).isAbsolute()) { + helperImpl.project.setBasedir(baseDir); + } else { + File resolvedBaseDir = FILE_UTILS.resolveFile(helperImpl.buildFileParent, + baseDir); + helperImpl.project.setBaseDir(resolvedBaseDir); + } + } + } + + helperImpl.project.addTarget("", helperImpl.implicitTarget); + } + + /** + * Handles the start of a top-level element within the project. An + * appropriate handler is created and initialised with the details + * of the element. + * + * @param name The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if the tag given is not + * "taskdef", "typedef", + * "property", "target" + * or a data type definition + */ + public void startElement(String name, AttributeList attrs) throws SAXParseException { + if (name.equals("target")) { + handleTarget(name, attrs); + } else { + handleElement(helperImpl, this, helperImpl.implicitTarget, name, attrs); + } + } + + /** + * Handles a target definition element by creating a target handler + * and initialising is with the details of the element. + * + * @param tag The name of the element to be handled. + * Will not be null. + * @param attrs Attributes of the element to be handled. + * Will not be null. + * + * @exception SAXParseException if an error occurs initialising + * the handler + */ + private void handleTarget(String tag, AttributeList attrs) throws SAXParseException { + new TargetHandler(helperImpl, this).init(tag, attrs); + } + } + + /** + * Handler for "target" elements. + */ + static class TargetHandler extends AbstractHandler { + private Target target; + + /** + * Constructor which just delegates to the superconstructor. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + */ + public TargetHandler(ProjectHelperImpl helperImpl, DocumentHandler parentHandler) { + super(helperImpl, parentHandler); + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. The attributes which + * this handler can deal with are: "name", + * "depends", "if", + * "unless", "id" and + * "description". + * + * @param tag Name of the element which caused this handler + * to be created. Should not be null. + * Ignored in this implementation. + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * + * @exception SAXParseException if an unexpected attribute is encountered + * or if the "name" attribute is missing. + */ + public void init(String tag, AttributeList attrs) throws SAXParseException { + String name = null; + String depends = ""; + String ifCond = null; + String unlessCond = null; + String id = null; + String description = null; + + for (int i = 0; i < attrs.getLength(); i++) { + String key = attrs.getName(i); + String value = attrs.getValue(i); + + if (key.equals("name")) { + name = value; + if (name.equals("")) { + throw new BuildException("name attribute must not" + " be empty", + new Location(helperImpl.locator)); + } + } else if (key.equals("depends")) { + depends = value; + } else if (key.equals("if")) { + ifCond = value; + } else if (key.equals("unless")) { + unlessCond = value; + } else if (key.equals("id")) { + id = value; + } else if (key.equals("description")) { + description = value; + } else { + throw new SAXParseException("Unexpected attribute \"" + key + "\"", + helperImpl.locator); + } + } + + if (name == null) { + throw new SAXParseException("target element appears without a name attribute", + helperImpl.locator); + } + + target = new Target(); + + // implicit target must be first on dependency list + target.addDependency(""); + + target.setName(name); + target.setIf(ifCond); + target.setUnless(unlessCond); + target.setDescription(description); + helperImpl.project.addTarget(name, target); + + if (id != null && !id.equals("")) { + helperImpl.project.addReference(id, target); + } + + // take care of dependencies + + if (depends.length() > 0) { + target.setDepends(depends); + } + } + + /** + * Handles the start of an element within a target. + * + * @param name The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if an error occurs when initialising + * the appropriate child handler + */ + public void startElement(String name, AttributeList attrs) throws SAXParseException { + handleElement(helperImpl, this, target, name, attrs); + } + } + + /** + * Start a new DataTypeHandler if element is known to be a + * data-type and a TaskHandler otherwise. + * + *

    Factored out of TargetHandler.

    + * + * @since Ant 1.6 + */ + private static void handleElement(ProjectHelperImpl helperImpl, DocumentHandler parent, + Target target, String elementName, AttributeList attrs) throws SAXParseException { + if (elementName.equals("description")) { + new DescriptionHandler(helperImpl, parent); + } else if (helperImpl.project.getDataTypeDefinitions().get(elementName) != null) { + new DataTypeHandler(helperImpl, parent, target).init(elementName, attrs); + } else { + new TaskHandler(helperImpl, parent, target, null, target).init(elementName, attrs); + } + } + + /** + * Handler for "description" elements. + */ + static class DescriptionHandler extends AbstractHandler { + + /** + * Constructor which just delegates to the superconstructor. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + */ + public DescriptionHandler(ProjectHelperImpl helperImpl, + DocumentHandler parentHandler) { + super(helperImpl, parentHandler); + } + + /** + * Adds the text as description to the project. + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + */ + public void characters(char[] buf, int start, int count) { + String text = new String(buf, start, count); + String currentDescription = helperImpl.project.getDescription(); + if (currentDescription == null) { + helperImpl.project.setDescription(text); + } else { + helperImpl.project.setDescription(currentDescription + text); + } + } + + } + + /** + * Handler for all task elements. + */ + static class TaskHandler extends AbstractHandler { + /** Containing target, if any. */ + private Target target; + + /** + * Container for the task, if any. If target is + * non-null, this must be too. + */ + private TaskContainer container; + + /** + * Task created by this handler. + */ + private Task task; + + /** + * Wrapper for the parent element, if any. The wrapper for this + * element will be added to this wrapper as a child. + */ + private RuntimeConfigurable parentWrapper; + + /** + * Wrapper for this element which takes care of actually configuring + * the element, if this element is contained within a target. + * Otherwise the configuration is performed with the configure method. + * @see ProjectHelper#configure(Object,AttributeList,Project) + */ + private RuntimeConfigurable wrapper = null; + + /** + * Constructor. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + * + * @param container Container for the element. + * Must not be null. + * + * @param parentWrapper Wrapper for the parent element, if any. + * May be null. + * + * @param target Target this element is part of. + * Must not be null. + */ + public TaskHandler(ProjectHelperImpl helperImpl, DocumentHandler parentHandler, + TaskContainer container, + RuntimeConfigurable parentWrapper, Target target) { + super(helperImpl, parentHandler); + this.container = container; + this.parentWrapper = parentWrapper; + this.target = target; + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. This configures + * the element with its attributes and sets it up with + * its parent container (if any). Nested elements are then + * added later as the parser encounters them. + * + * @param tag Name of the element which caused this handler + * to be created. Must not be null. + * + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * + * @exception SAXParseException in case of error (not thrown in + * this implementation) + */ + public void init(String tag, AttributeList attrs) throws SAXParseException { + try { + task = helperImpl.project.createTask(tag); + } catch (BuildException e) { + // swallow here, will be thrown again in + // UnknownElement.maybeConfigure if the problem persists. + } + if (task == null) { + task = new UnknownElement(tag); + task.setProject(helperImpl.project); + //TODO task.setTaskType(tag); + task.setTaskName(tag); + } + task.setLocation(new Location(helperImpl.locator)); + helperImpl.configureId(task, attrs); + + task.setOwningTarget(target); + container.addTask(task); + task.init(); + wrapper = task.getRuntimeConfigurableWrapper(); + wrapper.setAttributes(attrs); + if (parentWrapper != null) { + parentWrapper.addChild(wrapper); + } + } + + /** + * Adds text to the task, using the wrapper. + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + */ + public void characters(char[] buf, int start, int count) { + wrapper.addText(buf, start, count); + } + + /** + * Handles the start of an element within a target. Task containers + * will always use another task handler, and all other tasks + * will always use a nested element handler. + * + * @param name The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if an error occurs when initialising + * the appropriate child handler + */ + public void startElement(String name, AttributeList attrs) throws SAXParseException { + if (task instanceof TaskContainer) { + // task can contain other tasks - no other nested elements possible + new TaskHandler(helperImpl, this, (TaskContainer) task, wrapper, target).init(name, + attrs); + } else { + new NestedElementHandler(helperImpl, this, task, wrapper, target).init(name, attrs); + } + } + } + + /** + * Handler for all nested properties. + */ + static class NestedElementHandler extends AbstractHandler { + /** Parent object (task/data type/etc). */ + private Object parent; + + /** The nested element itself. */ + private Object child; + + /** + * Wrapper for the parent element, if any. The wrapper for this + * element will be added to this wrapper as a child. + */ + private RuntimeConfigurable parentWrapper; + + /** + * Wrapper for this element which takes care of actually configuring + * the element, if a parent wrapper is provided. + * Otherwise the configuration is performed with the configure method. + * @see ProjectHelper#configure(Object,AttributeList,Project) + */ + private RuntimeConfigurable childWrapper = null; + + /** Target this element is part of, if any. */ + private Target target; + + /** + * Constructor. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + * + * @param parent Parent of this element (task/data type/etc). + * Must not be null. + * + * @param parentWrapper Wrapper for the parent element, if any. + * Must not be null. + * + * @param target Target this element is part of. + * Must not be null. + */ + public NestedElementHandler(ProjectHelperImpl helperImpl, + DocumentHandler parentHandler, + Object parent, + RuntimeConfigurable parentWrapper, + Target target) { + super(helperImpl, parentHandler); + + if (parent instanceof TypeAdapter) { + this.parent = ((TypeAdapter) parent).getProxy(); + } else { + this.parent = parent; + } + this.parentWrapper = parentWrapper; + this.target = target; + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. This configures + * the element with its attributes and sets it up with + * its parent container (if any). Nested elements are then + * added later as the parser encounters them. + * + * @param propType Name of the element which caused this handler + * to be created. Must not be null. + * + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * + * @exception SAXParseException in case of error, such as a + * BuildException being thrown during configuration. + */ + public void init(String propType, AttributeList attrs) throws SAXParseException { + Class parentClass = parent.getClass(); + IntrospectionHelper ih = IntrospectionHelper.getHelper(helperImpl.project, parentClass); + + try { + String elementName = propType.toLowerCase(Locale.ENGLISH); + if (parent instanceof UnknownElement) { + UnknownElement uc = new UnknownElement(elementName); + uc.setProject(helperImpl.project); + ((UnknownElement) parent).addChild(uc); + child = uc; + } else { + child = ih.createElement(helperImpl.project, parent, elementName); + } + helperImpl.configureId(child, attrs); + + childWrapper = new RuntimeConfigurable(child, propType); + childWrapper.setAttributes(attrs); + parentWrapper.addChild(childWrapper); + } catch (BuildException exc) { + throw new SAXParseException(exc.getMessage(), helperImpl.locator, exc); + } + } + + /** + * Adds text to the element, using the wrapper. + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + */ + public void characters(char[] buf, int start, int count) { + childWrapper.addText(buf, start, count); + } + + /** + * Handles the start of an element within this one. Task containers + * will always use a task handler, and all other elements + * will always use another nested element handler. + * + * @param name The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if an error occurs when initialising + * the appropriate child handler + */ + public void startElement(String name, AttributeList attrs) throws SAXParseException { + if (child instanceof TaskContainer) { + // taskcontainer nested element can contain other tasks - no other + // nested elements possible + new TaskHandler(helperImpl, this, (TaskContainer) child, childWrapper, target) + .init(name, attrs); + } else { + new NestedElementHandler(helperImpl, this, child, childWrapper, target).init(name, + attrs); + } + } + } + + /** + * Handler for all data types directly subordinate to project or target. + */ + static class DataTypeHandler extends AbstractHandler { + /** Parent target, if any. */ + private Target target; + + /** The element being configured. */ + private Object element; + + /** Wrapper for this element, if it's part of a target. */ + private RuntimeConfigurable wrapper = null; + + /** + * Constructor with a target specified. + * + * @param parentHandler The handler which should be restored to the + * parser at the end of the element. + * Must not be null. + * + * @param target The parent target of this element. + * Must not be null. + */ + public DataTypeHandler(ProjectHelperImpl helperImpl, DocumentHandler parentHandler, + Target target) { + super(helperImpl, parentHandler); + this.target = target; + } + + /** + * Initialisation routine called after handler creation + * with the element name and attributes. This configures + * the element with its attributes and sets it up with + * its parent container (if any). Nested elements are then + * added later as the parser encounters them. + * + * @param propType Name of the element which caused this handler + * to be created. Must not be null. + * + * @param attrs Attributes of the element which caused this + * handler to be created. Must not be null. + * + * @exception SAXParseException in case of error, such as a + * BuildException being thrown during configuration. + */ + public void init(String propType, AttributeList attrs) throws SAXParseException { + try { + element = helperImpl.project.createDataType(propType); + if (element == null) { + throw new BuildException("Unknown data type " + propType); + } + wrapper = new RuntimeConfigurable(element, propType); + wrapper.setAttributes(attrs); + target.addDataType(wrapper); + } catch (BuildException exc) { + throw new SAXParseException(exc.getMessage(), helperImpl.locator, exc); + } + } + + /** + * Adds text to the using the wrapper. + * + * @param buf A character array of the text within the element. + * Will not be null. + * @param start The start element in the array. + * @param count The number of characters to read from the array. + * + * @see ProjectHelper#addText(Project,Object,char[],int,int) + */ + public void characters(char[] buf, int start, int count) { + wrapper.addText(buf, start, count); + } + + /** + * Handles the start of an element within this one. + * This will always use a nested element handler. + * + * @param name The name of the element being started. + * Will not be null. + * @param attrs Attributes of the element being started. + * Will not be null. + * + * @exception SAXParseException if an error occurs when initialising + * the child handler + */ + public void startElement(String name, AttributeList attrs) throws SAXParseException { + new NestedElementHandler(helperImpl, this, element, wrapper, target).init(name, attrs); + } + } + + /** + * Scans an attribute list for the id attribute and + * stores a reference to the target object in the project if an + * id is found. + *

    + * This method was moved out of the configure method to allow + * it to be executed at parse time. + * + * @see #configure(Object,AttributeList,Project) + */ + private void configureId(Object target, AttributeList attr) { + String id = attr.getValue("id"); + if (id != null) { + project.addReference(id, target); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/SingleCheckExecutor.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/SingleCheckExecutor.java new file mode 100644 index 00000000..1960ed03 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/helper/SingleCheckExecutor.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.helper; + + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Executor; +import org.apache.tools.ant.Project; + + +/** + * "Single-check" Target executor implementation. + * Differs from {@link DefaultExecutor} in that the dependencies for all + * targets are computed together, so that shared dependencies are run just once. + * @since Ant 1.6.3 + */ +public class SingleCheckExecutor implements Executor { + + /** {@inheritDoc}. */ + public void executeTargets(Project project, String[] targetNames) + throws BuildException { + project.executeSortedTargets( + project.topoSort(targetNames, project.getTargets(), false)); + } + + /** {@inheritDoc}. */ + public Executor getSubProjectExecutor() { + return this; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/DefaultInputHandler.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/DefaultInputHandler.java new file mode 100644 index 00000000..8268d5e7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/DefaultInputHandler.java @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.input; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.util.KeepAliveInputStream; + +/** + * Prompts on System.err, reads input from System.in + * + * @since Ant 1.5 + */ +public class DefaultInputHandler implements InputHandler { + + /** + * Empty no-arg constructor + */ + public DefaultInputHandler() { + } + + /** + * Prompts and requests input. May loop until a valid input has + * been entered. + * @param request the request to handle + * @throws BuildException if not possible to read from console + */ + public void handleInput(InputRequest request) throws BuildException { + String prompt = getPrompt(request); + BufferedReader r = null; + try { + r = new BufferedReader(new InputStreamReader(getInputStream())); + do { + System.err.println(prompt); + System.err.flush(); + try { + String input = r.readLine(); + request.setInput(input); + } catch (IOException e) { + throw new BuildException("Failed to read input from" + + " Console.", e); + } + } while (!request.isInputValid()); + } finally { + if (r != null) { + try { + r.close(); + } catch (IOException e) { + throw new BuildException("Failed to close input.", e); + } + } + } + } + + /** + * Constructs user prompt from a request. + * + *

    This implementation adds (choice1,choice2,choice3,...) to the + * prompt for MultipleChoiceInputRequests.

    + * + * @param request the request to construct the prompt for. + * Must not be null. + * @return the prompt to ask the user + */ + protected String getPrompt(InputRequest request) { + String prompt = request.getPrompt(); + String def = request.getDefaultValue(); + if (request instanceof MultipleChoiceInputRequest) { + StringBuilder sb = new StringBuilder(prompt).append(" ("); + boolean first = true; + for (String next : ((MultipleChoiceInputRequest) request).getChoices()) { + if (!first) { + sb.append(", "); + } + if (next.equals(def)) { + sb.append('['); + } + sb.append(next); + if (next.equals(def)) { + sb.append(']'); + } + first = false; + } + sb.append(")"); + return sb.toString(); + } else if (def != null) { + return prompt + " [" + def + "]"; + } else { + return prompt; + } + } + + /** + * Returns the input stream from which the user input should be read. + * @return the input stream from which the user input should be read. + */ + protected InputStream getInputStream() { + return KeepAliveInputStream.wrapSystemIn(); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/GreedyInputHandler.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/GreedyInputHandler.java new file mode 100644 index 00000000..cb52f4f0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/GreedyInputHandler.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.input; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.taskdefs.StreamPumper; +import org.apache.tools.ant.util.FileUtils; + +/** + * Prompts on System.err, reads input from System.in until EOF + * + * @since Ant 1.7 + */ +public class GreedyInputHandler extends DefaultInputHandler { + + /** + * Empty no-arg constructor + */ + public GreedyInputHandler() { + } + + /** + * Prompts and requests input. + * @param request the request to handle + * @throws BuildException if not possible to read from console, + * or if input is invalid. + */ + public void handleInput(InputRequest request) throws BuildException { + String prompt = getPrompt(request); + InputStream in = null; + try { + in = getInputStream(); + System.err.println(prompt); + System.err.flush(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + StreamPumper p = new StreamPumper(in, baos); + Thread t = new Thread(p); + t.start(); + try { + t.join(); + } catch (InterruptedException e) { + try { + t.join(); + } catch (InterruptedException e2) { + // Ignore + } + } + request.setInput(new String(baos.toByteArray())); + if (!(request.isInputValid())) { + throw new BuildException( + "Received invalid console input"); + } + if (p.getException() != null) { + throw new BuildException( + "Failed to read input from console", p.getException()); + } + } finally { + FileUtils.close(in); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputHandler.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputHandler.java new file mode 100644 index 00000000..aea60fcc --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputHandler.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.input; + +/** + * Plugin to Ant to handle requests for user input. + * + * @since Ant 1.5 + */ +public interface InputHandler { + + /** + * Handle the request encapsulated in the argument. + * + *

    Precondition: the request.getPrompt will return a non-null + * value.

    + * + *

    Postcondition: request.getInput will return a non-null + * value, request.isInputValid will return true.

    + * @param request the request to be processed + * @throws org.apache.tools.ant.BuildException if the input cannot be read from the console + */ + void handleInput(InputRequest request) + throws org.apache.tools.ant.BuildException; +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputRequest.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputRequest.java new file mode 100644 index 00000000..57a77da2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/InputRequest.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.input; + +/** + * Encapsulates an input request. + * + * @since Ant 1.5 + */ +public class InputRequest { + private final String prompt; + private String input; + private String defaultValue; + + /** + * Construct an InputRequest. + * @param prompt The prompt to show to the user. Must not be null. + */ + public InputRequest(String prompt) { + if (prompt == null) { + throw new IllegalArgumentException("prompt must not be null"); + } + + this.prompt = prompt; + } + + /** + * Retrieves the prompt text. + * @return the prompt. + */ + public String getPrompt() { + return prompt; + } + + /** + * Sets the user provided input. + * @param input the string to be used for input. + */ + public void setInput(String input) { + this.input = input; + } + + /** + * Is the user input valid? + * @return true if it is. + */ + public boolean isInputValid() { + return true; + } + + /** + * Retrieves the user input. + * @return the user input. + */ + public String getInput() { + return input; + } + + /** + * Gets a configured default value. + * @return the default value. + * @since Ant 1.7.0 + */ + public String getDefaultValue() { + return defaultValue; + } + + /** + * Configures a default value. + * @param d the value to set. + * @since Ant 1.7.0 + */ + public void setDefaultValue(String d) { + defaultValue = d; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/MultipleChoiceInputRequest.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/MultipleChoiceInputRequest.java new file mode 100644 index 00000000..4baab8f5 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/MultipleChoiceInputRequest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.input; + +import java.util.LinkedHashSet; +import java.util.Vector; + +/** + * Encapsulates an input request. + * + * @since Ant 1.5 + */ +public class MultipleChoiceInputRequest extends InputRequest { + private final LinkedHashSet choices; + + /** + * @param prompt The prompt to show to the user. Must not be null. + * @param choices holds all input values that are allowed. + * Must not be null. + */ + public MultipleChoiceInputRequest(String prompt, Vector choices) { + super(prompt); + if (choices == null) { + throw new IllegalArgumentException("choices must not be null"); + } + this.choices = new LinkedHashSet(choices); + } + + /** + * @return The possible values. + */ + public Vector getChoices() { + return new Vector(choices); + } + + /** + * @return true if the input is one of the allowed values. + */ + public boolean isInputValid() { + return choices.contains(getInput()) || ("".equals(getInput()) && getDefaultValue() != null); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/PropertyFileInputHandler.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/PropertyFileInputHandler.java new file mode 100644 index 00000000..e1e3cf11 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/PropertyFileInputHandler.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.input; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +import org.apache.tools.ant.BuildException; + +/** + * Reads input from a property file, the file name is read from the + * system property ant.input.properties, the prompt is the key for input. + * + * @since Ant 1.5 + */ +public class PropertyFileInputHandler implements InputHandler { + private Properties props = null; + + /** + * Name of the system property we expect to hold the file name. + */ + public static final String FILE_NAME_KEY = "ant.input.properties"; + + /** + * Empty no-arg constructor. + */ + public PropertyFileInputHandler() { + } + + /** + * Picks up the input from a property, using the prompt as the + * name of the property. + * @param request an input request. + * + * @exception BuildException if no property of that name can be found. + */ + public void handleInput(InputRequest request) throws BuildException { + readProps(); + + Object o = props.get(request.getPrompt()); + if (o == null) { + throw new BuildException("Unable to find input for \'" + + request.getPrompt() + "\'"); + } + request.setInput(o.toString()); + if (!request.isInputValid()) { + throw new BuildException("Found invalid input " + o + + " for \'" + request.getPrompt() + "\'"); + } + } + + /** + * Reads the properties file if it hasn't already been read. + */ + private synchronized void readProps() throws BuildException { + if (props == null) { + String propsFile = System.getProperty(FILE_NAME_KEY); + if (propsFile == null) { + throw new BuildException("System property " + + FILE_NAME_KEY + + " for PropertyFileInputHandler not" + + " set"); + } + + props = new Properties(); + + try { + props.load(new FileInputStream(propsFile)); + } catch (IOException e) { + throw new BuildException("Couldn't load " + propsFile, e); + } + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/SecureInputHandler.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/SecureInputHandler.java new file mode 100644 index 00000000..d5aecff7 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/input/SecureInputHandler.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.input; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.util.ReflectUtil; + +/** + * Prompts and requests input. May loop until a valid input has + * been entered. Doesn't echo input (requires Java6). If Java6 is not + * available, falls back to the DefaultHandler (insecure). + * @since Ant 1.7.1 + */ +public class SecureInputHandler extends DefaultInputHandler { + + /** + * Default no-args constructor + */ + public SecureInputHandler() { + } + + /** + * Handle the input + * @param request the request to handle + * @throws BuildException if not possible to read from console + */ + public void handleInput(InputRequest request) throws BuildException { + String prompt = getPrompt(request); + try { + Object console = ReflectUtil.invokeStatic(System.class, "console"); + do { + char[] input = (char[]) ReflectUtil.invoke( + console, "readPassword", String.class, prompt, + Object[].class, (Object[]) null); + request.setInput(new String(input)); + /* for security zero char array after retrieving value */ + java.util.Arrays.fill(input, ' '); + } while (!request.isInputValid()); + } catch (Exception e) { + /* Java6 not present use default handler */ + super.handleInput(request); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/AntMain.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/AntMain.java new file mode 100644 index 00000000..4703eaa6 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/AntMain.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.launch; + +import java.util.Properties; + +/** + * Interface used to bridge to the actual Main class without any + * messy reflection + * + * @since Ant 1.6 + */ +public interface AntMain { + /** + * Start Ant. + * + * @param args command line args + * @param additionalUserProperties properties to set beyond those that + * may be specified on the args list + * @param coreLoader - not used + * + * @since Ant 1.6 + */ + void startAnt(String[] args, Properties additionalUserProperties, + ClassLoader coreLoader); +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/LaunchException.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/LaunchException.java new file mode 100644 index 00000000..1bb37f8f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/LaunchException.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.launch; + +/** + * Signals an error condition during launching + * + * @since Ant 1.6 + */ +public class LaunchException extends Exception { + private static final long serialVersionUID = 1L; + + /** + * Constructs an exception with the given descriptive message. + * + * @param message A description of or information about the exception. + * Should not be null. + */ + public LaunchException(String message) { + super(message); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Launcher.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Launcher.java new file mode 100644 index 00000000..bf881db8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Launcher.java @@ -0,0 +1,412 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.launch; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + + + + +/** + * This is a launcher for Ant. + * + * @since Ant 1.6 + */ +public class Launcher { + + private Launcher() { + } + + /** + * The Ant Home (installation) Directory property. + * {@value} + */ + public static final String ANTHOME_PROPERTY = "ant.home"; + + /** + * The Ant Library Directory property. + * {@value} + */ + public static final String ANTLIBDIR_PROPERTY = "ant.library.dir"; + + /** + * The directory name of the per-user ant directory. + * {@value} + */ + public static final String ANT_PRIVATEDIR = ".ant"; + + /** + * The name of a per-user library directory. + * {@value} + */ + public static final String ANT_PRIVATELIB = "lib"; + + /** + * launch diagnostics flag; for debugging trouble at launch time. + */ + public static boolean launchDiag = false; + + /** + * The location of a per-user library directory. + *

    + * It's value is the concatenation of {@link #ANT_PRIVATEDIR} + * with {@link #ANT_PRIVATELIB}, with an appropriate file separator + * in between. For example, on Unix, it's .ant/lib. + */ + public static final String USER_LIBDIR = + ANT_PRIVATEDIR + File.separatorChar + ANT_PRIVATELIB; + + /** + * The startup class that is to be run. + * {@value} + */ + public static final String MAIN_CLASS = "org.apache.tools.ant.Main"; + + /** + * System property with user home directory. + * {@value} + */ + public static final String USER_HOMEDIR = "user.home"; + + /** + * System property with application classpath. + * {@value} + */ + private static final String JAVA_CLASS_PATH = "java.class.path"; + + /** + * Exit code on trouble + */ + protected static final int EXIT_CODE_ERROR = 2; + + /** + * Entry point for starting command line Ant. + * + * @param args commandline arguments + */ + public static void main(final String[] args) { + int exitCode; + try { + final Launcher launcher = new Launcher(); + exitCode = launcher.run(args); + } catch (final LaunchException e) { + exitCode = EXIT_CODE_ERROR; + System.err.println(e.getMessage()); + } catch (final Throwable t) { + exitCode = EXIT_CODE_ERROR; + t.printStackTrace(System.err); + } + if (exitCode != 0) { + if (launchDiag) { + System.out.println("Exit code: "+exitCode); + } + System.exit(exitCode); + } + } + + + /** + * Add a CLASSPATH or -lib to lib path urls. + * Only filesystem resources are supported. + * + * @param path the classpath or lib path to add to the libPathULRLs + * @param getJars if true and a path is a directory, add the jars in + * the directory to the path urls + * @param libPathURLs the list of paths to add to + * @throws MalformedURLException if we can't create a URL + */ + private void addPath(final String path, final boolean getJars, final List libPathURLs) + throws MalformedURLException { + final StringTokenizer tokenizer = new StringTokenizer(path, File.pathSeparator); + while (tokenizer.hasMoreElements()) { + final String elementName = tokenizer.nextToken(); + final File element = new File(elementName); + if (elementName.indexOf('%') != -1 && !element.exists()) { + continue; + } + if (getJars && element.isDirectory()) { + // add any jars in the directory + final URL[] dirURLs = Locator.getLocationURLs(element); + for (int j = 0; j < dirURLs.length; ++j) { + if (launchDiag) { System.out.println("adding library JAR: " + dirURLs[j]);} + libPathURLs.add(dirURLs[j]); + } + } + + final URL url = Locator.fileToURL(element); + if (launchDiag) { + System.out.println("adding library URL: " + url); + } + libPathURLs.add(url); + } + } + + /** + * Run the launcher to launch Ant. + * + * @param args the command line arguments + * @return an exit code. As the normal ant main calls exit when it ends, + * this is for handling failures at bind-time + * @throws MalformedURLException if the URLs required for the classloader + * cannot be created. + * @throws LaunchException for launching problems + */ + private int run(final String[] args) + throws LaunchException, MalformedURLException { + final String antHomeProperty = System.getProperty(ANTHOME_PROPERTY); + File antHome = null; + + final File sourceJar = Locator.getClassSource(getClass()); + final File jarDir = sourceJar.getParentFile(); + String mainClassname = MAIN_CLASS; + + if (antHomeProperty != null) { + antHome = new File(antHomeProperty); + } + + if (antHome == null || !antHome.exists()) { + antHome = jarDir.getParentFile(); + setProperty(ANTHOME_PROPERTY, antHome.getAbsolutePath()); + } + + if (!antHome.exists()) { + throw new LaunchException("Ant home is set incorrectly or " + + "ant could not be located (estimated value="+antHome.getAbsolutePath()+")"); + } + + final List libPaths = new ArrayList(); + String cpString = null; + final List argList = new ArrayList(); + String[] newArgs; + boolean noUserLib = false; + boolean noClassPath = false; + + for (int i = 0; i < args.length; ++i) { + if (args[i].equals("-lib")) { + if (i == args.length - 1) { + throw new LaunchException("The -lib argument must " + + "be followed by a library location"); + } + libPaths.add(args[++i]); + } else if (args[i].equals("-cp")) { + if (i == args.length - 1) { + throw new LaunchException("The -cp argument must " + + "be followed by a classpath expression"); + } + if (cpString != null) { + throw new LaunchException("The -cp argument must " + + "not be repeated"); + } + cpString = args[++i]; + } else if (args[i].equals("--nouserlib") || args[i].equals("-nouserlib")) { + noUserLib = true; + } else if (args[i].equals("--launchdiag")) { + launchDiag = true; + } else if (args[i].equals("--noclasspath") || args[i].equals("-noclasspath")) { + noClassPath = true; + } else if (args[i].equals("-main")) { + if (i == args.length - 1) { + throw new LaunchException("The -main argument must " + + "be followed by a library location"); + } + mainClassname = args[++i]; + } else { + argList.add(args[i]); + } + } + + logPath("Launcher JAR",sourceJar); + logPath("Launcher JAR directory", sourceJar.getParentFile()); + logPath("java.home", new File(System.getProperty("java.home"))); + + //decide whether to copy the existing arg set, or + //build a new one from the list of all args excluding the special + //operations that only we handle + if (argList.size() == args.length) { + newArgs = args; + } else { + newArgs = argList.toArray(new String[argList.size()]); + } + + final URL[] libURLs = getLibPathURLs( + noClassPath ? null : cpString, libPaths); + final URL[] systemURLs = getSystemURLs(jarDir); + final URL[] userURLs = noUserLib ? new URL[0] : getUserURLs(); + + final File toolsJAR = Locator.getToolsJar(); + logPath("tools.jar",toolsJAR); + final URL[] jars = getJarArray( + libURLs, userURLs, systemURLs, toolsJAR); + + // now update the class.path property + final StringBuffer baseClassPath + = new StringBuffer(System.getProperty(JAVA_CLASS_PATH)); + if (baseClassPath.charAt(baseClassPath.length() - 1) + == File.pathSeparatorChar) { + baseClassPath.setLength(baseClassPath.length() - 1); + } + + for (int i = 0; i < jars.length; ++i) { + baseClassPath.append(File.pathSeparatorChar); + baseClassPath.append(Locator.fromURI(jars[i].toString())); + } + + setProperty(JAVA_CLASS_PATH, baseClassPath.toString()); + + final URLClassLoader loader = new URLClassLoader(jars, Launcher.class.getClassLoader()); + Thread.currentThread().setContextClassLoader(loader); + Class mainClass = null; + int exitCode = 0; + Throwable thrown=null; + try { + mainClass = loader.loadClass(mainClassname); + final AntMain main = (AntMain) mainClass.newInstance(); + main.startAnt(newArgs, null, null); + } catch (final InstantiationException ex) { + System.err.println( + "Incompatible version of " + mainClassname + " detected"); + final File mainJar = Locator.getClassSource(mainClass); + System.err.println( + "Location of this class " + mainJar); + thrown = ex; + } catch (final ClassNotFoundException cnfe) { + System.err.println( + "Failed to locate" + mainClassname); + thrown = cnfe; + } catch (final Throwable t) { + t.printStackTrace(System.err); + thrown=t; + } + if(thrown!=null) { + System.err.println(ANTHOME_PROPERTY+": "+antHome.getAbsolutePath()); + System.err.println("Classpath: " + baseClassPath.toString()); + System.err.println("Launcher JAR: " + sourceJar.getAbsolutePath()); + System.err.println("Launcher Directory: " + jarDir.getAbsolutePath()); + exitCode = EXIT_CODE_ERROR; + } + return exitCode; + } + + /** + * Get the list of -lib entries and -cp entry into + * a URL array. + * @param cpString the classpath string + * @param libPaths the list of -lib entries. + * @return an array of URLs. + * @throws MalformedURLException if the URLs cannot be created. + */ + private URL[] getLibPathURLs(final String cpString, final List libPaths) + throws MalformedURLException { + final List libPathURLs = new ArrayList(); + + if (cpString != null) { + addPath(cpString, false, libPathURLs); + } + + for (final String libPath : libPaths) { + addPath(libPath, true, libPathURLs); + } + + return libPathURLs.toArray(new URL[libPathURLs.size()]); + } + + /** + * Get the jar files in ANT_HOME/lib. + * determine ant library directory for system jars: use property + * or default using location of ant-launcher.jar + * @param antLauncherDir the dir that ant-launcher ran from + * @return the URLs + * @throws MalformedURLException if the URLs cannot be created. + */ + private URL[] getSystemURLs(final File antLauncherDir) throws MalformedURLException { + File antLibDir = null; + final String antLibDirProperty = System.getProperty(ANTLIBDIR_PROPERTY); + if (antLibDirProperty != null) { + antLibDir = new File(antLibDirProperty); + } + if ((antLibDir == null) || !antLibDir.exists()) { + antLibDir = antLauncherDir; + setProperty(ANTLIBDIR_PROPERTY, antLibDir.getAbsolutePath()); + } + return Locator.getLocationURLs(antLibDir); + } + + /** + * Get the jar files in user.home/.ant/lib + * @return the URLS from the user's lib dir + * @throws MalformedURLException if the URLs cannot be created. + */ + private URL[] getUserURLs() throws MalformedURLException { + final File userLibDir + = new File(System.getProperty(USER_HOMEDIR), USER_LIBDIR); + + return Locator.getLocationURLs(userLibDir); + } + + /** + * Combine the various jar sources into a single array of jars. + * @param libJars the jars specified in -lib command line options + * @param userJars the jars in ~/.ant/lib + * @param systemJars the jars in $ANT_HOME/lib + * @param toolsJar the tools.jar file + * @return a combined array + * @throws MalformedURLException if there is a problem. + */ + private URL[] getJarArray ( + final URL[] libJars, final URL[] userJars, final URL[] systemJars, final File toolsJar) + throws MalformedURLException { + int numJars = libJars.length + userJars.length + systemJars.length; + if (toolsJar != null) { + numJars++; + } + final URL[] jars = new URL[numJars]; + System.arraycopy(libJars, 0, jars, 0, libJars.length); + System.arraycopy(userJars, 0, jars, libJars.length, userJars.length); + System.arraycopy(systemJars, 0, jars, userJars.length + libJars.length, + systemJars.length); + + if (toolsJar != null) { + jars[jars.length - 1] = Locator.fileToURL(toolsJar); + } + return jars; + } + + /** + * set a system property, optionally log what is going on + * @param name property name + * @param value value + */ + private void setProperty(final String name, final String value) { + if (launchDiag) { + System.out.println("Setting \"" + name + "\" to \"" + value + "\""); + } + System.setProperty(name, value); + } + + private void logPath(final String name,final File path) { + if(launchDiag) { + System.out.println(name+"= \""+path+"\""); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Locator.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Locator.java new file mode 100644 index 00000000..4640e700 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/launch/Locator.java @@ -0,0 +1,528 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.launch; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FilenameFilter; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.CharacterIterator; +import java.text.StringCharacterIterator; +import java.util.Locale; + +// CheckStyle:LineLengthCheck OFF - urls are long! +/** + * The Locator is a utility class which is used to find certain items + * in the environment. + *

    + * It is used at boot time in the launcher, and cannot make use of any of Ant's other classes. + *

    + * This is a surprisingly brittle piece of code, and has had lots of bugs filed against it: + * running ant off a network share can cause Ant to fail, + * use File.toURI().toURL().toExternalForm(), + * Locator implementation not encoding URI strings properly: spaces in paths. + * It also breaks Eclipse 3.3 Betas: + * Exception if installation path has spaces. + *

    + * Be very careful when making changes to this class, as a break will upset a lot of people. + * @since Ant 1.6 + */ +// CheckStyle:LineLengthCheck ON - urls are long! +public final class Locator { + + private static final int NIBBLE = 4; + private static final int NIBBLE_MASK = 0xF; + + private static final int ASCII_SIZE = 128; + + private static final int BYTE_SIZE = 256; + + private static final int WORD = 16; + + private static final int SPACE = 0x20; + private static final int DEL = 0x7F; + + /** + * encoding used to represent URIs + */ + public static final String URI_ENCODING = "UTF-8"; + // stolen from org.apache.xerces.impl.XMLEntityManager#getUserDir() + // of the Xerces-J team + // which ASCII characters need to be escaped + private static boolean[] gNeedEscaping = new boolean[ASCII_SIZE]; + // the first hex character if a character needs to be escaped + private static char[] gAfterEscaping1 = new char[ASCII_SIZE]; + // the second hex character if a character needs to be escaped + private static char[] gAfterEscaping2 = new char[ASCII_SIZE]; + private static char[] gHexChs = {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + /** Error string used when an invalid uri is seen */ + public static final String ERROR_NOT_FILE_URI + = "Can only handle valid file: URIs, not "; + + // initialize the above 3 arrays + static { + for (int i = 0; i < SPACE; i++) { + gNeedEscaping[i] = true; + gAfterEscaping1[i] = gHexChs[i >> NIBBLE]; + gAfterEscaping2[i] = gHexChs[i & NIBBLE_MASK]; + } + gNeedEscaping[DEL] = true; + gAfterEscaping1[DEL] = '7'; + gAfterEscaping2[DEL] = 'F'; + char[] escChs = {' ', '<', '>', '#', '%', '"', '{', '}', + '|', '\\', '^', '~', '[', ']', '`'}; + int len = escChs.length; + char ch; + for (int i = 0; i < len; i++) { + ch = escChs[i]; + gNeedEscaping[ch] = true; + gAfterEscaping1[ch] = gHexChs[ch >> NIBBLE]; + gAfterEscaping2[ch] = gHexChs[ch & NIBBLE_MASK]; + } + } + /** + * Not instantiable + */ + private Locator() { + } + + /** + * Find the directory or jar file the class has been loaded from. + * + * @param c the class whose location is required. + * @return the file or jar with the class or null if we cannot + * determine the location. + * + * @since Ant 1.6 + */ + public static File getClassSource(Class c) { + String classResource = c.getName().replace('.', '/') + ".class"; + return getResourceSource(c.getClassLoader(), classResource); + } + + /** + * Find the directory or jar a given resource has been loaded from. + * + * @param c the classloader to be consulted for the source. + * @param resource the resource whose location is required. + * + * @return the file with the resource source or null if + * we cannot determine the location. + * + * @since Ant 1.6 + */ + public static File getResourceSource(ClassLoader c, String resource) { + if (c == null) { + c = Locator.class.getClassLoader(); + } + URL url = null; + if (c == null) { + url = ClassLoader.getSystemResource(resource); + } else { + url = c.getResource(resource); + } + if (url != null) { + String u = url.toString(); + try { + if (u.startsWith("jar:file:")) { + return new File(fromJarURI(u)); + } else if (u.startsWith("file:")) { + int tail = u.indexOf(resource); + String dirName = u.substring(0, tail); + return new File(fromURI(dirName)); + } + } catch (IllegalArgumentException e) { + //unable to determine the URI for reasons unknown. + return null; + } + } + return null; + } + + + + /** + * Constructs a file path from a file: URI. + * + *

    Will be an absolute path if the given URI is absolute.

    + * + *

    Prior to Java 1.4, + * swallows '%' that are not followed by two characters.

    + * + * See dt-sysid + * which makes some mention of how + * characters not supported by URI Reference syntax should be escaped. + * + * @param uri the URI designating a file in the local filesystem. + * @return the local file system path for the file. + * @throws IllegalArgumentException if the URI is malformed or not a legal file: URL + * @since Ant 1.6 + */ + public static String fromURI(String uri) { + return fromURIJava13(uri); + // #buzilla8031: first try Java 1.4. + // TODO should use java.net.URI now that we can rely on 1.4... + // but check for UNC-related regressions, e.g. #42275 + // (and remember that \\server\share\file -> file:////server/share/file + // rather than -> file://server/share/file as it should; + // fixed only in JDK 7's java.nio.file.Path.toUri) + // return fromUriJava14(uri); + } + + /** + * Java1.4+ code to extract the path from the URI. + * @param uri + * @return null if a conversion was not possible + */ + /* currently unused: + private static String fromUriJava14(String uri) { + // Also check for properly formed URIs. Ant formerly recommended using + // nonsense URIs such as "file:./foo.xml" in XML includes. You shouldn't + // do that (just "foo.xml" is correct) but for compatibility we special-case + // things when the path is not absolute, and fall back to the old parsing behavior. + if (uri.startsWith("file:/")) { + try { + File f = new File(URI.create(encodeURI(uri))); + //bug #42227 forgot to decode before returning + return decodeUri(f.getAbsolutePath()); + } catch (IllegalArgumentException e) { + // Bad URI, pass this on. + // no, this is downgraded to a warning after various + // JRE bugs surfaced. Hand off + // to our built in code on a failure + //throw new IllegalArgumentException( + // "Bad URI " + uri + ":" + e.getMessage(), e); + e.printStackTrace(); + } catch (Exception e) { + // Unexpected exception? Should not happen. + e.printStackTrace(); + } + } + return null; + } + */ + + /** + * @param uri uri to expand + * @return the decoded URI + * @since Ant1.7.1 + */ + private static String fromURIJava13(String uri) { + // Fallback method for Java 1.3 or earlier. + + URL url = null; + try { + url = new URL(uri); + } catch (MalformedURLException emYouEarlEx) { + // Ignore malformed exception + } + if (url == null || !("file".equals(url.getProtocol()))) { + throw new IllegalArgumentException(ERROR_NOT_FILE_URI + uri); + } + StringBuffer buf = new StringBuffer(url.getHost()); + if (buf.length() > 0) { + buf.insert(0, File.separatorChar).insert(0, File.separatorChar); + } + String file = url.getFile(); + int queryPos = file.indexOf('?'); + buf.append((queryPos < 0) ? file : file.substring(0, queryPos)); + + uri = buf.toString().replace('/', File.separatorChar); + + if (File.pathSeparatorChar == ';' && uri.startsWith("\\") && uri.length() > 2 + && Character.isLetter(uri.charAt(1)) && uri.lastIndexOf(':') > -1) { + uri = uri.substring(1); + } + String path = null; + try { + path = decodeUri(uri); + //consider adding the current directory. This is not done when + //the path is a UNC name + String cwd = System.getProperty("user.dir"); + int posi = cwd.indexOf(':'); + boolean pathStartsWithFileSeparator = path.startsWith(File.separator); + boolean pathStartsWithUNC = path.startsWith("" + File.separator + File.separator); + if ((posi > 0) && pathStartsWithFileSeparator && !pathStartsWithUNC) { + path = cwd.substring(0, posi + 1) + path; + } + } catch (UnsupportedEncodingException exc) { + // not sure whether this is clean, but this method is + // declared not to throw exceptions. + throw new IllegalStateException( + "Could not convert URI " + uri + " to path: " + + exc.getMessage()); + } + return path; + } + + /** + * Crack a JAR URI. + * This method is public for testing; we may delete it without any warning -it is not part of Ant's stable API. + * @param uri uri to expand; contains jar: somewhere in it + * @return the decoded URI + * @since Ant1.7.1 + */ + public static String fromJarURI(String uri) { + int pling = uri.indexOf("!/"); + String jarName = uri.substring("jar:".length(), pling); + return fromURI(jarName); + } + + /** + * Decodes an Uri with % characters. + * The URI is escaped + * @param uri String with the uri possibly containing % characters. + * @return The decoded Uri + * @throws UnsupportedEncodingException if UTF-8 is not available + * @since Ant 1.7 + */ + public static String decodeUri(String uri) throws UnsupportedEncodingException { + if (uri.indexOf('%') == -1) { + return uri; + } + ByteArrayOutputStream sb = new ByteArrayOutputStream(uri.length()); + CharacterIterator iter = new StringCharacterIterator(uri); + for (char c = iter.first(); c != CharacterIterator.DONE; + c = iter.next()) { + if (c == '%') { + char c1 = iter.next(); + if (c1 != CharacterIterator.DONE) { + int i1 = Character.digit(c1, WORD); + char c2 = iter.next(); + if (c2 != CharacterIterator.DONE) { + int i2 = Character.digit(c2, WORD); + sb.write((char) ((i1 << NIBBLE) + i2)); + } + } + } else if (c >= 0x0000 && c < 0x0080) { + sb.write(c); + } else { // #50543 + byte[] bytes = String.valueOf(c).getBytes(URI_ENCODING); + sb.write(bytes, 0, bytes.length); + } + } + return sb.toString(URI_ENCODING); + } + + /** + * Encodes an Uri with % characters. + * The URI is escaped + * @param path String to encode. + * @return The encoded string, according to URI norms + * @throws UnsupportedEncodingException if UTF-8 is not available + * @since Ant 1.7 + */ + public static String encodeURI(String path) throws UnsupportedEncodingException { + int i = 0; + int len = path.length(); + int ch = 0; + StringBuffer sb = null; + for (; i < len; i++) { + ch = path.charAt(i); + // if it's not an ASCII character, break here, and use UTF-8 encoding + if (ch >= ASCII_SIZE) { + break; + } + if (gNeedEscaping[ch]) { + if (sb == null) { + sb = new StringBuffer(path.substring(0, i)); + } + sb.append('%'); + sb.append(gAfterEscaping1[ch]); + sb.append(gAfterEscaping2[ch]); + // record the fact that it's escaped + } else if (sb != null) { + sb.append((char) ch); + } + } + + // we saw some non-ascii character + if (i < len) { + if (sb == null) { + sb = new StringBuffer(path.substring(0, i)); + } + // get UTF-8 bytes for the remaining sub-string + byte[] bytes = null; + byte b; + bytes = path.substring(i).getBytes(URI_ENCODING); + len = bytes.length; + + // for each byte + for (i = 0; i < len; i++) { + b = bytes[i]; + // for non-ascii character: make it positive, then escape + if (b < 0) { + ch = b + BYTE_SIZE; + sb.append('%'); + sb.append(gHexChs[ch >> NIBBLE]); + sb.append(gHexChs[ch & NIBBLE_MASK]); + } else if (gNeedEscaping[b]) { + sb.append('%'); + sb.append(gAfterEscaping1[b]); + sb.append(gAfterEscaping2[b]); + } else { + sb.append((char) b); + } + } + } + return sb == null ? path : sb.toString(); + } + + /** + * Convert a File to a URL. + * File.toURL() does not encode characters like #. + * File.toURI() has been introduced in java 1.4, so + * Ant cannot use it (except by reflection) + * FileUtils.toURI() cannot be used by Locator.java + * Implemented this way. + * File.toURL() adds file: and changes '\' to '/' for dos OSes + * encodeURI converts characters like ' ' and '#' to %DD + * @param file the file to convert + * @return URL the converted File + * @throws MalformedURLException on error + * @deprecated since 1.9, use {@link FileUtils#getFileURL(File)} + */ + @Deprecated + public static URL fileToURL(File file) + throws MalformedURLException { + return new URL(file.toURI().toASCIIString()); + } + + /** + * Get the File necessary to load the Sun compiler tools. If the classes + * are available to this class, then no additional URL is required and + * null is returned. This may be because the classes are explicitly in the + * class path or provided by the JVM directly. + * + * @return the tools jar as a File if required, null otherwise. + */ + public static File getToolsJar() { + // firstly check if the tools jar is already in the classpath + boolean toolsJarAvailable = false; + try { + // just check whether this throws an exception + Class.forName("com.sun.tools.javac.Main"); + toolsJarAvailable = true; + } catch (Exception e) { + try { + Class.forName("sun.tools.javac.Main"); + toolsJarAvailable = true; + } catch (Exception e2) { + // ignore + } + } + if (toolsJarAvailable) { + return null; + } + // couldn't find compiler - try to find tools.jar + // based on java.home setting + String libToolsJar + = File.separator + "lib" + File.separator + "tools.jar"; + String javaHome = System.getProperty("java.home"); + File toolsJar = new File(javaHome + libToolsJar); + if (toolsJar.exists()) { + // Found in java.home as given + return toolsJar; + } + if (javaHome.toLowerCase(Locale.ENGLISH).endsWith(File.separator + "jre")) { + javaHome = javaHome.substring( + 0, javaHome.length() - "/jre".length()); + toolsJar = new File(javaHome + libToolsJar); + } + if (!toolsJar.exists()) { + System.out.println("Unable to locate tools.jar. " + + "Expected to find it in " + toolsJar.getPath()); + return null; + } + return toolsJar; + } + + /** + * Get an array of URLs representing all of the jar files in the + * given location. If the location is a file, it is returned as the only + * element of the array. If the location is a directory, it is scanned for + * jar files. + * + * @param location the location to scan for Jars. + * + * @return an array of URLs for all jars in the given location. + * + * @exception MalformedURLException if the URLs for the jars cannot be + * formed. + */ + public static URL[] getLocationURLs(File location) + throws MalformedURLException { + return getLocationURLs(location, new String[]{".jar"}); + } + + /** + * Get an array of URLs representing all of the files of a given set of + * extensions in the given location. If the location is a file, it is + * returned as the only element of the array. If the location is a + * directory, it is scanned for matching files. + * + * @param location the location to scan for files. + * @param extensions an array of extension that are to match in the + * directory search. + * + * @return an array of URLs of matching files. + * @exception MalformedURLException if the URLs for the files cannot be + * formed. + */ + public static URL[] getLocationURLs(File location, + final String[] extensions) + throws MalformedURLException { + URL[] urls = new URL[0]; + + if (!location.exists()) { + return urls; + } + if (!location.isDirectory()) { + urls = new URL[1]; + String path = location.getPath(); + String littlePath = path.toLowerCase(Locale.ENGLISH); + for (int i = 0; i < extensions.length; ++i) { + if (littlePath.endsWith(extensions[i])) { + urls[0] = fileToURL(location); + break; + } + } + return urls; + } + File[] matches = location.listFiles( + new FilenameFilter() { + public boolean accept(File dir, String name) { + String littleName = name.toLowerCase(Locale.ENGLISH); + for (int i = 0; i < extensions.length; ++i) { + if (littleName.endsWith(extensions[i])) { + return true; + } + } + return false; + } + }); + urls = new URL[matches.length]; + for (int i = 0; i < matches.length; ++i) { + urls[i] = fileToURL(matches[i]); + } + return urls; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/AnsiColorLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/AnsiColorLogger.java new file mode 100644 index 00000000..2e695005 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/AnsiColorLogger.java @@ -0,0 +1,249 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.listener; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Properties; + +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.Project; + +/** + * Uses ANSI Color Code Sequences to colorize messages + * sent to the console. + * + *

    If used with the -logfile option, the output file + * will contain all the necessary escape codes to + * display the text in colorized mode when displayed + * in the console using applications like cat, more, + * etc.

    + * + *

    This is designed to work on terminals that support ANSI + * color codes. It works on XTerm, ETerm, Mindterm, etc. + * It also works on Win9x (with ANSI.SYS loaded.)

    + * + *

    NOTE: + * It doesn't work on WinNT's COMMAND.COM even with + * ANSI.SYS loaded.

    + * + *

    The default colors used for differentiating + * the message levels can be changed by editing the + * /org/apache/tools/ant/listener/defaults.properties + * file. + * This file contains 5 key/value pairs:

    + *
    + * AnsiColorLogger.ERROR_COLOR=2;31
    + * AnsiColorLogger.WARNING_COLOR=2;35
    + * AnsiColorLogger.INFO_COLOR=2;36
    + * AnsiColorLogger.VERBOSE_COLOR=2;32
    + * AnsiColorLogger.DEBUG_COLOR=2;34
    + * 
    + * + *

    Another option is to pass a system variable named + * ant.logger.defaults, with value set to the path of + * the file that contains user defined Ansi Color + * Codes, to the java command using -D option.

    + * + * To change these colors use the following chart: + * + *

    ANSI COLOR LOGGER CONFIGURATION

    + * + * Format for AnsiColorLogger.*= + * Attribute;Foreground;Background + * + * Attribute is one of the following:
    + *  0 -> Reset All Attributes (return to normal mode)
    + *  1 -> Bright (Usually turns on BOLD)
    + *  2 -> Dim
    + *  3 -> Underline
    + *  5 -> link
    + *  7 -> Reverse
    + *  8 -> Hidden
    + *  
    + * + * Foreground is one of the following:
    + *  30 -> Black
    + *  31 -> Red
    + *  32 -> Green
    + *  33 -> Yellow
    + *  34 -> Blue
    + *  35 -> Magenta
    + *  36 -> Cyan
    + *  37 -> White
    + *  
    + * + * Background is one of the following:
    + *  40 -> Black
    + *  41 -> Red
    + *  42 -> Green
    + *  43 -> Yellow
    + *  44 -> Blue
    + *  45 -> Magenta
    + *  46 -> Cyan
    + *  47 -> White
    + *  
    + */ +public class AnsiColorLogger extends DefaultLogger { + // private static final int ATTR_NORMAL = 0; + // private static final int ATTR_BRIGHT = 1; + private static final int ATTR_DIM = 2; + // private static final int ATTR_UNDERLINE = 3; + // private static final int ATTR_BLINK = 5; + // private static final int ATTR_REVERSE = 7; + // private static final int ATTR_HIDDEN = 8; + + // private static final int FG_BLACK = 30; + private static final int FG_RED = 31; + private static final int FG_GREEN = 32; + // private static final int FG_YELLOW = 33; + private static final int FG_BLUE = 34; + private static final int FG_MAGENTA = 35; + private static final int FG_CYAN = 36; + // private static final int FG_WHITE = 37; + + // private static final int BG_BLACK = 40; + // private static final int BG_RED = 41; + // private static final int BG_GREEN = 42; + // private static final int BG_YELLOW = 44; + // private static final int BG_BLUE = 44; + // private static final int BG_MAGENTA = 45; + // private static final int BG_CYAN = 46; + // private static final int BG_WHITE = 47; + + private static final String PREFIX = "\u001b["; + private static final String SUFFIX = "m"; + private static final char SEPARATOR = ';'; + private static final String END_COLOR = PREFIX + SUFFIX; + + private String errColor + = PREFIX + ATTR_DIM + SEPARATOR + FG_RED + SUFFIX; + private String warnColor + = PREFIX + ATTR_DIM + SEPARATOR + FG_MAGENTA + SUFFIX; + private String infoColor + = PREFIX + ATTR_DIM + SEPARATOR + FG_CYAN + SUFFIX; + private String verboseColor + = PREFIX + ATTR_DIM + SEPARATOR + FG_GREEN + SUFFIX; + private String debugColor + = PREFIX + ATTR_DIM + SEPARATOR + FG_BLUE + SUFFIX; + + private boolean colorsSet = false; + + /** + * Set the colors to use from a property file specified by the + * special ant property ant.logger.defaults + */ + private void setColors() { + String userColorFile = System.getProperty("ant.logger.defaults"); + String systemColorFile = + "/org/apache/tools/ant/listener/defaults.properties"; + + InputStream in = null; + + try { + Properties prop = new Properties(); + + if (userColorFile != null) { + in = new FileInputStream(userColorFile); + } else { + in = getClass().getResourceAsStream(systemColorFile); + } + + if (in != null) { + prop.load(in); + } + + String errC = prop.getProperty("AnsiColorLogger.ERROR_COLOR"); + String warn = prop.getProperty("AnsiColorLogger.WARNING_COLOR"); + String info = prop.getProperty("AnsiColorLogger.INFO_COLOR"); + String verbose = prop.getProperty("AnsiColorLogger.VERBOSE_COLOR"); + String debug = prop.getProperty("AnsiColorLogger.DEBUG_COLOR"); + if (errC != null) { + errColor = PREFIX + errC + SUFFIX; + } + if (warn != null) { + warnColor = PREFIX + warn + SUFFIX; + } + if (info != null) { + infoColor = PREFIX + info + SUFFIX; + } + if (verbose != null) { + verboseColor = PREFIX + verbose + SUFFIX; + } + if (debug != null) { + debugColor = PREFIX + debug + SUFFIX; + } + } catch (IOException ioe) { + //Ignore - we will use the defaults. + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + //Ignore - We do not want this to stop the build. + } + } + } + } + + /** + * @see DefaultLogger#printMessage + */ + /** {@inheritDoc}. */ + @Override + protected void printMessage(final String message, + final PrintStream stream, + final int priority) { + if (message != null && stream != null) { + if (!colorsSet) { + setColors(); + colorsSet = true; + } + + final StringBuffer msg = new StringBuffer(message); + switch (priority) { + case Project.MSG_ERR: + msg.insert(0, errColor); + msg.append(END_COLOR); + break; + case Project.MSG_WARN: + msg.insert(0, warnColor); + msg.append(END_COLOR); + break; + case Project.MSG_INFO: + msg.insert(0, infoColor); + msg.append(END_COLOR); + break; + case Project.MSG_VERBOSE: + msg.insert(0, verboseColor); + msg.append(END_COLOR); + break; + case Project.MSG_DEBUG: + // Fall through + default: + msg.insert(0, debugColor); + msg.append(END_COLOR); + break; + } + final String strmessage = msg.toString(); + stream.println(strmessage); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/BigProjectLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/BigProjectLogger.java new file mode 100644 index 00000000..865127d2 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/BigProjectLogger.java @@ -0,0 +1,194 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.listener; + +import java.io.File; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.SubBuildListener; +import org.apache.tools.ant.util.StringUtils; + +/** + * This is a special logger that is designed to make it easier to work + * with big projects, those that use imports and + * subant to build complex systems. + * + * @since Ant1.7.1 + */ + +public class BigProjectLogger extends SimpleBigProjectLogger + implements SubBuildListener { + + private volatile boolean subBuildStartedRaised = false; + private final Object subBuildLock = new Object(); + + /** + * Header string for the log. + * {@value} + */ + public static final String HEADER + = "======================================================================"; + /** + * Footer string for the log. + * {@value} + */ + public static final String FOOTER = HEADER; + + /** + * This is an override point: the message that indicates whether + * a build failed. Subclasses can change/enhance the + * message. + * + * @return The classic "BUILD FAILED" plus a timestamp + */ + protected String getBuildFailedMessage() { + return super.getBuildFailedMessage() + TimestampedLogger.SPACER + getTimestamp(); + } + + /** + * This is an override point: the message that indicates that + * a build succeeded. Subclasses can change/enhance the + * message. + * + * @return The classic "BUILD SUCCESSFUL" plus a timestamp + */ + protected String getBuildSuccessfulMessage() { + return super.getBuildSuccessfulMessage() + TimestampedLogger.SPACER + getTimestamp(); + } + + /** + * {@inheritDoc} + * + * @param event + */ + public void targetStarted(BuildEvent event) { + maybeRaiseSubBuildStarted(event); + super.targetStarted(event); + } + + /** + * {@inheritDoc} + * + * @param event + */ + public void taskStarted(BuildEvent event) { + maybeRaiseSubBuildStarted(event); + super.taskStarted(event); + } + + /** + * {@inheritDoc} + * + * @param event + */ + public void buildFinished(BuildEvent event) { + maybeRaiseSubBuildStarted(event); + subBuildFinished(event); + super.buildFinished(event); + } + + /** + * {@inheritDoc} + * + * @param event + */ + public void messageLogged(BuildEvent event) { + maybeRaiseSubBuildStarted(event); + super.messageLogged(event); + } + + + /** + * {@inheritDoc} + * + * @param event An event with any relevant extra information. Must not be null. + */ + public void subBuildStarted(BuildEvent event) { + String name = extractNameOrDefault(event); + Project project = event.getProject(); + + File base = project == null ? null : project.getBaseDir(); + String path = + (base == null) + ? "With no base directory" + : "In " + base.getAbsolutePath(); + printMessage(StringUtils.LINE_SEP + getHeader() + + StringUtils.LINE_SEP + "Entering project " + name + + StringUtils.LINE_SEP + path + + StringUtils.LINE_SEP + getFooter(), + out, + event.getPriority()); + } + + /** + * Get the name of an event + * + * @param event the event name + * @return the name or a default string + */ + protected String extractNameOrDefault(BuildEvent event) { + String name = extractProjectName(event); + if (name == null) { + name = ""; + } else { + name = '"' + name + '"'; + } + return name; + } + + /** {@inheritDoc} */ + public void subBuildFinished(BuildEvent event) { + String name = extractNameOrDefault(event); + String failed = event.getException() != null ? "failing " : ""; + printMessage(StringUtils.LINE_SEP + getHeader() + + StringUtils.LINE_SEP + "Exiting " + failed + "project " + + name + + StringUtils.LINE_SEP + getFooter(), + out, + event.getPriority()); + } + + /** + * Override point: return the header string for the entry/exit message + * @return the header string + */ + protected String getHeader() { + return HEADER; + } + + /** + * Override point: return the footer string for the entry/exit message + * @return the footer string + */ + protected String getFooter() { + return FOOTER; + } + + private void maybeRaiseSubBuildStarted(BuildEvent event) { + // double checked locking should be OK since the flag is write-once + if (!subBuildStartedRaised) { + synchronized (subBuildLock) { + if (!subBuildStartedRaised) { + subBuildStartedRaised = true; + subBuildStarted(event); + } + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java new file mode 100644 index 00000000..32474eea --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java @@ -0,0 +1,332 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.listener; + +import java.io.PrintStream; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogConfigurationException; +import org.apache.commons.logging.LogFactory; +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.BuildLogger; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.UnknownElement; + + +/** + * Jakarta Commons Logging listener. + * Note: do not use the SimpleLog as your logger implementation as it + * causes an infinite loop since it writes to System.err, which Ant traps + * and reroutes to the logger/listener layer. + * + * The following names are used for the log: + * org.apache.tools.ant.Project.PROJECT_NAME - for project events + * org.apache.tools.ant.Target.TARGET_NAME - for target events + * TASK_CLASS_NAME.TARGET_NAME - for events in individual targets. + * + * In all target and project names we replace "." and " " with "-". + * + * TODO: we should use the advanced context logging features (and expose them + * in c-l first :-) + * TODO: this is _very_ inefficient. Switching the out and tracking the logs + * can be optimized a lot - but may require few more changes to the core. + * + * @since Ant 1.5 + */ +public class CommonsLoggingListener implements BuildListener, BuildLogger { + + /** Indicates if the listener was initialized. */ + private boolean initialized = false; + + private LogFactory logFactory; + + /** + * name of the category under which target events are logged + */ + public static final String TARGET_LOG = "org.apache.tools.ant.Target"; + /** + * name of the category under which project events are logged + */ + public static final String PROJECT_LOG = "org.apache.tools.ant.Project"; + + /** + * Construct the listener and make sure that a LogFactory + * can be obtained. + */ + public CommonsLoggingListener() { + } + + private Log getLog(String cat, String suffix) { + if (suffix != null) { + suffix = suffix.replace('.', '-'); + suffix = suffix.replace(' ', '-'); + cat = cat + "." + suffix; + } + final PrintStream tmpOut = System.out; + final PrintStream tmpErr = System.err; + System.setOut(out); + System.setErr(err); + + if (!initialized) { + try { + logFactory = LogFactory.getFactory(); + } catch (final LogConfigurationException e) { + e.printStackTrace(System.err); + return null; + } + } + + initialized = true; + final Log log = logFactory.getInstance(cat); + System.setOut(tmpOut); + System.setErr(tmpErr); + return log; + } + + /** {@inheritDoc}. */ + public void buildStarted(final BuildEvent event) { + final String categoryString = PROJECT_LOG; + final Log log = getLog(categoryString, null); + + if (initialized) { + realLog(log, "Build started.", Project.MSG_INFO, null); + } + } + + /** {@inheritDoc}. */ + public void buildFinished(final BuildEvent event) { + if (initialized) { + final String categoryString = PROJECT_LOG; + final Log log = getLog(categoryString, event.getProject().getName()); + + if (event.getException() == null) { + realLog(log, "Build finished.", Project.MSG_INFO, null); + } else { + realLog(log, "Build finished with error.", Project.MSG_ERR, + event.getException()); + } + } + } + + /** + * @see BuildListener#targetStarted + */ + /** {@inheritDoc}. */ + public void targetStarted(final BuildEvent event) { + if (initialized) { + final Log log = getLog(TARGET_LOG, + event.getTarget().getName()); + // Since task log category includes target, we don't really + // need this message + realLog(log, "Start: " + event.getTarget().getName(), + Project.MSG_VERBOSE, null); + } + } + + /** + * @see BuildListener#targetFinished + */ + /** {@inheritDoc}. */ + public void targetFinished(final BuildEvent event) { + if (initialized) { + final String targetName = event.getTarget().getName(); + final Log log = getLog(TARGET_LOG, + event.getTarget().getName()); + if (event.getException() == null) { + realLog(log, "Target end: " + targetName, Project.MSG_DEBUG, null); + } else { + realLog(log, "Target \"" + targetName + + "\" finished with error.", Project.MSG_ERR, + event.getException()); + } + } + } + + /** + * @see BuildListener#taskStarted + */ + /** {@inheritDoc}. */ + public void taskStarted(final BuildEvent event) { + if (initialized) { + final Task task = event.getTask(); + Object real = task; + if (task instanceof UnknownElement) { + final Object realObj = ((UnknownElement) task).getTask(); + if (realObj != null) { + real = realObj; + } + } + final Log log = getLog(real.getClass().getName(), null); + if (log.isTraceEnabled()) { + realLog(log, "Task \"" + task.getTaskName() + "\" started ", + Project.MSG_VERBOSE, null); + } + } + } + + /** + * @see BuildListener#taskFinished + */ + /** {@inheritDoc}. */ + public void taskFinished(final BuildEvent event) { + if (initialized) { + final Task task = event.getTask(); + Object real = task; + if (task instanceof UnknownElement) { + final Object realObj = ((UnknownElement) task).getTask(); + if (realObj != null) { + real = realObj; + } + } + final Log log = getLog(real.getClass().getName(), null); + if (event.getException() == null) { + if (log.isTraceEnabled()) { + realLog(log, "Task \"" + task.getTaskName() + "\" finished.", + Project.MSG_VERBOSE, null); + } + } else { + realLog(log, "Task \"" + task.getTaskName() + + "\" finished with error.", Project.MSG_ERR, + event.getException()); + } + } + } + + + /** + * @see BuildListener#messageLogged + */ + /** {@inheritDoc}. */ + public void messageLogged(final BuildEvent event) { + if (initialized) { + Object categoryObject = event.getTask(); + String categoryString = null; + String categoryDetail = null; + + if (categoryObject == null) { + categoryObject = event.getTarget(); + if (categoryObject == null) { + categoryObject = event.getProject(); + categoryString = PROJECT_LOG; + categoryDetail = event.getProject().getName(); + } else { + categoryString = TARGET_LOG; + categoryDetail = event.getTarget().getName(); + } + } else { + // It's a task - append the target + if (event.getTarget() != null) { + categoryString = categoryObject.getClass().getName(); + categoryDetail = event.getTarget().getName(); + } else { + categoryString = categoryObject.getClass().getName(); + } + + } + + final Log log = getLog(categoryString, categoryDetail); + final int priority = event.getPriority(); + final String message = event.getMessage(); + realLog(log, message, priority , null); + } + } + + private void realLog(final Log log, final String message, final int priority, final Throwable t) { + final PrintStream tmpOut = System.out; + final PrintStream tmpErr = System.err; + System.setOut(out); + System.setErr(err); + switch (priority) { + case Project.MSG_ERR: + if (t == null) { + log.error(message); + } else { + log.error(message, t); + } + break; + case Project.MSG_WARN: + if (t == null) { + log.warn(message); + } else { + log.warn(message, t); + } + break; + case Project.MSG_INFO: + if (t == null) { + log.info(message); + } else { + log.info(message, t); + } + break; + case Project.MSG_VERBOSE: + log.debug(message); + break; + case Project.MSG_DEBUG: + log.debug(message); + break; + default: + log.error(message); + break; + } + System.setOut(tmpOut); + System.setErr(tmpErr); + } + + // CheckStyle:VisibilityModifier OFF - bc + PrintStream out = System.out; + PrintStream err = System.err; + // CheckStyle:VisibilityModifier ON + + /** + * Set the the output level. + * This is not used, the logger config is used instead. + * @param level ignored + */ + public void setMessageOutputLevel(final int level) { + // Use the logger config + } + + /** + * Set the output print stream. + * @param output the output stream + */ + public void setOutputPrintStream(final PrintStream output) { + this.out = output; + } + + /** + * Set emacs mode. + * This is ignored. + * @param emacsMode ignored + */ + public void setEmacsMode(final boolean emacsMode) { + // Doesn't make sense for c-l. Use the logger config + } + + /** + * Set the error print stream. + * @param err the error stream + */ + public void setErrorPrintStream(final PrintStream err) { + this.err = err; + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/Log4jListener.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/Log4jListener.java new file mode 100644 index 00000000..829f1183 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/Log4jListener.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.listener; + +import org.apache.log4j.Logger; +import org.apache.log4j.helpers.NullEnumeration; +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Task; + + +/** + * Listener which sends events to Log4j logging system + * + */ +public class Log4jListener implements BuildListener { + + /** Indicates if the listener was initialized. */ + private final boolean initialized; + + /** + * log category we log into + */ + public static final String LOG_ANT = "org.apache.tools.ant"; + + /** + * Construct the listener and make sure there is a valid appender. + */ + public Log4jListener() { + final Logger log = Logger.getLogger(LOG_ANT); + final Logger rootLog = Logger.getRootLogger(); + initialized = !(rootLog.getAllAppenders() instanceof NullEnumeration); + if (!initialized) { + log.error("No log4j.properties in build area"); + } + } + + /** + * @see BuildListener#buildStarted + */ + /** {@inheritDoc}. */ + public void buildStarted(final BuildEvent event) { + if (initialized) { + final Logger log = Logger.getLogger(Project.class.getName()); + log.info("Build started."); + } + } + + /** + * @see BuildListener#buildFinished + */ + /** {@inheritDoc}. */ + public void buildFinished(final BuildEvent event) { + if (initialized) { + final Logger log = Logger.getLogger(Project.class.getName()); + if (event.getException() == null) { + log.info("Build finished."); + } else { + log.error("Build finished with error.", event.getException()); + } + } + } + + /** + * @see BuildListener#targetStarted + */ + /** {@inheritDoc}. */ + public void targetStarted(final BuildEvent event) { + if (initialized) { + final Logger log = Logger.getLogger(Target.class.getName()); + log.info("Target \"" + event.getTarget().getName() + "\" started."); + } + } + + /** + * @see BuildListener#targetFinished + */ + /** {@inheritDoc}. */ + public void targetFinished(final BuildEvent event) { + if (initialized) { + final String targetName = event.getTarget().getName(); + final Logger cat = Logger.getLogger(Target.class.getName()); + if (event.getException() == null) { + cat.info("Target \"" + targetName + "\" finished."); + } else { + cat.error("Target \"" + targetName + + "\" finished with error.", event.getException()); + } + } + } + + /** + * @see BuildListener#taskStarted + */ + /** {@inheritDoc}. */ + public void taskStarted(final BuildEvent event) { + if (initialized) { + final Task task = event.getTask(); + final Logger log = Logger.getLogger(task.getClass().getName()); + log.info("Task \"" + task.getTaskName() + "\" started."); + } + } + + /** + * @see BuildListener#taskFinished + */ + /** {@inheritDoc}. */ + public void taskFinished(final BuildEvent event) { + if (initialized) { + final Task task = event.getTask(); + final Logger log = Logger.getLogger(task.getClass().getName()); + if (event.getException() == null) { + log.info("Task \"" + task.getTaskName() + "\" finished."); + } else { + log.error("Task \"" + task.getTaskName() + + "\" finished with error.", event.getException()); + } + } + } + + /** + * @see BuildListener#messageLogged + */ + /** {@inheritDoc}. */ + public void messageLogged(final BuildEvent event) { + if (initialized) { + Object categoryObject = event.getTask(); + if (categoryObject == null) { + categoryObject = event.getTarget(); + if (categoryObject == null) { + categoryObject = event.getProject(); + } + } + + final Logger log + = Logger.getLogger(categoryObject.getClass().getName()); + switch (event.getPriority()) { + case Project.MSG_ERR: + log.error(event.getMessage()); + break; + case Project.MSG_WARN: + log.warn(event.getMessage()); + break; + case Project.MSG_INFO: + log.info(event.getMessage()); + break; + case Project.MSG_VERBOSE: + log.debug(event.getMessage()); + break; + case Project.MSG_DEBUG: + log.debug(event.getMessage()); + break; + default: + log.error(event.getMessage()); + break; + } + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/MailLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/MailLogger.java new file mode 100644 index 00000000..4b50547f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/MailLogger.java @@ -0,0 +1,440 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.listener; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.Vector; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.email.EmailAddress; +import org.apache.tools.ant.taskdefs.email.Header; +import org.apache.tools.ant.taskdefs.email.Mailer; +import org.apache.tools.ant.taskdefs.email.Message; +import org.apache.tools.ant.util.ClasspathUtils; +import org.apache.tools.ant.util.DateUtils; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.StringUtils; +import org.apache.tools.mail.MailMessage; + +/** + * Buffers log messages from DefaultLogger, and sends an e-mail with the + * results. The following Project properties are used to send the mail. + *
      + *
    • MailLogger.mailhost [default: localhost] - Mail server to use
    • + *
    • MailLogger.port [default: 25] - Default port for SMTP
    • + *
    • Maillogger.user [no default] - user name for SMTP auth + * (requires JavaMail)
    • + *
    • Maillogger.password [no default] - password for SMTP auth + * (requires JavaMail)
    • + *
    • Maillogger.ssl [default: false] - on or true if ssl is + * needed (requires JavaMail)
    • + *
    • MailLogger.from [required] - Mail "from" address
    • + *
    • MailLogger.from [no default] - Mail "replyto" address(es), + * comma-separated
    • + *
    • MailLogger.failure.notify [default: true] - Send build failure + * e-mails?
    • + *
    • MailLogger.success.notify [default: true] - Send build success + * e-mails?
    • + *
    • MailLogger.failure.to [required if failure mail to be sent] - Address + * to send failure messages to
    • + *
    • MailLogger.success.to [required if success mail to be sent] - Address + * to send success messages to
    • + *
    • MailLogger.failure.cc [no default] - Address + * to send failure messages to carbon copy (cc)
    • + *
    • MailLogger.success.to [no default] - Address + * to send success messages to carbon copy (cc)
    • + *
    • MailLogger.failure.bcc [no default] - Address + * to send failure messages to blind carbon copy (bcc)
    • + *
    • MailLogger.success.bcc [no default] - Address + * to send success messages to blind carbon copy (bcc)
    • + *
    • MailLogger.failure.subject [default: "Build Failure"] - Subject of + * failed build
    • + *
    • MailLogger.success.subject [default: "Build Success"] - Subject of + * successful build
    • + *
    • MailLogger.failure.body [default: none] - fixed text of + * mail body for a failed build, default is to send the logfile
    • + *
    • MailLogger.success.body [default: none] - fixed text of + * mail body for a successful build, default is to send the logfile
    • + *
    • MailLogger.mimeType [default: text/plain] - MIME-Type of email
    • + *
    • MailLogger.charset [no default] - character set of email
    • + *
    • Maillogger.starttls.enable [default: false] - on or true if + * STARTTLS should be supported (requires JavaMail)
    • + *
    • MailLogger.properties.file [no default] - Filename of + * properties file that will override other values.
    • + *
    + * These properties are set using standard Ant property setting mechanisms + * (<property>, command-line -D, etc). Ant properties can be overridden + * by specifying the filename of a properties file in the + * MailLogger.properties.file property . Any properties defined in that + * file will override Ant properties. + * + */ +public class MailLogger extends DefaultLogger { + /** Buffer in which the message is constructed prior to sending */ + private StringBuffer buffer = new StringBuffer(); + + private static final String DEFAULT_MIME_TYPE = "text/plain"; + + /** + * Sends an e-mail with the log results. + * + * @param event the build finished event + */ + public void buildFinished(BuildEvent event) { + super.buildFinished(event); + + Project project = event.getProject(); + Hashtable properties = project.getProperties(); + + // overlay specified properties file (if any), which overrides project + // settings + Properties fileProperties = new Properties(); + String filename = (String) properties.get("MailLogger.properties.file"); + if (filename != null) { + InputStream is = null; + try { + is = new FileInputStream(filename); + fileProperties.load(is); + } catch (IOException ioe) { + // ignore because properties file is not required + } finally { + FileUtils.close(is); + } + } + + for (Enumeration e = fileProperties.keys(); e.hasMoreElements();) { + String key = (String) e.nextElement(); + String value = fileProperties.getProperty(key); + properties.put(key, project.replaceProperties(value)); + } + + boolean success = (event.getException() == null); + String prefix = success ? "success" : "failure"; + + try { + boolean notify = Project.toBoolean(getValue(properties, + prefix + ".notify", "on")); + + if (!notify) { + return; + } + Values values = new Values() + .mailhost(getValue(properties, "mailhost", "localhost")) + .port(Integer.parseInt( + getValue( + properties, "port", + String.valueOf(MailMessage.DEFAULT_PORT)))) + .user(getValue(properties, "user", "")) + .password(getValue(properties, "password", "")) + .ssl(Project.toBoolean(getValue(properties, + "ssl", "off"))) + .starttls(Project.toBoolean(getValue(properties, + "starttls.enable", "off"))) + .from(getValue(properties, "from", null)) + .replytoList(getValue(properties, "replyto", "")) + .toList(getValue(properties, prefix + ".to", null)) + .toCcList(getValue(properties, prefix + ".cc", "")) + .toBccList(getValue(properties, prefix + ".bcc", "")) + .mimeType(getValue(properties, "mimeType", DEFAULT_MIME_TYPE)) + .charset(getValue(properties, "charset", "")) + .body(getValue(properties, prefix + ".body", "")) + .subject(getValue( + properties, prefix + ".subject", + (success) ? "Build Success" : "Build Failure")); + if (values.user().equals("") + && values.password().equals("") + && !values.ssl() && !values.starttls()) { + sendMail(values, buffer.substring(0)); + } else { + sendMimeMail( + event.getProject(), values, buffer.substring(0)); + } + } catch (Exception e) { + System.out.println("MailLogger failed to send e-mail!"); + e.printStackTrace(System.err); + } + } + + private static class Values { + private String mailhost; + public String mailhost() { + return mailhost; + } + public Values mailhost(String mailhost) { + this.mailhost = mailhost; + return this; + } + private int port; + public int port() { + return port; + } + public Values port(int port) { + this.port = port; + return this; + } + private String user; + public String user() { + return user; + } + public Values user(String user) { + this.user = user; + return this; + } + private String password; + public String password() { + return password; + } + public Values password(String password) { + this.password = password; + return this; + } + private boolean ssl; + public boolean ssl() { + return ssl; + } + public Values ssl(boolean ssl) { + this.ssl = ssl; + return this; + } + private String from; + public String from() { + return from; + } + public Values from(String from) { + this.from = from; + return this; + } + private String replytoList; + public String replytoList() { + return replytoList; + } + public Values replytoList(String replytoList) { + this.replytoList = replytoList; + return this; + } + private String toList; + public String toList() { + return toList; + } + public Values toList(String toList) { + this.toList = toList; + return this; + } + private String toCcList; + public String toCcList() { + return toCcList; + } + public Values toCcList(String toCcList) { + this.toCcList = toCcList; + return this; + } + private String toBccList; + public String toBccList() { + return toBccList; + } + public Values toBccList(String toBccList) { + this.toBccList = toBccList; + return this; + } + private String subject; + public String subject() { + return subject; + } + public Values subject(String subject) { + this.subject = subject; + return this; + } + private String charset; + public String charset() { + return charset; + } + public Values charset(String charset) { + this.charset = charset; + return this; + } + private String mimeType; + public String mimeType() { + return mimeType; + } + public Values mimeType(String mimeType) { + this.mimeType = mimeType; + return this; + } + private String body; + public String body() { + return body; + } + public Values body(String body) { + this.body = body; + return this; + } + private boolean starttls; + public boolean starttls() { + return starttls; + } + public Values starttls(boolean starttls) { + this.starttls = starttls; + return this; + } + } + + /** + * Receives and buffers log messages. + * + * @param message the message being logger + */ + protected void log(String message) { + buffer.append(message).append(StringUtils.LINE_SEP); + } + + + /** + * Gets the value of a property. + * + * @param properties Properties to obtain value from + * @param name suffix of property name. "MailLogger." will be + * prepended internally. + * @param defaultValue value returned if not present in the properties. + * Set to null to make required. + * @return The value of the property, or default value. + * @exception Exception thrown if no default value is specified and the + * property is not present in properties. + */ + private String getValue(Hashtable properties, String name, + String defaultValue) throws Exception { + String propertyName = "MailLogger." + name; + String value = (String) properties.get(propertyName); + + if (value == null) { + value = defaultValue; + } + + if (value == null) { + throw new Exception("Missing required parameter: " + propertyName); + } + + return value; + } + + + /** + * Send the mail + * @param values the various values. + * @param message mail body + * @exception IOException thrown if sending message fails + */ + private void sendMail(Values values, String message) throws IOException { + MailMessage mailMessage = new MailMessage( + values.mailhost(), values.port()); + mailMessage.setHeader("Date", DateUtils.getDateForHeader()); + + mailMessage.from(values.from()); + if (!values.replytoList().equals("")) { + StringTokenizer t = new StringTokenizer( + values.replytoList(), ", ", false); + while (t.hasMoreTokens()) { + mailMessage.replyto(t.nextToken()); + } + } + StringTokenizer t = new StringTokenizer(values.toList(), ", ", false); + while (t.hasMoreTokens()) { + mailMessage.to(t.nextToken()); + } + + mailMessage.setSubject(values.subject()); + + if (values.charset().length() > 0) { + mailMessage.setHeader("Content-Type", values.mimeType() + + "; charset=\"" + values.charset() + "\""); + } else { + mailMessage.setHeader("Content-Type", values.mimeType()); + } + + PrintStream ps = mailMessage.getPrintStream(); + ps.println(values.body().length() > 0 ? values.body() : message); + + mailMessage.sendAndClose(); + } + /** + * Send the mail (MimeMail) + * @param project current ant project + * @param values various values + * @param message mail body + */ + private void sendMimeMail(Project project, Values values, String message) { + Mailer mailer = null; + try { + mailer = (Mailer) ClasspathUtils.newInstance( + "org.apache.tools.ant.taskdefs.email.MimeMailer", + MailLogger.class.getClassLoader(), Mailer.class); + } catch (BuildException e) { + Throwable t = e.getCause() == null ? e : e.getCause(); + log("Failed to initialise MIME mail: " + t.getMessage()); + return; + } + // convert the replyTo string into a vector of emailaddresses + Vector replyToList = vectorizeEmailAddresses(values.replytoList()); + mailer.setHost(values.mailhost()); + mailer.setPort(values.port()); + mailer.setUser(values.user()); + mailer.setPassword(values.password()); + mailer.setSSL(values.ssl()); + mailer.setEnableStartTLS(values.starttls()); + Message mymessage = + new Message(values.body().length() > 0 ? values.body() : message); + mymessage.setProject(project); + mymessage.setMimeType(values.mimeType()); + if (values.charset().length() > 0) { + mymessage.setCharset(values.charset()); + } + mailer.setMessage(mymessage); + mailer.setFrom(new EmailAddress(values.from())); + mailer.setReplyToList(replyToList); + Vector toList = vectorizeEmailAddresses(values.toList()); + mailer.setToList(toList); + Vector toCcList = vectorizeEmailAddresses(values.toCcList()); + mailer.setCcList(toCcList); + Vector toBccList = vectorizeEmailAddresses(values.toBccList()); + mailer.setBccList(toBccList); + mailer.setFiles(new Vector()); + mailer.setSubject(values.subject()); + mailer.setHeaders(new Vector
    ()); + mailer.send(); + } + private Vector vectorizeEmailAddresses(String listString) { + Vector emailList = new Vector(); + StringTokenizer tokens = new StringTokenizer(listString, ","); + while (tokens.hasMoreTokens()) { + emailList.addElement(new EmailAddress(tokens.nextToken())); + } + return emailList; + } +} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/ProfileLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/ProfileLogger.java new file mode 100644 index 00000000..bbf5bb4f --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/ProfileLogger.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.listener; + +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.util.StringUtils; + +/** + * This is a special logger that is designed to profile builds. + * + * @since Ant1.8 + */ +public class ProfileLogger extends DefaultLogger { + + private Map profileData = new ConcurrentHashMap(); + + /** + * Logs a message to say that the target has started. + * + * @param event + * An event with any relevant extra information. Must not be + * null. + */ + public void targetStarted(BuildEvent event) { + Date now = new Date(); + String name = "Target " + event.getTarget().getName(); + logStart(event, now, name); + profileData.put(event.getTarget(), now); + } + + /** + * Logs a message to say that the target has finished. + * + * @param event + * An event with any relevant extra information. Must not be + * null. + */ + public void targetFinished(BuildEvent event) { + Date start = (Date) profileData.remove(event.getTarget()); + String name = "Target " + event.getTarget().getName(); + logFinish(event, start, name); + } + + /** + * Logs a message to say that the task has started. + * + * @param event + * An event with any relevant extra information. Must not be + * null. + */ + public void taskStarted(BuildEvent event) { + String name = event.getTask().getTaskName(); + Date now = new Date(); + logStart(event, now, name); + profileData.put(event.getTask(), now); + } + + /** + * Logs a message to say that the task has finished. + * + * @param event + * An event with any relevant extra information. Must not be + * null. + */ + public void taskFinished(BuildEvent event) { + Date start = (Date) profileData.remove(event.getTask()); + String name = event.getTask().getTaskName(); + logFinish(event, start, name); + } + + private void logFinish(BuildEvent event, Date start, String name) { + Date now = new Date(); + String msg = null; + if (start != null) { + long diff = now.getTime() - start.getTime(); + msg = StringUtils.LINE_SEP + name + ": finished " + now + " (" + + diff + "ms)"; + } else { + msg = StringUtils.LINE_SEP + name + ": finished " + now + + " (unknown duration, start not detected)"; + } + printMessage(msg, out, event.getPriority()); + log(msg); + } + + private void logStart(BuildEvent event, Date start, String name) { + String msg = StringUtils.LINE_SEP + name + ": started " + start; + printMessage(msg, out, event.getPriority()); + log(msg); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SilentLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SilentLogger.java new file mode 100644 index 00000000..6ddfd7f9 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SilentLogger.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.listener; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.DefaultLogger; + +/** + * A logger which logs nothing but build failure and what task might output + * + * @since 1.9.0 + */ +public class SilentLogger extends DefaultLogger { + + @Override + public void buildStarted(BuildEvent event) { + // log nothing + } + + @Override + public void buildFinished(BuildEvent event) { + if (event.getException() != null) { + super.buildFinished(event); + } + } + + @Override + public void targetStarted(BuildEvent event) { + // log nothing + } + + @Override + public void targetFinished(BuildEvent event) { + // log nothing + } + + @Override + public void taskStarted(BuildEvent event) { + // log nothing + } + + @Override + public void taskFinished(BuildEvent event) { + // log nothing + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SimpleBigProjectLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SimpleBigProjectLogger.java new file mode 100644 index 00000000..18f8dc68 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/SimpleBigProjectLogger.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.listener; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.NoBannerLogger; + +/** + * Displays subproject names like {@link BigProjectLogger} + * but is otherwise as quiet as {@link NoBannerLogger}. + * @since Ant1.8.1 + */ +public class SimpleBigProjectLogger extends NoBannerLogger { + + /** + * Override point, extract the target name + * + * @param event the event to work on + * @return the target name -including the owning project name (if non-null) + */ + protected String extractTargetName(BuildEvent event) { + String targetName = super.extractTargetName(event); + String projectName = extractProjectName(event); + if (projectName != null && targetName != null) { + return projectName + '.' + targetName; + } else { + return targetName; + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/TimestampedLogger.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/TimestampedLogger.java new file mode 100644 index 00000000..91296e32 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/TimestampedLogger.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.listener; + +import org.apache.tools.ant.DefaultLogger; + +/** + * Like a normal logger, except with timed outputs + */ +public class TimestampedLogger extends DefaultLogger { + + /** + * what appears between the old message and the new + */ + public static final String SPACER = " - at "; + + + /** + * This is an override point: the message that indicates whether a build failed. + * Subclasses can change/enhance the message. + * + * @return The classic "BUILD FAILED" plus a timestamp + */ + protected String getBuildFailedMessage() { + return super.getBuildFailedMessage() + SPACER + getTimestamp(); + } + + /** + * This is an override point: the message that indicates that a build succeeded. + * Subclasses can change/enhance the message. + * + * @return The classic "BUILD SUCCESSFUL" plus a timestamp + */ + protected String getBuildSuccessfulMessage() { + return super.getBuildSuccessfulMessage() + SPACER + getTimestamp(); + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/defaults.properties b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/defaults.properties new file mode 100644 index 00000000..2994382e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/listener/defaults.properties @@ -0,0 +1,58 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +#################################################### +# +# ANSI COLOR LOGGER CONFIGURATION +# +# Format for AnsiColorLogger.*= +# Attribute;Foreground;Background +# +# Attribute is one of the following: +# 0 -> Reset All Attributes (return to normal mode) +# 1 -> Bright (Usually turns on BOLD) +# 2 -> Dim +# 3 -> Underline +# 5 -> link +# 7 -> Reverse +# 8 -> Hidden +# +# Foreground is one of the following: +# 30 -> Black +# 31 -> Red +# 32 -> Green +# 33 -> Yellow +# 34 -> Blue +# 35 -> Magenta +# 36 -> Cyan +# 37 -> White +# +# Background is one of the following: +# 40 -> Black +# 41 -> Red +# 42 -> Green +# 43 -> Yellow +# 44 -> Blue +# 45 -> Magenta +# 46 -> Cyan +# 47 -> White +# +#################################################### + +AnsiColorLogger.ERROR_COLOR=2;31 +AnsiColorLogger.WARNING_COLOR=2;35 +AnsiColorLogger.INFO_COLOR=2;36 +AnsiColorLogger.VERBOSE_COLOR=2;32 +AnsiColorLogger.DEBUG_COLOR=2;34 diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader2.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader2.java new file mode 100644 index 00000000..1a4cac62 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader2.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.loader; + +import org.apache.tools.ant.AntClassLoader; + +/** + * @deprecated since 1.7 + * Just use {@link AntClassLoader} itself. + */ +public class AntClassLoader2 extends AntClassLoader { + /** No args constructor. */ + public AntClassLoader2() { + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader5.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader5.java new file mode 100644 index 00000000..a91ed41e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/loader/AntClassLoader5.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.loader; + +import java.io.Closeable; +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; + +import org.apache.tools.ant.AntClassLoader; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.Path; + +/** + * Overrides getResources which became non-final in Java5 and + * implements Closeable + */ +public class AntClassLoader5 extends AntClassLoader implements Closeable { + /** + * Creates a classloader for the given project using the classpath given. + * + * @param parent The parent classloader to which unsatisfied loading + * attempts are delegated. May be null, + * in which case the classloader which loaded this + * class is used as the parent. + * @param project The project to which this classloader is to belong. + * Must not be null. + * @param classpath the classpath to use to load the classes. + * May be null, in which case no path + * elements are set up to start with. + * @param parentFirst If true, indicates that the parent + * classloader should be consulted before trying to + * load the a class through this loader. + */ + public AntClassLoader5(ClassLoader parent, Project project, + Path classpath, boolean parentFirst) { + super(parent, project, classpath, parentFirst); + } + + /** {@inheritDoc} */ + public Enumeration getResources(String name) throws IOException { + return getNamedResources(name); + } + + /** {@inheritDoc} */ + public void close() { + cleanup(); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/GetProperty.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/GetProperty.java new file mode 100644 index 00000000..c08808aa --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/GetProperty.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +/** + * Interface to a class (normally PropertyHelper) to get a property. + * @since Ant 1.8.0 + */ +public interface GetProperty { + /** + * Returns the value of a property if it is set. + * @param name name of the property. + * @return the property value, or null for no match or for name being null. + */ + Object getProperty(String name); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalProperties.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalProperties.java new file mode 100644 index 00000000..c9ce3af0 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalProperties.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +import org.apache.tools.ant.MagicNames; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.PropertyHelper; + +/** + * Thread local class containing local properties. + * @since Ant 1.8.0 + */ +public class LocalProperties + extends InheritableThreadLocal + implements PropertyHelper.PropertyEvaluator, + PropertyHelper.PropertySetter { + + /** + * Get a localproperties for the given project. + * @param project the project to retrieve the localproperties for. + * @return the localproperties. + */ + public static synchronized LocalProperties get(Project project) { + LocalProperties l = (LocalProperties) project.getReference( + MagicNames.REFID_LOCAL_PROPERTIES); + if (l == null) { + l = new LocalProperties(); + project.addReference(MagicNames.REFID_LOCAL_PROPERTIES, l); + PropertyHelper.getPropertyHelper(project).add(l); + } + return l; + } + + // -------------------------------------------------- + // + // Thread stuff + // + // -------------------------------------------------- + + /** + * Construct a new LocalProperties object. + */ + private LocalProperties() { + } + + /** + * Get the initial value. + * @return a new localproperties stack. + */ + protected synchronized LocalPropertyStack initialValue() { + return new LocalPropertyStack(); + } + + private LocalPropertyStack current() { + return (LocalPropertyStack) get(); + } + + // -------------------------------------------------- + // + // Local property adding and scoping + // + // -------------------------------------------------- + + /** + * Add a local property to the current scope. + * @param property the property name to add. + */ + public void addLocal(String property) { + current().addLocal(property); + } + + /** enter the scope */ + public void enterScope() { + current().enterScope(); + } + + /** exit the scope */ + public void exitScope() { + current().exitScope(); + } + + // -------------------------------------------------- + // + // Copy - used in parallel to make a new stack + // + // -------------------------------------------------- + + /** + * Copy the stack for a parallel thread. + * To be called from the parallel thread itself. + */ + public void copy() { + set(current().copy()); + } + + // -------------------------------------------------- + // + // PropertyHelper delegate methods + // + // -------------------------------------------------- + + /** + * Evaluate a property. + * @param property the property's String "identifier". + * @param helper the invoking PropertyHelper. + * @return Object value. + */ + public Object evaluate(String property, PropertyHelper helper) { + return current().evaluate(property, helper); + } + + /** + * Set a *new" property. + * @param property the property's String "identifier". + * @param value the value to set. + * @param propertyHelper the invoking PropertyHelper. + * @return true if this entity 'owns' the property. + */ + public boolean setNew( + String property, Object value, PropertyHelper propertyHelper) { + return current().setNew(property, value, propertyHelper); + } + + /** + * Set a property. + * @param property the property's String "identifier". + * @param value the value to set. + * @param propertyHelper the invoking PropertyHelper. + * @return true if this entity 'owns' the property. + */ + public boolean set( + String property, Object value, PropertyHelper propertyHelper) { + return current().set(property, value, propertyHelper); + } +} + + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalPropertyStack.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalPropertyStack.java new file mode 100644 index 00000000..482f28cd --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/LocalPropertyStack.java @@ -0,0 +1,161 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +import java.util.LinkedList; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.tools.ant.PropertyHelper; + +/** + * A stack of local property maps. + * There is a map for each scope (target, sequential, macro). + * @since Ant 1.8.0 + */ +public class LocalPropertyStack { + private final LinkedList> stack = new LinkedList>(); + private final Object LOCK = new Object(); + + // -------------------------------------------------- + // + // Local property adding and scoping + // + // -------------------------------------------------- + + /** + * Add a local property. + * @param property the name of the local property. + */ + public void addLocal(String property) { + synchronized (LOCK) { + Map map = stack.peek(); + if (map != null) { + map.put(property, NullReturn.NULL); + } + } + } + + /** + * Enter the local scope. + */ + public void enterScope() { + synchronized (LOCK) { + stack.addFirst(new ConcurrentHashMap()); + } + } + + /** + * Exit the local scope. + */ + public void exitScope() { + synchronized (LOCK) { + stack.removeFirst().clear(); + } + } + + // -------------------------------------------------- + // + // Copy - used in parallel to make a new stack + // + // -------------------------------------------------- + + /** + * Copy the stack for a parallel thread. + * @return a copy. + */ + public LocalPropertyStack copy() { + synchronized (LOCK) { + LocalPropertyStack ret = new LocalPropertyStack(); + ret.stack.addAll(stack); + return ret; + } + } + + // -------------------------------------------------- + // + // PropertyHelper delegate methods + // + // -------------------------------------------------- + + /** + * Evaluate a property. + * @param property the property's String "identifier". + * @param helper the invoking PropertyHelper. + * @return Object value. + */ + public Object evaluate(String property, PropertyHelper helper) { + synchronized (LOCK) { + for (Map map : stack) { + Object ret = map.get(property); + if (ret != null) { + return ret; + } + } + } + return null; + } + + /** + * Set a *new" property. + * @param property the property's String "identifier". + * @param value the value to set. + * @param propertyHelper the invoking PropertyHelper. + * @return true if this entity 'owns' the property. + */ + public boolean setNew( + String property, Object value, PropertyHelper propertyHelper) { + Map map = getMapForProperty(property); + if (map == null) { + return false; + } + Object currValue = map.get(property); + if (currValue == NullReturn.NULL) { + map.put(property, value); + } + return true; + } + + /** + * Set a property. + * @param property the property's String "identifier". + * @param value the value to set. + * @param propertyHelper the invoking PropertyHelper. + * @return true if this entity 'owns' the property. + */ + public boolean set(String property, Object value, PropertyHelper propertyHelper) { + Map map = getMapForProperty(property); + if (map == null) { + return false; + } + map.put(property, value); + return true; + } + + private Map getMapForProperty(String property) { + synchronized (LOCK) { + for (Map map : stack) { + if (map.get(property) != null) { + return map; + } + } + } + return null; + } +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/NullReturn.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/NullReturn.java new file mode 100644 index 00000000..067aa9f1 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/NullReturn.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +/** + * Class to represent a null and to stop the chain of lookups. + * @since Ant 1.8.0 + */ +public final class NullReturn { + /** a value to use in a property helper to stop looking properties */ + public static final NullReturn NULL = new NullReturn(); + + /** Private constructor */ + private NullReturn() { + } + + /** + * {@inheritDoc} + */ + public String toString() { + return "null"; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseNextProperty.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseNextProperty.java new file mode 100644 index 00000000..5e5dfc07 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseNextProperty.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +import java.text.ParsePosition; + +import org.apache.tools.ant.Project; + +/** + * Helper for {@link PropertyExpander PropertyExpander} that can be + * used to expand property references to values. + * @since Ant 1.8.0 + */ +public interface ParseNextProperty { + /** + * Get the current project. + * @return the current ant project. + */ + Project getProject(); + + /** + * Return any property that can be parsed from the specified position + * in the specified String. + * @param value String to parse + * @param pos ParsePosition + * @return Object or null if no property is at the current location. + */ + Object parseNextProperty(String value, ParsePosition pos); +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseProperties.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseProperties.java new file mode 100644 index 00000000..f03f966e --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ParseProperties.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +import java.text.ParsePosition; +import java.util.Collection; + +import org.apache.tools.ant.Project; + +/** + * Parse properties using a collection of expanders. + * + * @since Ant 1.8.0 + */ +public class ParseProperties implements ParseNextProperty { + + private final Project project; + private final GetProperty getProperty; + private final Collection expanders; + + /** + * Constructor with a getProperty. + * @param project the current Ant project. + * @param expanders a sequence of expanders + * @param getProperty property resolver. + */ + public ParseProperties(Project project, Collection expanders, GetProperty getProperty) { + this.project = project; + this.expanders = expanders; + this.getProperty = getProperty; + } + + /** + * Get the project. + * @return the current Ant project. + */ + public Project getProject() { + return project; + } + + /** + * Decode properties from a String representation. + * + *
      + * + *
    • This implementation starts parsing the value + * parameter (unsurprisingly) at the beginning and asks each + * {@link PropertyExpander PropertyExpander} whether there is a + * property reference at that point. PropertyExpanders return + * the name of a property they may find and may advance the parse + * position.
    • + * + *
    • If the PropertyExpander returns null the + * method continues with the next PropertyExpander, otherwise it + * tries to look up the property's value using the configured + * {@link GetProperty GetProperty} instance.
    • + * + *
    • Once all PropertyExpanders have been consulted, the parse + * position is advanced by one character and the process repeated + * until value is exhausted.
    • + * + *
    + * + *

    If the entire contents of value resolves to a + * single property, the looked up property value is returned. + * Otherwise a String is returned that concatenates the + * non-property parts of value and the expanded + * values of the properties that have been found.

    + * + * @param value The string to be scanned for property references. + * May be null, in which case this + * method returns immediately with no effect. + * + * @return the original string with the properties replaced, or + * null if the original string is null. + */ + public Object parseProperties(String value) { + if (value == null || "".equals(value)) { + return value; + } + final int len = value.length(); + ParsePosition pos = new ParsePosition(0); + Object o = parseNextProperty(value, pos); + if (o != null && pos.getIndex() >= len) { + return o; + } + StringBuffer sb = new StringBuffer(len * 2); + if (o == null) { + sb.append(value.charAt(pos.getIndex())); + pos.setIndex(pos.getIndex() + 1); + } else { + sb.append(o); + } + while (pos.getIndex() < len) { + o = parseNextProperty(value, pos); + if (o == null) { + sb.append(value.charAt(pos.getIndex())); + pos.setIndex(pos.getIndex() + 1); + } else { + sb.append(o); + } + } + return sb.toString(); + } + + /** + * Learn whether a String contains replaceable properties. + * + *

    Uses the configured {@link PropertyExpander + * PropertyExpanders} and scans through the string. Returns true + * as soon as any expander finds a property.

    + * + * @param value the String to check. + * @return true if value contains property notation. + */ + public boolean containsProperties(String value) { + if (value == null) { + return false; + } + final int len = value.length(); + for (ParsePosition pos = new ParsePosition(0); pos.getIndex() < len;) { + if (parsePropertyName(value, pos) != null) { + return true; + } + pos.setIndex(pos.getIndex() + 1); + } + return false; + } + + /** + * Return any property that can be parsed from the specified position + * in the specified String. + * + *

    Uses the configured {@link PropertyExpander + * PropertyExpanders} and {@link GetProperty GetProperty} + * instance .

    + * + * @param value String to parse + * @param pos ParsePosition + * @return Object or null if no property is at the current + * location. If a property reference has been found but the + * property doesn't expand to a value, the property's name is + * returned. + */ + public Object parseNextProperty(String value, ParsePosition pos) { + final int start = pos.getIndex(); + + if (start > value.length()) { + // early exit, can't find any property here, no need to + // consult all the delegates. + return null; + } + + String propertyName = parsePropertyName(value, pos); + if (propertyName != null) { + Object result = getProperty(propertyName); + if (result != null) { + return result; + } + if (project != null) { + project.log( + "Property \"" + propertyName + + "\" has not been set", Project.MSG_VERBOSE); + } + return value.substring(start, pos.getIndex()); + } + return null; + } + + private String parsePropertyName(String value, ParsePosition pos) { + for (PropertyExpander propertyExpander : expanders) { + String propertyName = propertyExpander.parsePropertyName(value, pos, this); + if (propertyName == null) { + continue; + } + return propertyName; + } + return null; + } + + private Object getProperty(String propertyName) { + return getProperty.getProperty(propertyName); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/PropertyExpander.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/PropertyExpander.java new file mode 100644 index 00000000..a2b4d633 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/PropertyExpander.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +import java.text.ParsePosition; + +import org.apache.tools.ant.PropertyHelper; + +/** + * Responsible for locating a property reference inside a String. + * @since Ant 1.8.0 + */ +public interface PropertyExpander extends PropertyHelper.Delegate { + + /** + * Determine whether there is a property reference at the current + * ParsePosition and return its name (or null if there is none). + * + *

    Implementations should advance the ParsePosition to the last + * character that makes up the property reference. E.g. the + * default implementation would return "foo" for + * ${foo} and advance the ParsePosition to the + * } character.

    + * + * @param s the String to parse. + * @param pos the ParsePosition in use, the location is expected + * to be modified if a property reference has been found (and may + * even be modified if no reference has been found). + * @param parseNextProperty provides access to the Project and may + * be used to look up property values. + * @return property name if any, else null. + */ + String parsePropertyName(String s, ParsePosition pos, + ParseNextProperty parseNextProperty); +} + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java new file mode 100644 index 00000000..5bdd3545 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java @@ -0,0 +1,151 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.property; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; + +/** + * Class to resolve properties in a map. This class is explicitly not threadsafe. + * @since Ant 1.8.0 + */ +public class ResolvePropertyMap implements GetProperty { + private final Set seen = new HashSet(); + private final ParseProperties parseProperties; + private final GetProperty master; + private Map map; + private String prefix; + // whether properties of the value side of the map should be + // expanded + private boolean prefixValues = false; + // whether the current getProperty call is expanding the key side + // of the map + private boolean expandingLHS = true; + + /** + * Constructor with a master getproperty and a collection of expanders. + * @param project the current ant project. + * @param master the master property holder (usually PropertyHelper) + * @param expanders a collection of expanders (usually from PropertyHelper). + */ + public ResolvePropertyMap(Project project, GetProperty master, Collection expanders) { + this.master = master; + this.parseProperties = new ParseProperties(project, expanders, this); + } + + /** + * Returns the value of a property if it is set. + * @param name name of the property. + * @return the property value, or null for no match or for name being null. + */ + public Object getProperty(String name) { + if (seen.contains(name)) { + throw new BuildException( + "Property " + name + " was circularly " + "defined."); + } + + try { + + // If the property we are looking up is a key in the map + // (first call into this method from resolveAllProperties) + // or we've been asked to prefix the value side (later + // recursive calls via the GetProperty interface) the + // prefix must be prepended when looking up the property + // outside of the map. + String fullKey = name; + if (prefix != null && (expandingLHS || prefixValues)) { + fullKey = prefix + name; + } + + Object masterValue = master.getProperty(fullKey); + if (masterValue != null) { + // If the property already has a value outside of the + // map, use that value to enforce property + // immutability. + + return masterValue; + } + + seen.add(name); + + String recursiveCallKey = name; + if (prefix != null && !expandingLHS && !prefixValues) { + // only look up unprefixed properties inside the map + // if prefixValues is true or we are expanding the key + // itself + recursiveCallKey = prefix + name; + } + + expandingLHS = false; + // will recurse into this method for each property + // reference found in the map's value + return parseProperties.parseProperties((String) map.get(recursiveCallKey)); + } finally { + seen.remove(name); + } + } + + /** + * The action method - resolves all the properties in a map. + * @param map the map to resolve properties in. + * @deprecated since Ant 1.8.2, use the three-arg method instead. + */ + public void resolveAllProperties(Map map) { + resolveAllProperties(map, null, false); + } + + /** + * The action method - resolves all the properties in a map. + * @param map the map to resolve properties in. + * @param prefix the prefix the properties defined inside the map + * will finally receive - may be null. + * @deprecated since Ant 1.8.2, use the three-arg method instead. + */ + public void resolveAllProperties(Map map, String prefix) { + resolveAllProperties(map, null, false); + } + + /** + * The action method - resolves all the properties in a map. + * @param map the map to resolve properties in. + * @param prefix the prefix the properties defined inside the map + * will finally receive - may be null. + * @param prefixValues - whether the prefix will be applied + * to properties on the value side of the map as well. + */ + public void resolveAllProperties(Map map, String prefix, + boolean prefixValues) { + // The map, prefix and prefixValues flag get used in the + // getProperty callback + this.map = map; + this.prefix = prefix; + this.prefixValues = prefixValues; + + for (String key : map.keySet()) { + expandingLHS = true; + Object result = getProperty(key); + String value = result == null ? "" : result.toString(); + map.put(key, value); + } + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/package.html b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/package.html new file mode 100644 index 00000000..7a497ecf --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/property/package.html @@ -0,0 +1,19 @@ + + + Contains helper classes for ant properties. + diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java new file mode 100644 index 00000000..1ce81166 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractCvsTask.java @@ -0,0 +1,873 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.taskdefs; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.Commandline; +import org.apache.tools.ant.types.Environment; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.StringUtils; + +/** + * original Cvs.java 1.20 + * + * NOTE: This implementation has been moved here from Cvs.java with + * the addition of some accessors for extensibility. Another task + * can extend this with some customized output processing. + * + * @since Ant 1.5 + */ +public abstract class AbstractCvsTask extends Task { + /** + * Default compression level to use, if compression is enabled via + * setCompression( true ). + */ + public static final int DEFAULT_COMPRESSION_LEVEL = 3; + private static final int MAXIMUM_COMRESSION_LEVEL = 9; + + private Commandline cmd = new Commandline(); + + private ArrayList modules = new ArrayList(); + + /** list of Commandline children */ + private Vector vecCommandlines = new Vector(); + + /** + * the CVSROOT variable. + */ + private String cvsRoot; + + /** + * the CVS_RSH variable. + */ + private String cvsRsh; + + /** + * the package/module to check out. + */ + private String cvsPackage; + /** + * the tag + */ + private String tag; + /** + * the default command. + */ + private static final String DEFAULT_COMMAND = "checkout"; + /** + * the CVS command to execute. + */ + private String command = null; + + /** + * suppress information messages. + */ + private boolean quiet = false; + + /** + * suppress all messages. + */ + private boolean reallyquiet = false; + + /** + * compression level to use. + */ + private int compression = 0; + + /** + * report only, don't change any files. + */ + private boolean noexec = false; + + /** + * CVS port + */ + private int port = 0; + + /** + * CVS password file + */ + private File passFile = null; + + /** + * the directory where the checked out files should be placed. + */ + private File dest; + + /** whether or not to append stdout/stderr to existing files */ + private boolean append = false; + + /** + * the file to direct standard output from the command. + */ + private File output; + + /** + * the file to direct standard error from the command. + */ + private File error; + + /** + * If true it will stop the build if cvs exits with error. + * Default is false. (Iulian) + */ + private boolean failOnError = false; + + /** + * Create accessors for the following, to allow different handling of + * the output. + */ + private ExecuteStreamHandler executeStreamHandler; + private OutputStream outputStream; + private OutputStream errorStream; + + /** empty no-arg constructor*/ + public AbstractCvsTask() { + super(); + } + + /** + * sets the handler + * @param handler a handler able of processing the output and error streams from the cvs exe + */ + public void setExecuteStreamHandler(ExecuteStreamHandler handler) { + this.executeStreamHandler = handler; + } + + /** + * find the handler and instantiate it if it does not exist yet + * @return handler for output and error streams + */ + protected ExecuteStreamHandler getExecuteStreamHandler() { + + if (this.executeStreamHandler == null) { + setExecuteStreamHandler(new PumpStreamHandler(getOutputStream(), + getErrorStream())); + } + + return this.executeStreamHandler; + } + + /** + * sets a stream to which the output from the cvs executable should be sent + * @param outputStream stream to which the stdout from cvs should go + */ + protected void setOutputStream(OutputStream outputStream) { + + this.outputStream = outputStream; + } + + /** + * access the stream to which the stdout from cvs should go + * if this stream has already been set, it will be returned + * if the stream has not yet been set, if the attribute output + * has been set, the output stream will go to the output file + * otherwise the output will go to ant's logging system + * @return output stream to which cvs' stdout should go to + */ + protected OutputStream getOutputStream() { + + if (this.outputStream == null) { + + if (output != null) { + try { + setOutputStream(new PrintStream( + new BufferedOutputStream( + new FileOutputStream(output + .getPath(), + append)))); + } catch (IOException e) { + throw new BuildException(e, getLocation()); + } + } else { + setOutputStream(new LogOutputStream(this, Project.MSG_INFO)); + } + } + + return this.outputStream; + } + + /** + * sets a stream to which the stderr from the cvs exe should go + * @param errorStream an output stream willing to process stderr + */ + protected void setErrorStream(OutputStream errorStream) { + + this.errorStream = errorStream; + } + + /** + * access the stream to which the stderr from cvs should go + * if this stream has already been set, it will be returned + * if the stream has not yet been set, if the attribute error + * has been set, the output stream will go to the file denoted by the error attribute + * otherwise the stderr output will go to ant's logging system + * @return output stream to which cvs' stderr should go to + */ + protected OutputStream getErrorStream() { + + if (this.errorStream == null) { + + if (error != null) { + + try { + setErrorStream(new PrintStream( + new BufferedOutputStream( + new FileOutputStream(error.getPath(), + append)))); + } catch (IOException e) { + throw new BuildException(e, getLocation()); + } + } else { + setErrorStream(new LogOutputStream(this, Project.MSG_WARN)); + } + } + + return this.errorStream; + } + + /** + * Sets up the environment for toExecute and then runs it. + * @param toExecute the command line to execute + * @throws BuildException if failonError is set to true and the cvs command fails + */ + protected void runCommand(Commandline toExecute) throws BuildException { + // TODO: we should use JCVS (www.ice.com/JCVS) instead of + // command line execution so that we don't rely on having + // native CVS stuff around (SM) + + // We can't do it ourselves as jCVS is GPLed, a third party task + // outside of Apache repositories would be possible though (SB). + + Environment env = new Environment(); + + if (port > 0) { + Environment.Variable var = new Environment.Variable(); + var.setKey("CVS_CLIENT_PORT"); + var.setValue(String.valueOf(port)); + env.addVariable(var); + + // non-standard environment variable used by CVSNT, WinCVS + // and others + var = new Environment.Variable(); + var.setKey("CVS_PSERVER_PORT"); + var.setValue(String.valueOf(port)); + env.addVariable(var); + } + + /** + * Need a better cross platform integration with , so + * use the same filename. + */ + if (passFile == null) { + + File defaultPassFile = new File( + System.getProperty("cygwin.user.home", + System.getProperty("user.home")) + + File.separatorChar + ".cvspass"); + + if (defaultPassFile.exists()) { + this.setPassfile(defaultPassFile); + } + } + + if (passFile != null) { + if (passFile.isFile() && passFile.canRead()) { + Environment.Variable var = new Environment.Variable(); + var.setKey("CVS_PASSFILE"); + var.setValue(String.valueOf(passFile)); + env.addVariable(var); + log("Using cvs passfile: " + String.valueOf(passFile), + Project.MSG_VERBOSE); + } else if (!passFile.canRead()) { + log("cvs passfile: " + String.valueOf(passFile) + + " ignored as it is not readable", + Project.MSG_WARN); + } else { + log("cvs passfile: " + String.valueOf(passFile) + + " ignored as it is not a file", + Project.MSG_WARN); + } + } + + if (cvsRsh != null) { + Environment.Variable var = new Environment.Variable(); + var.setKey("CVS_RSH"); + var.setValue(String.valueOf(cvsRsh)); + env.addVariable(var); + } + + // + // Just call the getExecuteStreamHandler() and let it handle + // the semantics of instantiation or retrieval. + // + Execute exe = new Execute(getExecuteStreamHandler(), null); + + exe.setAntRun(getProject()); + if (dest == null) { + dest = getProject().getBaseDir(); + } + + if (!dest.exists()) { + dest.mkdirs(); + } + + exe.setWorkingDirectory(dest); + exe.setCommandline(toExecute.getCommandline()); + exe.setEnvironment(env.getVariables()); + + try { + String actualCommandLine = executeToString(exe); + + log(actualCommandLine, Project.MSG_VERBOSE); + int retCode = exe.execute(); + log("retCode=" + retCode, Project.MSG_DEBUG); + + if (failOnError && Execute.isFailure(retCode)) { + throw new BuildException("cvs exited with error code " + + retCode + + StringUtils.LINE_SEP + + "Command line was [" + + actualCommandLine + "]", + getLocation()); + } + } catch (IOException e) { + if (failOnError) { + throw new BuildException(e, getLocation()); + } + log("Caught exception: " + e.getMessage(), Project.MSG_WARN); + } catch (BuildException e) { + if (failOnError) { + throw(e); + } + Throwable t = e.getCause(); + if (t == null) { + t = e; + } + log("Caught exception: " + t.getMessage(), Project.MSG_WARN); + } catch (Exception e) { + if (failOnError) { + throw new BuildException(e, getLocation()); + } + log("Caught exception: " + e.getMessage(), Project.MSG_WARN); + } + } + + /** + * do the work + * @throws BuildException if failonerror is set to true and the + * cvs command fails. + */ + public void execute() throws BuildException { + + String savedCommand = getCommand(); + + if (this.getCommand() == null && vecCommandlines.size() == 0) { + // re-implement legacy behaviour: + this.setCommand(AbstractCvsTask.DEFAULT_COMMAND); + } + + String c = this.getCommand(); + Commandline cloned = null; + if (c != null) { + cloned = (Commandline) cmd.clone(); + cloned.createArgument(true).setLine(c); + this.addConfiguredCommandline(cloned, true); + } + + try { + final int size = vecCommandlines.size(); + for (int i = 0; i < size; i++) { + this.runCommand((Commandline) vecCommandlines.elementAt(i)); + } + } finally { + if (cloned != null) { + removeCommandline(cloned); + } + setCommand(savedCommand); + FileUtils.close(outputStream); + FileUtils.close(errorStream); + } + } + + private String executeToString(Execute execute) { + + String cmdLine = Commandline.describeCommand(execute + .getCommandline()); + StringBuffer stringBuffer = removeCvsPassword(cmdLine); + + String newLine = StringUtils.LINE_SEP; + String[] variableArray = execute.getEnvironment(); + + if (variableArray != null) { + stringBuffer.append(newLine); + stringBuffer.append(newLine); + stringBuffer.append("environment:"); + stringBuffer.append(newLine); + for (int z = 0; z < variableArray.length; z++) { + stringBuffer.append(newLine); + stringBuffer.append("\t"); + stringBuffer.append(variableArray[z]); + } + } + + return stringBuffer.toString(); + } + + /** + * Removes the cvs password from the command line, if given on the command + * line. This password can be given on the command line in the cvsRoot + * -d:pserver:user:password@server:path + * It has to be noted that the password may be omitted altogether. + * @param cmdLine the CVS command line + * @return a StringBuffer where the password has been removed (if available) + */ + private StringBuffer removeCvsPassword(String cmdLine) { + StringBuffer stringBuffer = new StringBuffer(cmdLine); + + int start = cmdLine.indexOf("-d:"); + + if (start >= 0) { + int stop = cmdLine.indexOf("@", start); + int startproto = cmdLine.indexOf(":", start); + int startuser = cmdLine.indexOf(":", startproto + 1); + int startpass = cmdLine.indexOf(":", startuser + 1); + stop = cmdLine.indexOf("@", start); + if (stop >= 0 && startpass > startproto && startpass < stop) { + for (int i = startpass + 1; i < stop; i++) { + stringBuffer.replace(i, i + 1, "*"); + } + } + } + return stringBuffer; + } + + /** + * The CVSROOT variable. + * + * @param root + * the CVSROOT variable + */ + public void setCvsRoot(String root) { + + // Check if not real cvsroot => set it to null + if (root != null) { + if (root.trim().equals("")) { + root = null; + } + } + + this.cvsRoot = root; + } + + /** + * access the CVSROOT variable + * @return CVSROOT + */ + public String getCvsRoot() { + + return this.cvsRoot; + } + + /** + * The CVS_RSH variable. + * + * @param rsh the CVS_RSH variable + */ + public void setCvsRsh(String rsh) { + // Check if not real cvsrsh => set it to null + if (rsh != null) { + if (rsh.trim().equals("")) { + rsh = null; + } + } + + this.cvsRsh = rsh; + } + + /** + * access the CVS_RSH variable + * @return the CVS_RSH variable + */ + public String getCvsRsh() { + + return this.cvsRsh; + } + + /** + * Port used by CVS to communicate with the server. + * + * @param port port of CVS + */ + public void setPort(int port) { + this.port = port; + } + + /** + * access the port of CVS + * @return the port of CVS + */ + public int getPort() { + + return this.port; + } + + /** + * Password file to read passwords from. + * + * @param passFile password file to read passwords from + */ + public void setPassfile(File passFile) { + this.passFile = passFile; + } + + /** + * find the password file + * @return password file + */ + public File getPassFile() { + + return this.passFile; + } + + /** + * The directory where the checked out files should be placed. + * + *

    Note that this is different from CVS's -d command line + * switch as Ant will never shorten pathnames to avoid empty + * directories.

    + * + * @param dest directory where the checked out files should be placed + */ + public void setDest(File dest) { + this.dest = dest; + } + + /** + * get the file where the checked out files should be placed + * + * @return directory where the checked out files should be placed + */ + public File getDest() { + + return this.dest; + } + + /** + * The package/module to operate upon. + * + * @param p package or module to operate upon + */ + public void setPackage(String p) { + this.cvsPackage = p; + } + + /** + * access the package or module to operate upon + * + * @return package/module + */ + public String getPackage() { + + return this.cvsPackage; + } + /** + * tag or branch + * @return tag or branch + * @since ant 1.6.1 + */ + public String getTag() { + return tag; + } + + /** + * The tag of the package/module to operate upon. + * @param p tag + */ + public void setTag(String p) { + // Check if not real tag => set it to null + if (p != null && p.trim().length() > 0) { + tag = p; + addCommandArgument("-r" + p); + } + } + + /** + * This needs to be public to allow configuration + * of commands externally. + * @param arg command argument + */ + public void addCommandArgument(String arg) { + this.addCommandArgument(cmd, arg); + } + + /** + * This method adds a command line argument to an external command. + * + * I do not understand what this method does in this class ??? + * particularly not why it is public ???? + * AntoineLL July 23d 2003 + * + * @param c command line to which one argument should be added + * @param arg argument to add + */ + public void addCommandArgument(Commandline c, String arg) { + c.createArgument().setValue(arg); + } + + + /** + * Use the most recent revision no later than the given date. + * @param p a date as string in a format that the CVS executable + * can understand see man cvs + */ + public void setDate(String p) { + if (p != null && p.trim().length() > 0) { + addCommandArgument("-D"); + addCommandArgument(p); + } + } + + /** + * The CVS command to execute. + * + * This should be deprecated, it is better to use the Commandline class ? + * AntoineLL July 23d 2003 + * + * @param c a command as string + */ + public void setCommand(String c) { + this.command = c; + } + /** + * accessor to a command line as string + * + * This should be deprecated + * AntoineLL July 23d 2003 + * + * @return command line as string + */ + public String getCommand() { + return this.command; + } + + /** + * If true, suppress informational messages. + * @param q if true, suppress informational messages + */ + public void setQuiet(boolean q) { + quiet = q; + } + + /** + * If true, suppress all messages. + * @param q if true, suppress all messages + * @since Ant 1.6 + */ + public void setReallyquiet(boolean q) { + reallyquiet = q; + } + + + /** + * If true, report only and don't change any files. + * + * @param ne if true, report only and do not change any files. + */ + public void setNoexec(boolean ne) { + noexec = ne; + } + + /** + * The file to direct standard output from the command. + * @param output a file to which stdout should go + */ + public void setOutput(File output) { + this.output = output; + } + + /** + * The file to direct standard error from the command. + * + * @param error a file to which stderr should go + */ + public void setError(File error) { + this.error = error; + } + + /** + * Whether to append output/error when redirecting to a file. + * @param value true indicated you want to append + */ + public void setAppend(boolean value) { + this.append = value; + } + + /** + * Stop the build process if the command exits with + * a return code other than 0. + * Defaults to false. + * @param failOnError stop the build process if the command exits with + * a return code other than 0 + */ + public void setFailOnError(boolean failOnError) { + this.failOnError = failOnError; + } + + /** + * Configure a commandline element for things like cvsRoot, quiet, etc. + * @param c the command line which will be configured + * if the commandline is initially null, the function is a noop + * otherwise the function append to the commandline arguments concerning + *
      + *
    • + * cvs package + *
    • + *
    • + * compression + *
    • + *
    • + * quiet or reallyquiet + *
    • + *
    • cvsroot
    • + *
    • noexec
    • + *
    + */ + protected void configureCommandline(Commandline c) { + if (c == null) { + return; + } + c.setExecutable("cvs"); + if (cvsPackage != null) { + c.createArgument().setLine(cvsPackage); + } + for (Module m : modules) { + c.createArgument().setValue(m.getName()); + } + if (this.compression > 0 + && this.compression <= MAXIMUM_COMRESSION_LEVEL) { + c.createArgument(true).setValue("-z" + this.compression); + } + if (quiet && !reallyquiet) { + c.createArgument(true).setValue("-q"); + } + if (reallyquiet) { + c.createArgument(true).setValue("-Q"); + } + if (noexec) { + c.createArgument(true).setValue("-n"); + } + if (cvsRoot != null) { + c.createArgument(true).setLine("-d" + cvsRoot); + } + } + + /** + * remove a particular command from a vector of command lines + * @param c command line which should be removed + */ + protected void removeCommandline(Commandline c) { + vecCommandlines.removeElement(c); + } + + /** + * Adds direct command-line to execute. + * @param c command line to execute + */ + public void addConfiguredCommandline(Commandline c) { + this.addConfiguredCommandline(c, false); + } + + /** + * Configures and adds the given Commandline. + * @param c commandline to insert + * @param insertAtStart If true, c is + * inserted at the beginning of the vector of command lines + */ + public void addConfiguredCommandline(Commandline c, + boolean insertAtStart) { + if (c == null) { + return; + } + this.configureCommandline(c); + if (insertAtStart) { + vecCommandlines.insertElementAt(c, 0); + } else { + vecCommandlines.addElement(c); + } + } + + /** + * If set to a value 1-9 it adds -zN to the cvs command line, else + * it disables compression. + * @param level compression level 1 to 9 + */ + public void setCompressionLevel(int level) { + this.compression = level; + } + + /** + * If true, this is the same as compressionlevel="3". + * + * @param usecomp If true, turns on compression using default + * level, AbstractCvsTask.DEFAULT_COMPRESSION_LEVEL. + */ + public void setCompression(boolean usecomp) { + setCompressionLevel(usecomp + ? AbstractCvsTask.DEFAULT_COMPRESSION_LEVEL : 0); + } + + /** + * add a named module/package. + * + * @since Ant 1.8.0 + */ + public void addModule(Module m) { + modules.add(m); + } + + protected List getModules() { + @SuppressWarnings("unchecked") + final List clone = (List) modules.clone(); + return clone; + } + + public static final class Module { + private String name; + public void setName(String s) { + name = s; + } + public String getName() { + return name; + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractJarSignerTask.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractJarSignerTask.java new file mode 100644 index 00000000..bc8c0319 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AbstractJarSignerTask.java @@ -0,0 +1,423 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.taskdefs; + +import java.io.File; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.filters.LineContainsRegExp; +import org.apache.tools.ant.types.Environment; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.RedirectorElement; +import org.apache.tools.ant.types.RegularExpression; +import org.apache.tools.ant.util.JavaEnvUtils; + +/** + * This is factored out from {@link SignJar}; a base class that can be used + * for both signing and verifying JAR files using jarsigner + */ + +public abstract class AbstractJarSignerTask extends Task { + // CheckStyle:VisibilityModifier OFF - bc + /** + * The name of the jar file. + */ + protected File jar; + /** + * The alias of signer. + */ + protected String alias; + /** + * The url or path of keystore file. + */ + protected String keystore; + /** + * password for the store + */ + protected String storepass; + /** + * type of store,-storetype param + */ + protected String storetype; + /** + * password for the key in the store + */ + protected String keypass; + /** + * verbose output + */ + protected boolean verbose; + /** + * strict checking + * @since Ant 1.9.1 + */ + protected boolean strict = false; + /** + * The maximum amount of memory to use for Jar signer + */ + protected String maxMemory; + /** + * the filesets of the jars to sign + */ + protected Vector filesets = new Vector(); + /** + * name of JDK program we are looking for + */ + protected static final String JARSIGNER_COMMAND = "jarsigner"; + + // CheckStyle:VisibilityModifier ON + + /** + * redirector used to talk to the jarsigner program + */ + private RedirectorElement redirector; + + /** + * Java declarations -J-Dname=value + */ + private Environment sysProperties = new Environment(); + + /** + * error string for unit test verification: {@value} + */ + public static final String ERROR_NO_SOURCE = "jar must be set through jar attribute " + + "or nested filesets"; + + /** + * Path holding all non-filesets of filesystem resources we want to sign. + * + * @since Ant 1.7 + */ + private Path path = null; + + /** + * The executable to use instead of jarsigner. + * + * @since Ant 1.8.0 + */ + private String executable; + + /** + * Set the maximum memory to be used by the jarsigner process + * + * @param max a string indicating the maximum memory according to the JVM + * conventions (e.g. 128m is 128 Megabytes) + */ + public void setMaxmemory(String max) { + maxMemory = max; + } + + /** + * the jar file to sign; required + * + * @param jar the jar file to sign + */ + public void setJar(final File jar) { + this.jar = jar; + } + + /** + * the alias to sign under; required + * + * @param alias the alias to sign under + */ + public void setAlias(final String alias) { + this.alias = alias; + } + + /** + * keystore location; required + * + * @param keystore the keystore location + */ + public void setKeystore(final String keystore) { + this.keystore = keystore; + } + + /** + * password for keystore integrity; required + * + * @param storepass the password for the keystore + */ + public void setStorepass(final String storepass) { + this.storepass = storepass; + } + + /** + * keystore type; optional + * + * @param storetype the keystore type + */ + public void setStoretype(final String storetype) { + this.storetype = storetype; + } + + /** + * password for private key (if different); optional + * + * @param keypass the password for the key (if different) + */ + public void setKeypass(final String keypass) { + this.keypass = keypass; + } + + /** + * Enable verbose output when signing ; optional: default false + * + * @param verbose if true enable verbose output + */ + public void setVerbose(final boolean verbose) { + this.verbose = verbose; + } + + /** + * do strict checking + * @since Ant 1.9.1 + * @param strict + */ + public void setStrict(boolean strict) { + this.strict = strict; + } + + /** + * Adds a set of files to sign + * + * @param set a set of files to sign + * @since Ant 1.4 + */ + public void addFileset(final FileSet set) { + filesets.addElement(set); + } + + /** + * Add a system property. + * + * @param sysp system property. + */ + public void addSysproperty(Environment.Variable sysp) { + sysProperties.addVariable(sysp); + } + + /** + * Adds a path of files to sign. + * + * @return a path of files to sign. + * @since Ant 1.7 + */ + public Path createPath() { + if (path == null) { + path = new Path(getProject()); + } + return path.createPath(); + } + + /** + * init processing logic; this is retained through our execution(s) + */ + protected void beginExecution() { + + redirector = createRedirector(); + } + + /** + * any cleanup logic + */ + protected void endExecution() { + redirector = null; + } + + /** + * Create the redirector to use, if any. + * + * @return a configured RedirectorElement. + */ + private RedirectorElement createRedirector() { + RedirectorElement result = new RedirectorElement(); + if (storepass != null) { + StringBuffer input = new StringBuffer(storepass).append('\n'); + if (keypass != null) { + input.append(keypass).append('\n'); + } + result.setInputString(input.toString()); + result.setLogInputString(false); + // Try to avoid showing password prompts on log output, as they would be confusing. + LineContainsRegExp filter = new LineContainsRegExp(); + RegularExpression rx = new RegularExpression(); + // TODO only handles English locale, not ja or zh_CN + rx.setPattern("^(Enter Passphrase for keystore: |Enter key password for .+: )$"); + filter.addConfiguredRegexp(rx); + filter.setNegate(true); + result.createErrorFilterChain().addLineContainsRegExp(filter); + } + return result; + } + + /** + * get the redirector. Non-null between invocations of + * {@link #beginExecution()} and {@link #endExecution()} + * @return a redirector or null + */ + public RedirectorElement getRedirector() { + return redirector; + } + + /** + * Sets the actual executable command to invoke, instead of the binary + * jarsigner found in Ant's JDK. + * @param executable the command to invoke. + * @since Ant 1.8.0 + */ + public void setExecutable(String executable) { + this.executable = executable; + } + + /** + * these are options common to signing and verifying + * @param cmd command to configure + */ + protected void setCommonOptions(final ExecTask cmd) { + if (maxMemory != null) { + addValue(cmd, "-J-Xmx" + maxMemory); + } + + if (verbose) { + addValue(cmd, "-verbose"); + } + + if (strict) { + addValue(cmd, "-strict"); + } + + //now patch in all system properties + for (Environment.Variable variable : sysProperties.getVariablesVector()) { + declareSysProperty(cmd, variable); + } + } + + /** + * + * @param cmd command to configure + * @param property property to set + * @throws BuildException if the property is not correctly defined. + */ + protected void declareSysProperty( + ExecTask cmd, Environment.Variable property) throws BuildException { + addValue(cmd, "-J-D" + property.getContent()); + } + + + /** + * bind to a keystore if the attributes are there + * @param cmd command to configure + */ + protected void bindToKeystore(final ExecTask cmd) { + if (null != keystore) { + // is the keystore a file + addValue(cmd, "-keystore"); + String loc; + File keystoreFile = getProject().resolveFile(keystore); + if (keystoreFile.exists()) { + loc = keystoreFile.getPath(); + } else { + // must be a URL - just pass as is + loc = keystore; + } + addValue(cmd, loc); + } + if (null != storetype) { + addValue(cmd, "-storetype"); + addValue(cmd, storetype); + } + } + + /** + * create the jarsigner executable task + * @return a task set up with the executable of jarsigner, failonerror=true + * and bound to our redirector + */ + protected ExecTask createJarSigner() { + final ExecTask cmd = new ExecTask(this); + if (executable == null) { + cmd.setExecutable(JavaEnvUtils.getJdkExecutable(JARSIGNER_COMMAND)); + } else { + cmd.setExecutable(executable); + } + cmd.setTaskType(JARSIGNER_COMMAND); + cmd.setFailonerror(true); + cmd.addConfiguredRedirector(redirector); + return cmd; + } + + /** + * clone our filesets vector, and patch in the jar attribute as a new + * fileset, if is defined + * @return a vector of FileSet instances + */ + protected Vector createUnifiedSources() { + @SuppressWarnings("unchecked") + Vector sources = (Vector) filesets.clone(); + if (jar != null) { + //we create a fileset with the source file. + //this lets us combine our logic for handling output directories, + //mapping etc. + FileSet sourceJar = new FileSet(); + sourceJar.setProject(getProject()); + sourceJar.setFile(jar); + sourceJar.setDir(jar.getParentFile()); + sources.add(sourceJar); + } + return sources; + } + + /** + * clone our path and add all explicitly specified FileSets as + * well, patch in the jar attribute as a new fileset if it is + * defined. + * @return a path that contains all files to sign + * @since Ant 1.7 + */ + protected Path createUnifiedSourcePath() { + Path p = path == null ? new Path(getProject()) : (Path) path.clone(); + for (FileSet fileSet : createUnifiedSources()) { + p.add(fileSet); + } + return p; + } + + /** + * Has either a path or a fileset been specified? + * @return true if a path or fileset has been specified. + * @since Ant 1.7 + */ + protected boolean hasResources() { + return path != null || filesets.size() > 0; + } + + /** + * add a value argument to a command + * @param cmd command to manipulate + * @param value value to add + */ + protected void addValue(final ExecTask cmd, String value) { + cmd.createArg().setValue(value); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Ant.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Ant.java new file mode 100644 index 00000000..eba4731a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Ant.java @@ -0,0 +1,836 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.taskdefs; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.lang.reflect.Method; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Set; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.MagicNames; +import org.apache.tools.ant.Main; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; +import org.apache.tools.ant.ProjectHelper; +import org.apache.tools.ant.Target; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.types.PropertySet; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.VectorSet; + +/** + * Build a sub-project. + * + *
    + *  <target name="foo" depends="init">
    + *    <ant antfile="build.xml" target="bar" >
    + *      <property name="property1" value="aaaaa" />
    + *      <property name="foo" value="baz" />
    + *    </ant>
    + *  </target>
    + *
    + *  <target name="bar" depends="init">
    + *    <echo message="prop is ${property1} ${foo}" />
    + *  </target>
    + * 
    + * + * + * @since Ant 1.1 + * + * @ant.task category="control" + */ +public class Ant extends Task { + + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** the basedir where is executed the build file */ + private File dir = null; + + /** + * the build.xml file (can be absolute) in this case dir will be + * ignored + */ + private String antFile = null; + + /** the output */ + private String output = null; + + /** should we inherit properties from the parent ? */ + private boolean inheritAll = true; + + /** should we inherit references from the parent ? */ + private boolean inheritRefs = false; + + /** the properties to pass to the new project */ + private Vector properties = new Vector(); + + /** the references to pass to the new project */ + private Vector references = new Vector(); + + /** the temporary project created to run the build file */ + private Project newProject; + + /** The stream to which output is to be written. */ + private PrintStream out = null; + + /** the sets of properties to pass to the new project */ + private Vector propertySets = new Vector(); + + /** the targets to call on the new project */ + private Vector targets = new Vector(); + + /** whether the target attribute was specified **/ + private boolean targetAttributeSet = false; + + /** + * Whether the basedir of the new project should be the same one + * as it would be when running the build file directly - + * independent of dir and/or inheritAll settings. + * + * @since Ant 1.8.0 + */ + private boolean useNativeBasedir = false; + + /** + * simple constructor + */ + public Ant() { + //default + } + + /** + * create a task bound to its creator + * @param owner owning task + */ + public Ant(Task owner) { + bindToOwner(owner); + } + + /** + * Whether the basedir of the new project should be the same one + * as it would be when running the build file directly - + * independent of dir and/or inheritAll settings. + * + * @since Ant 1.8.0 + */ + public void setUseNativeBasedir(boolean b) { + useNativeBasedir = b; + } + + /** + * If true, pass all properties to the new Ant project. + * Defaults to true. + * @param value if true pass all properties to the new Ant project. + */ + public void setInheritAll(boolean value) { + inheritAll = value; + } + + /** + * If true, pass all references to the new Ant project. + * Defaults to false. + * @param value if true, pass all references to the new Ant project + */ + public void setInheritRefs(boolean value) { + inheritRefs = value; + } + + /** + * Creates a Project instance for the project to call. + */ + public void init() { + newProject = getProject().createSubProject(); + newProject.setJavaVersionProperty(); + } + + /** + * Called in execute or createProperty (via getNewProject()) + * if newProject is null. + * + *

    This can happen if the same instance of this task is run + * twice as newProject is set to null at the end of execute (to + * save memory and help the GC).

    + *

    calls init() again

    + * + */ + private void reinit() { + init(); + } + + /** + * Attaches the build listeners of the current project to the new + * project, configures a possible logfile, transfers task and + * data-type definitions, transfers properties (either all or just + * the ones specified as user properties to the current project, + * depending on inheritall), transfers the input handler. + */ + private void initializeProject() { + newProject.setInputHandler(getProject().getInputHandler()); + + Iterator iter = getBuildListeners(); + while (iter.hasNext()) { + newProject.addBuildListener((BuildListener) iter.next()); + } + + if (output != null) { + File outfile = null; + if (dir != null) { + outfile = FILE_UTILS.resolveFile(dir, output); + } else { + outfile = getProject().resolveFile(output); + } + try { + out = new PrintStream(new FileOutputStream(outfile)); + DefaultLogger logger = new DefaultLogger(); + logger.setMessageOutputLevel(Project.MSG_INFO); + logger.setOutputPrintStream(out); + logger.setErrorPrintStream(out); + newProject.addBuildListener(logger); + } catch (IOException ex) { + log("Ant: Can't set output to " + output); + } + } + // set user-defined properties + if (useNativeBasedir) { + addAlmostAll(getProject().getUserProperties(), PropertyType.USER); + } else { + getProject().copyUserProperties(newProject); + } + + if (!inheritAll) { + // set Ant's built-in properties separately, + // because they are not being inherited. + newProject.initProperties(); + + } else { + // set all properties from calling project + addAlmostAll(getProject().getProperties(), PropertyType.PLAIN); + } + + for (PropertySet ps : propertySets) { + addAlmostAll(ps.getProperties(), PropertyType.PLAIN); + } + } + + /** + * Handles output. + * Send it the the new project if is present, otherwise + * call the super class. + * @param outputToHandle The string output to output. + * @see Task#handleOutput(String) + * @since Ant 1.5 + */ + public void handleOutput(String outputToHandle) { + if (newProject != null) { + newProject.demuxOutput(outputToHandle, false); + } else { + super.handleOutput(outputToHandle); + } + } + + /** + * Handles input. + * Delegate to the created project, if present, otherwise + * call the super class. + * @param buffer the buffer into which data is to be read. + * @param offset the offset into the buffer at which data is stored. + * @param length the amount of data to read. + * + * @return the number of bytes read. + * + * @exception IOException if the data cannot be read. + * @see Task#handleInput(byte[], int, int) + * @since Ant 1.6 + */ + public int handleInput(byte[] buffer, int offset, int length) + throws IOException { + if (newProject != null) { + return newProject.demuxInput(buffer, offset, length); + } + return super.handleInput(buffer, offset, length); + } + + /** + * Handles output. + * Send it the the new project if is present, otherwise + * call the super class. + * @param toFlush The string to output. + * @see Task#handleFlush(String) + * @since Ant 1.5.2 + */ + public void handleFlush(String toFlush) { + if (newProject != null) { + newProject.demuxFlush(toFlush, false); + } else { + super.handleFlush(toFlush); + } + } + + /** + * Handle error output. + * Send it the the new project if is present, otherwise + * call the super class. + * @param errorOutputToHandle The string to output. + * + * @see Task#handleErrorOutput(String) + * @since Ant 1.5 + */ + public void handleErrorOutput(String errorOutputToHandle) { + if (newProject != null) { + newProject.demuxOutput(errorOutputToHandle, true); + } else { + super.handleErrorOutput(errorOutputToHandle); + } + } + + /** + * Handle error output. + * Send it the the new project if is present, otherwise + * call the super class. + * @param errorOutputToFlush The string to output. + * @see Task#handleErrorFlush(String) + * @since Ant 1.5.2 + */ + public void handleErrorFlush(String errorOutputToFlush) { + if (newProject != null) { + newProject.demuxFlush(errorOutputToFlush, true); + } else { + super.handleErrorFlush(errorOutputToFlush); + } + } + + /** + * Do the execution. + * @throws BuildException if a target tries to call itself; + * probably also if a BuildException is thrown by the new project. + */ + public void execute() throws BuildException { + File savedDir = dir; + String savedAntFile = antFile; + Vector locals = new VectorSet(targets); + try { + getNewProject(); + + if (dir == null && inheritAll) { + dir = getProject().getBaseDir(); + } + + initializeProject(); + + if (dir != null) { + if (!useNativeBasedir) { + newProject.setBaseDir(dir); + if (savedDir != null) { + // has been set explicitly + newProject.setInheritedProperty(MagicNames.PROJECT_BASEDIR, + dir.getAbsolutePath()); + } + } + } else { + dir = getProject().getBaseDir(); + } + + overrideProperties(); + + if (antFile == null) { + antFile = getDefaultBuildFile(); + } + + File file = FILE_UTILS.resolveFile(dir, antFile); + antFile = file.getAbsolutePath(); + + log("calling target(s) " + + ((locals.size() > 0) ? locals.toString() : "[default]") + + " in build file " + antFile, Project.MSG_VERBOSE); + newProject.setUserProperty(MagicNames.ANT_FILE , antFile); + + String thisAntFile = getProject().getProperty(MagicNames.ANT_FILE); + // Are we trying to call the target in which we are defined (or + // the build file if this is a top level task)? + if (thisAntFile != null + && file.equals(getProject().resolveFile(thisAntFile)) + && getOwningTarget() != null) { + + if (getOwningTarget().getName().equals("")) { + if (getTaskName().equals("antcall")) { + throw new BuildException("antcall must not be used at" + + " the top level."); + } + throw new BuildException(getTaskName() + " task at the" + + " top level must not invoke" + + " its own build file."); + } + } + + try { + ProjectHelper.configureProject(newProject, file); + } catch (BuildException ex) { + throw ProjectHelper.addLocationToBuildException( + ex, getLocation()); + } + + if (locals.size() == 0) { + String defaultTarget = newProject.getDefaultTarget(); + if (defaultTarget != null) { + locals.add(defaultTarget); + } + } + + if (newProject.getProperty(MagicNames.ANT_FILE) + .equals(getProject().getProperty(MagicNames.ANT_FILE)) + && getOwningTarget() != null) { + + String owningTargetName = getOwningTarget().getName(); + + if (locals.contains(owningTargetName)) { + throw new BuildException(getTaskName() + " task calling " + + "its own parent target."); + } + boolean circular = false; + for (Iterator it = locals.iterator(); + !circular && it.hasNext();) { + Target other = + getProject().getTargets().get(it.next()); + circular |= (other != null + && other.dependsOn(owningTargetName)); + } + if (circular) { + throw new BuildException(getTaskName() + + " task calling a target" + + " that depends on" + + " its parent target \'" + + owningTargetName + + "\'."); + } + } + + addReferences(); + + if (locals.size() > 0 && !(locals.size() == 1 + && "".equals(locals.get(0)))) { + BuildException be = null; + try { + log("Entering " + antFile + "...", Project.MSG_VERBOSE); + newProject.fireSubBuildStarted(); + newProject.executeTargets(locals); + } catch (BuildException ex) { + be = ProjectHelper + .addLocationToBuildException(ex, getLocation()); + throw be; + } finally { + log("Exiting " + antFile + ".", Project.MSG_VERBOSE); + newProject.fireSubBuildFinished(be); + } + } + } finally { + // help the gc + newProject = null; + for (Property p : properties) { + p.setProject(null); + } + + if (output != null && out != null) { + try { + out.close(); + } catch (final Exception ex) { + //ignore + } + } + dir = savedDir; + antFile = savedAntFile; + } + } + + /** + * Get the default build file name to use when launching the task. + *

    + * This function may be overrided by providers of custom ProjectHelper so they can implement easily their sub + * launcher. + * + * @return the name of the default file + * @since Ant 1.8.0 + */ + protected String getDefaultBuildFile() { + return Main.DEFAULT_BUILD_FILENAME; + } + + /** + * Override the properties in the new project with the one + * explicitly defined as nested elements here. + * @throws BuildException under unknown circumstances. + */ + private void overrideProperties() throws BuildException { + // remove duplicate properties - last property wins + // Needed for backward compatibility + Set set = new HashSet(); + for (int i = properties.size() - 1; i >= 0; --i) { + Property p = properties.get(i); + if (p.getName() != null && !p.getName().equals("")) { + if (set.contains(p.getName())) { + properties.remove(i); + } else { + set.add(p.getName()); + } + } + } + Enumeration e = properties.elements(); + while (e.hasMoreElements()) { + Property p = e.nextElement(); + p.setProject(newProject); + p.execute(); + } + if (useNativeBasedir) { + addAlmostAll(getProject().getInheritedProperties(), + PropertyType.INHERITED); + } else { + getProject().copyInheritedProperties(newProject); + } + } + + /** + * Add the references explicitly defined as nested elements to the + * new project. Also copy over all references that don't override + * existing references in the new project if inheritrefs has been + * requested. + * @throws BuildException if a reference does not have a refid. + */ + private void addReferences() throws BuildException { + @SuppressWarnings("unchecked") + Hashtable thisReferences + = (Hashtable) getProject().getReferences().clone(); + for (Reference ref : references) { + String refid = ref.getRefId(); + if (refid == null) { + throw new BuildException("the refid attribute is required" + + " for reference elements"); + } + if (!thisReferences.containsKey(refid)) { + log("Parent project doesn't contain any reference '" + + refid + "'", + Project.MSG_WARN); + continue; + } + + thisReferences.remove(refid); + String toRefid = ref.getToRefid(); + if (toRefid == null) { + toRefid = refid; + } + copyReference(refid, toRefid); + } + + // Now add all references that are not defined in the + // subproject, if inheritRefs is true + if (inheritRefs) { + Hashtable newReferences = newProject.getReferences(); + for (String key : thisReferences.keySet()) { + if (newReferences.containsKey(key)) { + continue; + } + copyReference(key, key); + newProject.inheritIDReferences(getProject()); + } + } + } + + /** + * Try to clone and reconfigure the object referenced by oldkey in + * the parent project and add it to the new project with the key newkey. + * + *

    If we cannot clone it, copy the referenced object itself and + * keep our fingers crossed.

    + * @param oldKey the reference id in the current project. + * @param newKey the reference id in the new project. + */ + private void copyReference(String oldKey, String newKey) { + Object orig = getProject().getReference(oldKey); + if (orig == null) { + log("No object referenced by " + oldKey + ". Can't copy to " + + newKey, + Project.MSG_WARN); + return; + } + + Class c = orig.getClass(); + Object copy = orig; + try { + Method cloneM = c.getMethod("clone", new Class[0]); + if (cloneM != null) { + copy = cloneM.invoke(orig, new Object[0]); + log("Adding clone of reference " + oldKey, Project.MSG_DEBUG); + } + } catch (Exception e) { + // not Clonable + } + + + if (copy instanceof ProjectComponent) { + ((ProjectComponent) copy).setProject(newProject); + } else { + try { + Method setProjectM = + c.getMethod("setProject", new Class[] {Project.class}); + if (setProjectM != null) { + setProjectM.invoke(copy, new Object[] {newProject}); + } + } catch (NoSuchMethodException e) { + // ignore this if the class being referenced does not have + // a set project method. + } catch (Exception e2) { + String msg = "Error setting new project instance for " + + "reference with id " + oldKey; + throw new BuildException(msg, e2, getLocation()); + } + } + newProject.addReference(newKey, copy); + } + + /** + * Copies all properties from the given table to the new project - + * omitting those that have already been set in the new project as + * well as properties named basedir or ant.file. + * @param props properties Hashtable to copy to the + * new project. + * @param the type of property to set (a plain Ant property, a + * user property or an inherited property). + * @since Ant 1.8.0 + */ + private void addAlmostAll(Hashtable props, PropertyType type) { + Enumeration e = props.keys(); + while (e.hasMoreElements()) { + String key = e.nextElement().toString(); + if (MagicNames.PROJECT_BASEDIR.equals(key) + || MagicNames.ANT_FILE.equals(key)) { + // basedir and ant.file get special treatment in execute() + continue; + } + + String value = props.get(key).toString(); + if (type == PropertyType.PLAIN) { + // don't re-set user properties, avoid the warning message + if (newProject.getProperty(key) == null) { + // no user property + newProject.setNewProperty(key, value); + } + } else if (type == PropertyType.USER) { + newProject.setUserProperty(key, value); + } else if (type == PropertyType.INHERITED) { + newProject.setInheritedProperty(key, value); + } + } + } + + /** + * The directory to use as a base directory for the new Ant project. + * Defaults to the current project's basedir, unless inheritall + * has been set to false, in which case it doesn't have a default + * value. This will override the basedir setting of the called project. + * @param dir new directory as File. + */ + public void setDir(File dir) { + this.dir = dir; + } + + /** + * The build file to use. Defaults to "build.xml". This file is expected + * to be a filename relative to the dir attribute given. + * @param antFile the String build file name. + */ + public void setAntfile(String antFile) { + // @note: it is a string and not a file to handle relative/absolute + // otherwise a relative file will be resolved based on the current + // basedir. + this.antFile = antFile; + } + + /** + * The target of the new Ant project to execute. + * Defaults to the new project's default target. + * @param targetToAdd the name of the target to invoke. + */ + public void setTarget(String targetToAdd) { + if (targetToAdd.equals("")) { + throw new BuildException("target attribute must not be empty"); + } + targets.add(targetToAdd); + targetAttributeSet = true; + } + + /** + * Set the filename to write the output to. This is relative to the value + * of the dir attribute if it has been set or to the base directory of the + * current project otherwise. + * @param outputFile the name of the file to which the output should go. + */ + public void setOutput(String outputFile) { + this.output = outputFile; + } + + /** + * Property to pass to the new project. + * The property is passed as a 'user property'. + * @return the created Property object. + */ + public Property createProperty() { + Property p = new Property(true, getProject()); + p.setProject(getNewProject()); + p.setTaskName("property"); + properties.addElement(p); + return p; + } + + /** + * Add a Reference element identifying a data type to carry + * over to the new project. + * @param ref Reference to add. + */ + public void addReference(Reference ref) { + references.addElement(ref); + } + + /** + * Add a target to this Ant invocation. + * @param t the TargetElement to add. + * @since Ant 1.6.3 + */ + public void addConfiguredTarget(TargetElement t) { + if (targetAttributeSet) { + throw new BuildException( + "nested target is incompatible with the target attribute"); + } + String name = t.getName(); + if (name.equals("")) { + throw new BuildException("target name must not be empty"); + } + targets.add(name); + } + + /** + * Add a set of properties to pass to the new project. + * + * @param ps PropertySet to add. + * @since Ant 1.6 + */ + public void addPropertyset(PropertySet ps) { + propertySets.addElement(ps); + } + + /** + * Get the (sub)-Project instance currently in use. + * @return Project + * @since Ant 1.7 + */ + protected Project getNewProject() { + if (newProject == null) { + reinit(); + } + return newProject; + } + + /** + * @since Ant 1.6.2 + */ + private Iterator getBuildListeners() { + return getProject().getBuildListeners().iterator(); + } + + /** + * Helper class that implements the nested <reference> + * element of <ant> and <antcall>. + */ + public static class Reference + extends org.apache.tools.ant.types.Reference { + + /** Creates a reference to be configured by Ant. */ + public Reference() { + super(); + } + + private String targetid = null; + + /** + * Set the id that this reference to be stored under in the + * new project. + * + * @param targetid the id under which this reference will be passed to + * the new project. */ + public void setToRefid(String targetid) { + this.targetid = targetid; + } + + /** + * Get the id under which this reference will be stored in the new + * project. + * + * @return the id of the reference in the new project. + */ + public String getToRefid() { + return targetid; + } + } + + /** + * Helper class that implements the nested <target> + * element of <ant> and <antcall>. + * @since Ant 1.6.3 + */ + public static class TargetElement { + private String name; + + /** + * Default constructor. + */ + public TargetElement() { + //default + } + + /** + * Set the name of this TargetElement. + * @param name the String target name. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Get the name of this TargetElement. + * @return String. + */ + public String getName() { + return name; + } + } + + private static final class PropertyType { + private PropertyType() {} + private static final PropertyType PLAIN = new PropertyType(); + private static final PropertyType INHERITED = new PropertyType(); + private static final PropertyType USER = new PropertyType(); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntStructure.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntStructure.java new file mode 100644 index 00000000..20f811a8 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntStructure.java @@ -0,0 +1,485 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.taskdefs; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.IntrospectionHelper; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.TaskContainer; +import org.apache.tools.ant.types.EnumeratedAttribute; +import org.apache.tools.ant.types.Reference; + +/** + * Creates a partial DTD for Ant from the currently known tasks. + * + * + * @since Ant 1.1 + * + * @ant.task category="xml" + */ +public class AntStructure extends Task { + + private static final String LINE_SEP + = System.getProperty("line.separator"); + + private File output; + private StructurePrinter printer = new DTDPrinter(); + + /** + * The output file. + * @param output the output file + */ + public void setOutput(final File output) { + this.output = output; + } + + /** + * The StructurePrinter to use. + * @param p the printer to use. + * @since Ant 1.7 + */ + public void add(final StructurePrinter p) { + printer = p; + } + + /** + * Build the antstructure DTD. + * + * @exception BuildException if the DTD cannot be written. + */ + @Override + public void execute() throws BuildException { + + if (output == null) { + throw new BuildException("output attribute is required", getLocation()); + } + + PrintWriter out = null; + try { + try { + out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(output), "UTF8")); + } catch (final UnsupportedEncodingException ue) { + /* + * Plain impossible with UTF8, see + * http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html + * + * fallback to platform specific anyway. + */ + out = new PrintWriter(new FileWriter(output)); + } + + printer.printHead(out, getProject(), + new Hashtable>(getProject().getTaskDefinitions()), + new Hashtable>(getProject().getDataTypeDefinitions())); + + printer.printTargetDecl(out); + + for (final String typeName : getProject().getCopyOfDataTypeDefinitions() + .keySet()) { + printer.printElementDecl( + out, getProject(), typeName, + getProject().getDataTypeDefinitions().get(typeName)); + } + + for (final String tName : getProject().getCopyOfTaskDefinitions().keySet()) { + printer.printElementDecl(out, getProject(), tName, + getProject().getTaskDefinitions().get(tName)); + } + + printer.printTail(out); + + if (out.checkError()) { + throw new IOException("Encountered an error writing Ant" + + " structure"); + } + } catch (final IOException ioe) { + throw new BuildException("Error writing " + + output.getAbsolutePath(), ioe, getLocation()); + } finally { + if (out != null) { + out.close(); + } + } + } + + /** + * Writes the actual structure information. + * + *

    {@link #printHead}, {@link #printTargetDecl} and {@link #printTail} + * are called exactly once, {@link #printElementDecl} once for + * each declared task and type.

    + */ + public interface StructurePrinter { + /** + * Prints the header of the generated output. + * + * @param out PrintWriter to write to. + * @param p Project instance for the current task + * @param tasks map (name to implementing class) + * @param types map (name to implementing class) + * data types. + */ + void printHead(PrintWriter out, Project p, Hashtable> tasks, + Hashtable> types); + + /** + * Prints the definition for the target element. + * @param out PrintWriter to write to. + */ + void printTargetDecl(PrintWriter out); + + /** + * Print the definition for a given element. + * + * @param out PrintWriter to write to. + * @param p Project instance for the current task + * @param name element name. + * @param element class of the defined element. + */ + void printElementDecl(PrintWriter out, Project p, String name, + Class element); + + /** + * Prints the trailer. + * @param out PrintWriter to write to. + */ + void printTail(PrintWriter out); + } + + private static class DTDPrinter implements StructurePrinter { + + private static final String BOOLEAN = "%boolean;"; + private static final String TASKS = "%tasks;"; + private static final String TYPES = "%types;"; + + private final Hashtable visited = new Hashtable(); + + public void printTail(final PrintWriter out) { + visited.clear(); + } + + public void printHead(final PrintWriter out, final Project p, final Hashtable> tasks, + final Hashtable> types) { + printHead(out, tasks.keys(), types.keys()); + } + + + /** + * Prints the header of the generated output. + * + *

    Basically this prints the XML declaration, defines some + * entities and the project element.

    + */ + private void printHead(final PrintWriter out, final Enumeration tasks, + final Enumeration types) { + out.println(""); + out.println(""); + out.print(""); + out.print(""); + + out.println(""); + + out.print(""); + out.println(""); + out.println(""); + } + + /** + * Prints the definition for the target element. + */ + public void printTargetDecl(final PrintWriter out) { + out.print(""); + out.println(""); + printTargetAttrs(out, "target"); + out.println(""); + out.println(""); + printTargetAttrs(out, "extension-point"); + } + + /** + * Prints the definition for the target element. + */ + private void printTargetAttrs(final PrintWriter out, final String tag) { + out.print(""); + out.println(""); + } + + /** + * Print the definition for a given element. + */ + public void printElementDecl(final PrintWriter out, final Project p, + final String name, final Class element) { + + if (visited.containsKey(name)) { + return; + } + visited.put(name, ""); + + IntrospectionHelper ih = null; + try { + ih = IntrospectionHelper.getHelper(p, element); + } catch (final Throwable t) { + /* + * TODO - failed to load the class properly. + * + * should we print a warning here? + */ + return; + } + + StringBuffer sb = new StringBuffer("").append(LINE_SEP); + sb.append("").append(LINE_SEP); + out.println(sb); + return; + } + + final Vector v = new Vector(); + if (ih.supportsCharacters()) { + v.addElement("#PCDATA"); + } + + if (TaskContainer.class.isAssignableFrom(element)) { + v.addElement(TASKS); + } + + Enumeration e = ih.getNestedElements(); + while (e.hasMoreElements()) { + v.addElement(e.nextElement()); + } + + if (v.isEmpty()) { + sb.append("EMPTY"); + } else { + sb.append("("); + final int count = v.size(); + for (int i = 0; i < count; i++) { + if (i != 0) { + sb.append(" | "); + } + sb.append(v.elementAt(i)); + } + sb.append(")"); + if (count > 1 || !v.elementAt(0).equals("#PCDATA")) { + sb.append("*"); + } + } + sb.append(">"); + out.println(sb); + + sb = new StringBuffer(" type = ih.getAttributeType(attrName); + if (type.equals(java.lang.Boolean.class) + || type.equals(java.lang.Boolean.TYPE)) { + sb.append(BOOLEAN).append(" "); + } else if (Reference.class.isAssignableFrom(type)) { + sb.append("IDREF "); + } else if (EnumeratedAttribute.class.isAssignableFrom(type)) { + try { + final EnumeratedAttribute ea = + (EnumeratedAttribute) type.newInstance(); + final String[] values = ea.getValues(); + if (values == null + || values.length == 0 + || !areNmtokens(values)) { + sb.append("CDATA "); + } else { + sb.append("("); + for (int i = 0; i < values.length; i++) { + if (i != 0) { + sb.append(" | "); + } + sb.append(values[i]); + } + sb.append(") "); + } + } catch (final InstantiationException ie) { + sb.append("CDATA "); + } catch (final IllegalAccessException ie) { + sb.append("CDATA "); + } + } else if (type.getSuperclass() != null + && type.getSuperclass().getName().equals("java.lang.Enum")) { + try { + final Object[] values = (Object[]) type.getMethod("values", (Class[]) null) + .invoke(null, (Object[]) null); + if (values.length == 0) { + sb.append("CDATA "); + } else { + sb.append('('); + for (int i = 0; i < values.length; i++) { + if (i != 0) { + sb.append(" | "); + } + sb.append(type.getMethod("name", (Class[]) null) + .invoke(values[i], (Object[]) null)); + } + sb.append(") "); + } + } catch (final Exception x) { + sb.append("CDATA "); + } + } else { + sb.append("CDATA "); + } + sb.append("#IMPLIED"); + } + sb.append(">").append(LINE_SEP); + out.println(sb); + + final int count = v.size(); + for (int i = 0; i < count; i++) { + final String nestedName = v.elementAt(i); + if (!"#PCDATA".equals(nestedName) + && !TASKS.equals(nestedName) + && !TYPES.equals(nestedName)) { + printElementDecl(out, p, nestedName, ih.getElementType(nestedName)); + } + } + } + + /** + * Does this String match the XML-NMTOKEN production? + * @param s the string to test + * @return true if the string matches the XML-NMTOKEN + */ + public static final boolean isNmtoken(final String s) { + final int length = s.length(); + for (int i = 0; i < length; i++) { + final char c = s.charAt(i); + // TODO - we are committing CombiningChar and Extender here + if (!Character.isLetterOrDigit(c) + && c != '.' && c != '-' && c != '_' && c != ':') { + return false; + } + } + return true; + } + + /** + * Do the Strings all match the XML-NMTOKEN production? + * + *

    Otherwise they are not suitable as an enumerated attribute, + * for example.

    + * @param s the array of string to test + * @return true if all the strings in the array math XML-NMTOKEN + */ + public static final boolean areNmtokens(final String[] s) { + for (int i = 0; i < s.length; i++) { + if (!isNmtoken(s[i])) { + return false; + } + } + return true; + } + } + + /** + * Does this String match the XML-NMTOKEN production? + * @param s the string to test + * @return true if the string matches the XML-NMTOKEN + */ + protected boolean isNmtoken(final String s) { + return DTDPrinter.isNmtoken(s); + } + + /** + * Do the Strings all match the XML-NMTOKEN production? + * + *

    Otherwise they are not suitable as an enumerated attribute, + * for example.

    + * @param s the array of string to test + * @return true if all the strings in the array math XML-NMTOKEN + */ + protected boolean areNmtokens(final String[] s) { + return DTDPrinter.areNmtokens(s); + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java new file mode 100644 index 00000000..8ff836a3 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Antlib.java @@ -0,0 +1,184 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.taskdefs; + +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.ComponentHelper; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectHelper; +import org.apache.tools.ant.ProjectHelperRepository; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.TaskContainer; +import org.apache.tools.ant.UnknownElement; +import org.apache.tools.ant.types.resources.URLResource; + + +/** + * Antlib task. It does not + * occur in an ant build file. It is the root element + * an antlib xml file. + * + * @since Ant 1.6 + */ +public class Antlib extends Task implements TaskContainer { + // + // Static + // + + /** The name of this task */ + public static final String TAG = "antlib"; + + /** + * Static method to read an ant lib definition from + * a url. + * + * @param project the current project + * @param antlibUrl the url to read the definitions from + * @param uri the uri that the antlib is to be placed in + * @return the ant lib task + */ + public static Antlib createAntlib(Project project, URL antlibUrl, + String uri) { + // Check if we can contact the URL + try { + URLConnection conn = antlibUrl.openConnection(); + conn.setUseCaches(false); + conn.connect(); + } catch (IOException ex) { + throw new BuildException( + "Unable to find " + antlibUrl, ex); + } + ComponentHelper helper = + ComponentHelper.getComponentHelper(project); + helper.enterAntLib(uri); + URLResource antlibResource = new URLResource(antlibUrl); + try { + // Should be safe to parse + ProjectHelper parser = null; + Object p = + project.getReference(ProjectHelper.PROJECTHELPER_REFERENCE); + if (p instanceof ProjectHelper) { + parser = (ProjectHelper) p; + if (!parser.canParseAntlibDescriptor(antlibResource)) { + parser = null; + } + } + if (parser == null) { + ProjectHelperRepository helperRepository = + ProjectHelperRepository.getInstance(); + parser = helperRepository.getProjectHelperForAntlib(antlibResource); + } + UnknownElement ue = + parser.parseAntlibDescriptor(project, antlibResource); + // Check name is "antlib" + if (!(ue.getTag().equals(TAG))) { + throw new BuildException( + "Unexpected tag " + ue.getTag() + " expecting " + + TAG, ue.getLocation()); + } + Antlib antlib = new Antlib(); + antlib.setProject(project); + antlib.setLocation(ue.getLocation()); + antlib.setTaskName("antlib"); + antlib.init(); + ue.configure(antlib); + return antlib; + } finally { + helper.exitAntLib(); + } + } + + // + // Instance + // + private ClassLoader classLoader; + private String uri = ""; + private List tasks = new ArrayList(); + + /** + * Set the class loader for this antlib. + * This class loader is used for any tasks that + * derive from Definer. + * + * @param classLoader the class loader + */ + protected void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + /** + * Set the URI for this antlib. + * @param uri the namespace uri + */ + protected void setURI(String uri) { + this.uri = uri; + } + + private ClassLoader getClassLoader() { + if (classLoader == null) { + classLoader = Antlib.class.getClassLoader(); + } + return classLoader; + } + + /** + * add a task to the list of tasks + * + * @param nestedTask Nested task to execute in antlib + */ + public void addTask(Task nestedTask) { + tasks.add(nestedTask); + } + + /** + * Execute the nested tasks, setting the classloader for + * any tasks that derive from Definer. + */ + public void execute() { + //TODO handle tasks added via #addTask() + for (Iterator i = tasks.iterator(); i.hasNext();) { + UnknownElement ue = (UnknownElement) i.next(); + setLocation(ue.getLocation()); + ue.maybeConfigure(); + Object configuredObject = ue.getRealThing(); + if (configuredObject == null) { + continue; + } + if (!(configuredObject instanceof AntlibDefinition)) { + throw new BuildException( + "Invalid task in antlib " + ue.getTag() + + " " + configuredObject.getClass() + " does not " + + "extend org.apache.tools.ant.taskdefs.AntlibDefinition"); + } + AntlibDefinition def = (AntlibDefinition) configuredObject; + def.setURI(uri); + def.setAntlibClassLoader(getClassLoader()); + def.init(); + def.execute(); + } + } + +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntlibDefinition.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntlibDefinition.java new file mode 100644 index 00000000..eef33345 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/AntlibDefinition.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ + +package org.apache.tools.ant.taskdefs; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.ProjectHelper; +import org.apache.tools.ant.Task; + +/** + * Base class for tasks that that can be used in antlibs. + * For handling uri and class loading. + * + * @since Ant 1.6 + */ +public class AntlibDefinition extends Task { + + private String uri = ""; + private ClassLoader antlibClassLoader; + + /** + * The URI for this definition. + * If the URI is "antlib:org.apache.tools.ant", + * (this is the default uri) + * the uri will be set to "". + * URIs that start with "ant:" are reserved + * and are not allowed in this context. + * @param uri the namespace URI + * @throws BuildException if a reserved URI is used + */ + public void setURI(String uri) throws BuildException { + if (uri.equals(ProjectHelper.ANT_CORE_URI)) { + uri = ""; + } + if (uri.startsWith("ant:")) { + throw new BuildException("Attempt to use a reserved URI " + uri); + } + this.uri = uri; + } + + /** + * The URI for this definition. + * @return The URI for this definition. + */ + public String getURI() { + return uri; + } + + /** + * Set the class loader of the loading object + * + * @param classLoader a ClassLoader value + */ + public void setAntlibClassLoader(ClassLoader classLoader) { + this.antlibClassLoader = classLoader; + } + + /** + * The current antlib classloader + * @return the antlib classloader for the definition, this + * is null if the definition is not used in an antlib. + */ + public ClassLoader getAntlibClassLoader() { + return antlibClassLoader; + } +} diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Apt.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Apt.java new file mode 100644 index 00000000..52154a8c --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/Apt.java @@ -0,0 +1,270 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + * + */ +package org.apache.tools.ant.taskdefs; + +import java.io.File; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.compilers.AptExternalCompilerAdapter; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.Reference; +import org.apache.tools.ant.util.JavaEnvUtils; + +/** + * Apt Task for running the Annotation processing tool for JDK 1.5. It derives + * from the existing Javac task, and forces the compiler based on whether we're + * executing internally, or externally. + * + * @since Ant 1.7 + */ + + +public class Apt + extends Javac { + private boolean compile = true; + private String factory; + private Path factoryPath; + private Vector

    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 QbZI+L0nnT=^WqgcH7Oh=*}tRBt^Z9l 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 z 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

    PV% zh3r##8|UvWx;2-b&0XK-)l*fW*)}Eyf-^k$cE7=viNiS)11t877u8a1yfD50en14- zcUQ7%=7vqT`;<=LgcCjCDcpaypWRM0Nc;K>=`2SY)&_=Yy_aTw$}#iNQzH+#1DYc@}ST*j6PangG&}P1Zmamb(l-y(3D)BQx?`*t^_uGK1dq3&-dG12%)4lf=5c z)yD%*nAgRAMjkUha+-lhA_Bor?v>Y6$XWmM9jUWniflgX@I_ zd!D?g^UuK}M!~ZnGN{$oumO{tE#C7$|C2M{p&DY?bWt%24lKvwBp^g@u3PT(2ODx*KXdgppFVfw(X}kRB5QK-lW~ zNn+{2u+=vklUYBmDSB|=aGC(aP|FoW`lg)mho1siepw|92tq*6cM-)emB3J=v?VX! z2{A(a$i&~|0tx_@6WqM!|K0I1;QDPY#=!U~^SNbjmWzFwib(~G6L48;TORTXlGsV5UEP zK;%r=w644N(U9owkDpdUpFO|%9lBsaoNNh8%Op*a;qjr1tdV~EQHAk8rizJ5C3y}) z8xHnrDEcMn_j9z*mt1f}hFz_mR7R>t?b8TSK{rmkGc{36PVNPx8?DQ~&9dTrJn0V} z;yN*cO(TW);qAiCt@gPrAyQl@N%#x+6By31gG^T<;S72jMbD~=DVI4ssh zs&63!8BU)pff|~)NcK~FJdl-7fYZdwG9UJnDXrp!)o%IGA+jAaL)m3|N=dC+?~c*2 z=q8o7rHed6TKdd8wG@*bd$iRbL;);~|A0_X`=W}Fk4AYw?cH(f^@H)SBXcde{op1I z3U6vB+%CaztPB0@-37wv_OZq@)SaftT>Ta*t3A zZNIr4nhg#joC?(8P_n&(%jEQ7rUe#AX=JQ!ihxnt^`7>&)_9@KT|fa#w4cqpA14UA zAQr5GmvH;^lzr^3&2p+W~r!>+W;`Lvutc^pWiZVsY%A}1) zGybU?_N-Lzn5t}2gosGAl=(AmK|}ysIS4q#Jt<~9g;Oa^^-v7UV>uy~qSD7#%S>rM z6LR9Q2#yCYCY-BhNVMLJSP(atx@R&{V>{ajVO#?kHH42zUlFaSppIa4qWcker$%3$x>`wami%0f{BaLUg zFsSf>nc}-O-C&LAg*_~|0)RV)Wf9U6eq9(`uSq((G@ucfCwTEDi@{`kk|# zc~c*!UZcSth?f_VisT$P%}deLH+3Tep{pqa;UJ9?Fb|*7mQe*XcpuGjK7yv&&5keo zaICxW+@O|ApvG@WVU%M+Pr%Dy(CJUSm^r$6N3v;_@|x@6g~ZilP_J9j_17Q z_}ekr&sD~G`fRCwPdD%IFNFYu?wg!1I8Wq_9e-Y<@r?uA+f6H4aYCWM!1kq8OpZ1k zcoor>Yu=@Cw|0>yN}R5Huwm;q0{e`zyVT_U;!+uM*d?@)SsSSTml?`hIE>Ia`FUrN z*1G7Z6am$zCq#U2^gj}2SWuGIF0K?1wBM{`7kbuWEJho41K`K>3)ymc0XgaE0iYo7 z4K9d3-7Uh~`wbhP{Yu|V!qU>#HLjE&@37N{F<`f+$-xZI?{ZPp z+%zFXj!(Q_D5^7N+Xk+^u|zty%3tbj#+F1VrQ-k^i)ux-gK*k(ik@0)ZOc8(ZRa5+ za0hDaB69kWp;`L^Obu-4CXb8DolxE$K-f$Pl%VeS?s3WvFufvsjxiVLGrgdzUs}Kw zbdHVWR$b0ovtK?{nUqmpg1D)nQ+)BHs_>)OC_*F}(_wXXr3zLXwB@Jbc<84%pEr}XPt;0^uzYQ{S~ZiW%nPTHN7CeNnUMH3hmM4ni0rOs6tUP z7XY(FYRMcp4^&}EDSP!@5nLN(f%D&u40HYVklK`Pyr{cNuV5{w~g^+ zQDBV9?Vz-7BqwZT(^q{uXj1A3fd43x+8-u*KMo<Fzr`58=cIul8{K;H%iw4-Id`&rsR71vQr7Bz&Yq+kJ}> z8?!OXJny2nb@Bv9WzF7Ok6KVeBz^*8topyutM4t-TZ&I)&^WQbNlH6p+pj!}$zY(Z zt|Ly<36F7#n?(4)IpqV-pJYAJtiBo?s$9%E_DFle?I z`qJJo`K5H(`5=R`M2&$r2@v|Pavti^4Qo`s#|?@1Wfw+*kqpO~5IhuyDHa@zF~~La zgO`2y`J!;xN2MJ}kV#UK1;>3v-0EB(MA(#Jn7o1HBAZ|7j-mS>)m2PcO7?-1k~XX3ta{Y3GsffZ}SZMcAGV*yiy6ybGH&hx2vggBVNzQ|bk?@5d50r+sO{zhn zjn7cGpq3=;i;6!hwDmSjisFFq3KIvVy?1y0Zc~cSLttRw@;m-z_yvc-j8bgJB$@C` z1$to})1AWHG@iV$_xRZUR5a&YZpb#*1DZNg^yP4K$BIhO+_IZ+eUoAnw~uP&Fe@f4 z=7(>8wpRYr=0u9txnhh-yJ&;DK4e^E9h5#28aJG8*#2?uc>fUW?rZg06U6H*$0%GI)o$zeOa3h%9)@%sGp=8C zK31cwdx)Lwr)n=8w`5*K zPW0l?8~5|9L?978q7Y!GDVzDG9bZ0il5W zp;PklUUVgrK*kPQO8FK<^GT<0slI7v;mB^t}9g@^S z$&}=ITQJYeUXeRI{SSZ?aqfO|I~WfdI~Kbs^QYfyo{0D+^pq(h3DEik4ad>W_nA8o z09PJrirY?tD1tYCX?pO3deo@Z7BXfODNC>eJ)(+opwaVlp~gaRhqJAI zW@vb(^zf@D$AJ^J`GhwOR#@L%gSY=Bx(9;($=>oSHXrJ52L$b|Ar_vgubA?4|Gmng(y_ii{s5(PspY?uO|})QR9|w$3Ib&khXkzV?SlOKVz}e*=!k4Nro?8#GHKamuKx%M%auBP5^z3QhPb;^roL!LQ&2xIk69&#%azw zaYdz!kldgc3=v;pU;Iv6SB`b!ze3M^XaS$|M%3Q_0G+>{>b-NB@_u;4Yn$6Em7b?p zZu06FIxyTw`LDVWFZI8VPq;`X^&RwFx<5RM3~`&+ms!{tM{}328)n5zIk|)3&$k#; zHK6HW{Is_gbLRGQ+%AK$4ZGfYtcp}DM1Z)rx2pD{Qg=K#6cKX2-76#92z*_yfFW$P zId0z{$#a>Fk4@OY(T;+O(LI(U5z2fk3oUe zC5DFV8LGy+biw;D_!ahOk2bX$&BhBAQH#(h+Sgg$X`wOD=#5~@F%F>T@;~7BU*zwl za>d0BLRtF!VwG)L00a`IaOgH2gx84drK4iQm92DsTh@Po#TnZN+7&=Js4$Fc|M|1r zisOaC>NNzvici0A>Qjy;&UnFCa+ZNv{%mU$qPnk1b-H^12%d|5hrByEh#@!mMZv8s znM>$7oMfr|)f8D%*T~xzIUyjikKDO{93Kc_>=Q-HQCRMOw^V6bgc1B=@<0RF(3Rg=lWh^S5&*5$@6owP=_&62SsSjHICN?8fN>D3|tEV=EG%F|hFA1(;1w>fJL`T`50J3^DQBsfwPlqV%@nhI*4zJMAmKAQVEv)ySW@a^}J$ zXkE|t!i)6+j5l(ngr&vFm332+mjzd%-?-+amW3O!Cw=7vK8?G%O{5$!W~}KVILuN( zS3T?k0^SM_D*0{a8m|qir+h6II~_j!|SUpAP?f?vE^AN} zedQ8Q-3>MBv7PXd`ULRrwERMQzaWT|R~i~PZ=qK5kY^*UHiMVD|F6$(@A^NWZkLJ! z-Jwz1>c}s=dW^js@hsoPe6UiH;qt`_R_yT0F_W>Xwa@CgM_|pqEGQ5V4!mC5lML4&M%vT9JQ5HIR-*~2b^dp{plR5X0?Ab3T(h}!Bqk8b`*j?cvz zM~gJ(e$YJV?g)S5ut}xa410}JZM9O5ESFL5OZ+vsb;|fa?@QC8ACj(=4SA&R-YVSU zWM&)|ZOn#t<>Wqw!z>BmMTE+%pyI?b?r+L|4X zF}}!?Tto}YCkG))eki(s9q5v0CnPeG8FAwrqLtS;X}doeKDe>!s)A*og7x~eLFLr_ zz_q@e@!4Z&c@yUSqP)UE!_(R0NJ7OZN*8C+YGTr}^`P9ukdrU+su*AYbMFR=E3>&u zQ1XKek9MJ$fLhUyt9X2}Bvk%)E^ns}Gg`_@(#mxC+_s6X7d05H#WU7On&>a!`Q8!N zwJ(5&1gE!i(v7)S6)6l>?Vh{xI_!2^SSp$8UI3Wjx!ffJgq3(C zNB>mEH=?qinfVYcC0XRvP?O-7s&osxlc77?`W zPC9=J1JP(_LsX@VI0OoH`E0=*sL@-h;!u6FQed(WhE9wk#?Ox*40e0_i0*}tY@YoF ziq@QN?{JHRW6i3s+La43%8&8^fg%>g0Vj0Oh;eS&S$ky4&ePXV%JE2b4HuCYxCL0= z^Po9e`D=@+;^?&w7oK2Qka&(41>P$Vkma-4mMo_$6uzsrhV)+Isnt4-kVl1r(W+}u zJ&&a}RM#k(2=@@4|152Q_Ttyf-i=u+4SsK#330M81E5^-K}w&zv6Abr^t{C8OSBNX zPvH$KmY-xf>8*QVgzvnX>;{8Y{uJ58Q(Qpn-7hMf8c`hP`|PgSJXtTAP{;9@=Br4; zD^`1^Gv{2hY({&-zv86mCgH@u`f`~TLr^}bjV%6DXn^y;!i?<>4KgSLkE zoHz{nvds4;GpoXp%Z|YzrtfKZyE!|H9ACWzN1=*QLg#z?;Ro*r>S%F*fk9ewMx5Aq zvB*97RqRNN_a@VUwGZvvTep$j5M`*D0T)rizRSPk6D-{UjH1Dnc{WPESYa9~8)WL< z8uo1$rh|V{FF=WwIl-i!i~jOZMP2dots6E^wHsH5js{B$4`z`~J7JNbWWDqbC^WPC zndJxLBLRUAc3Uuij^BKFhOlyJFu+p8xd>O=bEv+-wSoch#u=sK1-i$__B20_z4Cl+ z)VKNFNp4ui;Cu>OABMVDr&xR5%0uspke4j7W-X5&-Ec`izp6jtyduM*C+ld<0jPpi zX4A2!Jp4h8(671^4SDHO4fUYEX7(JYI;!Mhbn`3iN%f{@%GPXmS@ck!dT;)&DvdOP zSNS>LeYEYIM>@ThCqYa~$(s)?e?Jcx;+^l<(xbfmlzzFQF8kz%3(xMBUlo_Pcy~r^ zSrR=|Roa3|p3nXj{qEwiLrnrbmx;Nb_}>-+{jRCF%uP3Jb#D`1K6%T#&kPHb169a1 zO1d{Iwurb}i2E{pGTo5JzD}Q5eI*1wo zyACCJX13MtbFQoE9G891RJT9BG^HXiL@lBHjZZ%OQ0;!75%;K#GItGiQ7Es{|2+Ii z&nzs&FO!Wm55V)C)KTx_C9?w+%RkFC2LeLVi0QHZ8Fj&W=C&FK)s-hQvwfk6o&RF} zf1b&XdRzN8nv=i$#O*h zWY8O?7|Oun|KIEKvch}66(vUh(Uzx|`vh(+vdpql4Z@e_c>jXLC<5x02NhbopdTtikqIJ)Rg@k+}LI@z4w(R7H;z&cRF1%DaIgPsyo;c%jNtg!+XUzxmLBNfh7GQ{!W9=Pvum<%fwlbe<~ zksO;;R7&Q1z%Ksc;)<^qioGB_B`BPq_P7Qo{w|&AFy?#w5L6J`jaem?JJ@QE5zc)$ zZ5=-FE#P|q0^sN&%8=7^0iAnkX`zCt#Rlv$MX}#t`a_91p5cKOTk@RYfne^wLOqTL z-SsXxWsXy!aPJ>0!PGxd-jz?Ny4R3|l-H^9UXEQ!+8}9!_#>1ct>R67T_}~YsrGV% zeJ=JX&9OwEgej(?@7LKEF{O`t^8crU|2tJCVg;HkXTUXIR{zI4^_fIaX8B?(x(gF zw$WVqt3OQxbJcAm=m(;oQsf%gU;317Aq?D&;Kxn(GA{{6;(f1YDExcRy%Rg{++PN| z4}HaGFN2#`N*R6@jE5K}8=d$V!+1GV7wPI45;%zqIMs;9;8$n|vRr3yvL$pQj#vJV zb`A7JUWlJ#G@lxC+AH!-BoiKSl92(psTETj2c_o*ga%VA`3k-_T3MB+rg4gF$x3lZ ztWU8gjgG&Eu%+M(e@Ql4crojO@b{RYDLa&ZvP@II%pR8D+00(U9 z=Daj>G3uMzCsNB3m>BEZFO(S(1Av9)8;&nuwHCNPvQ{)2Fw66+|8nzDoQ?RswHwK?+fxzB4w3cru4aEXa%2 z=9As7NLch$_9bxIKL(w5|M!Nm+1YdSc6=ZQuCf*%rWUPrN9Dm|Qxj)(U8dm&@3_CgGO_Bm7kPM`A&NF} zJ%{*^Tv|!HdiE>0TWh(5PIDow>x|e+7>$u&ZY@^GTM#c#yrEhZb?Q^V;*0*r%bwj) zwKarW-cqLtB&=PZ>~V#{aKRH$!C_Kt(3gJ|gTh8tV6tPX_URZkF9)pUK$XDduTNi2 z+yI!4?-kn9^NDWV6~E%UPe<4&=PNW@zE+?@oOUJ5GCxjh?#fq^f3AKm&LUZ zl*hKUhx_!aJucj51+Mx#7=P`&Apgtr!JfBW-0DWZ^gM58#2|o5deVCQj_>9VZ;hUu zjm-qk1|v_>+d>^&@N(8OaC8hUMj~Ldd&RZ)9zJC8HatjkDYy&BBMdG-hda=+kGD44 z=Q6H&Q;mfh?Lwi0z09BuP4m_bDatjJ+b5pt9%!gB#i8Sir^}#rmFaNT5Nh;>2y&F#E4*lD>GZvkKKr(HB-Q&QsZQO zhMf;8OdSsQYAts<9=*f-Gnw$QZ?liB*+4gbGCgoKmY{BEndYNYz@EB(+P(d|%5>%c zB8okCJ2#TOiLN}TkRT%B!E>Mz5`jEffq+8NmnGgIJZ0p`Ic#x$#tvEzp8_s$OeVOz zmW=&3+32@CqJiSZA?tAwtUEhnD)cHfmIppuH%_ve+tWxl}X<~30E8sZ7DF(kp&UAOsjL;?pkN3d{3-@ zi9M?S8O;@p-;7W`^d<2A!N2;>UKnDB83dJiMbhK=hfH5=9^%hae%q+9bR2I`Y~EVF-s#b z92MsIR`)|DviDr}QZQ7!(=IGYMG;JKGJXU{{U4BN$stk%%i>QNnM?_jO^17+7Ubz2 zrAI4hjqfr?M_k`G`9+>Skt%qXN!O^|(=}^ojyaV(LwBzR>FsQ`~ljM==0H_ zgGigw(}3c*d^?0qJsXg}JY;(x(1Bg3~Z?Dm@&!^x4mZ7)(!Gk>VTAsE=#ib{!3C<_j^hp-Y_#mDc! zW89Bw*D@Zmw!|pC3T4l@U6D~Qr=5YgcgU<{HjBGJ7Yi&(<5#qifz462_6g(7P^Q!Y z=G1lPb_J6|hl4*N{MtBEJhrpkW8b#=hr;F*gB*S9USqAVDI|aIa%^1&$l@M|I6QB= zk#!g0&@}Fh46#iMP1{LCgm=G+MaNVA-6+Iyje{WrU)NT)D%jDBmxkRPgViUSO-2oW ziYpF=WVoj`Sm`LWol*6JkX3@+u7uVmy=%^4Yg)Blgs^2aewD~i7Z!Fn$3$+>d<@&nAD&1_;YP&?yh(N+8tBMd+gkOK zuAyNyiJbZtAd%Cujx5i#%yhPD5NSo5;gyIedYs{c$jV*+s`>SwqgVgV-8t|WyN{Z} zvYvb&w!&Cc%+SE|g13xKunL#Nr#vGtkMW`@XTwV)xuH-Ts{?EiA=>0bwp-@VQ|Wu4JthP+-Gq6+saPq6mtdepKv99~4gcX=RYJJ&3^|^4byLu-qHoXp9j=o1->f;i`X@*ni3x_HXe>6vEwM#y z_}NR+Nz#wO13PpBI+(e}+tTcb&Pan(W9Capm}0uKv&rn*#9bAtPDk+xhZtQV9#o?! zlP%YYq92R__%PVmX@e$wJAhyV3wrh9NKkfW{_v0*;SxbQxT1;*IMILfL%zphMq zs{jmIFLEj=7tC01K}yFQ60BWzt{j+GaeOMNeq-<(n6yo2Y^@Yfn@Mx4$Xb2SR?QC8uV*qH!pQ`eT!Ri?2a3pjl{21`f(9+`Tv0ijexj!@b?2?$sF+MMhB=jae8Z zMO2`o+F_$|T>IfEOECR4>=p^GZ~)N==$bMU+1*5QXm1UWQY(}5`vKg@`ize1W_ zA1>)E7`EBTcC?}~gVS>sFz9A)ZbPCab92Y+1fMc-)9VUqK}|!~^jJ)8_|P4rc6&gU z^{;F4`1lHK6N160u6AWKo?Mnf_Jwhh3}!+rBbiK2nNB1Q#Lsd1$`F$r0OpXiTMSpdkYWA`Q7GO1gy$8+rcCsO>dbGOYTuXR%jKylD@$;)`S#xt zx-Y8PX5O|*+B3j-Z|3^t;8V|fUex4Y&}ct@=iZOy%PDl_k0>T8Qv}CJwAEIoua-1) zUqL_m-ks6Q-*L0+NWv5JXH(5!xFi@*RmTe)X(JK4YYDzZ5ziwZROBC*`f4C^LiYA= ziJr20*Gw6rH*$q%rtAHmG|c?0OR^k_K5SH{;L6;vDeoHg8#pm$ca)QYSreWR7B#@0@fcqNA;D3wieOknEqc{2eT-ft)We^zohQGU zMxZsI)A8{5tuA%>uMV~R{w)ZkPQ`nkgmv%s1kjV7m04zc3a^Z2IB7#Wl#Bb>`*$< zZmbMWu4!(Mw7R;{NLGUdw}dV$T9bL#AD=|jc%QzdwY6a*SX{n~>6177IXBn@JT@P= zDVq!?QMxCN-g~>`eQP(Em*Ag}rTNDxhId9z31FP7>Pf1yfXX%7C(jxS1G47im)pY7 zx_-jVhu$7Y4-7>aET6NJZJnRi|Gu>#_f^J=Gxyw0K5AQ(?BzaFg>HQKS&iDsp5%(! zI!2mLsUG_r=vdm@>xE$O${Q@U+`r*wPO|Jpm^i(`?X52+LSTUUJl~#`m@B`>%o-d# zxE`GUx!|Wep&{n%;L*xO6s4CPExvHBO8xMzuRGOu{hH~Zs{?xAkie)g%5yk>lp0uf z_K$gWEfH;Ho#4ZOy8|+|wl#xz`AFg^$74D6sdH@#a2W!JDTg63EC{;#%fE<_)GbE& z%95hFmQ7;9Y;UDpxmp+B|B~+3M{eW+VXN}qiXgK%eTl7eM6$8UHL?iWYM;W`!uc#z zO<{&sl;P^n44${h@K-&_yb1%2?3f{o}K+(&asDd zkCW2l_Akqjh#1S%BO;t33j%uLSd{Vo_x%e;U9EFmjLst3g@*D9$~Wr?5)x&q1_Q$5 z>o6Eji^hB37u0HN#s>Z0t$faxxGP9ox6x}yqkkN2$1m`Ncd9cOUI>n~NsO{suBmK2LxD#8%`_N3>ls-poU$V)|Z z=r;nKc%M68PW(l^sbX|P7-C6}gN;F(aMD+S+$m#ikH9$>fe8XsOUpe4_(&9Z^#`Ei zhaVt5LbYwOZn~e%eF6@VY85#JVgk7gYHdDgJUo#5nQQby9XJ7XY)ifuF-$^INe7@Q z(<@+@^YZv1hbO8+;dpx6+;8)a-^KfGFZWyTK16}Y!>w|pKX9fqJWgP&5k<5V5WHRGgp64E*j_j?)G`lYK(&6YjxH&u{0c9w zf^IoO#twyLCe8}mCsrUZN#E?Vza*oR`TP?I({bS^JY9)Tws}rE>CRK~7{uCTgHxbqsEd3EVZPb1 z2=yPp_SHq1?K9l@Z%Xj#kBO0*l-?p9v{=^t`TgSzBO`xLMs%^$ZvTbvRMpkC;-aNX zI|EIJU;T-KiW3F%C6%&G*T+1a1&-Ly5la0m9+bL{UXQ9_)!o6`fjyWw3QyK)ymuz|GMgg*8QwGsZ&Uco-a`<*u zamss;J<1w!%2mnI*6b+uEa<2{d~*`#?IBqSWoNRMeY~UW@uyzIC^V;B!hsBi%h1Vd zmHmJd*m8rlBG)BIdkkR= z&HxThw>a$8d3R_PG)|U_)4Tqi=<%~irWDmDliR<#wzgEIxrdoC72?U*CK|D>XL!w| z%t@r|$|ZqXP4fP$OWQQL>-KSF z5;B~KBP`02ESG(k-X1F@cjhS?IX_5QINX=blW`g=)!b73`%Wlo8&Gia^28L_`x!5t zx9qgAGa*FMhm^17uqyDf<8=p?Yn*hKWgxU5Un*wL{YM014iLvqiT(9M?3 z@tadZq9~P2NrfHC`7lJ%%vq-y?g$+mN|`7YZF9&9ML9HWEXSNr;r?B}fBmt?4z}z1 zyx*_a^J$v(94VkBn|%u$gkeDl!aMz^OvQ=GR*o~UpZc11c{O`l=j4gTH7VybD*=Sr z444HSMAv*93`6C>2Q95{E{llK2thxUaq*O{RWy!im9;dKLG+A9256alLk$5risQ0n zHhOcdpRk7vz#diW;hfRU=aYq?Pd7~#i3*C?^-KnTQTxR~fFV$i`=6dJ# z?O5?j8Bzs{V^aDl9DJRZ=DL~LJr3u8=l|~R;G*f#@UXobOK!Bv_xgT{f|;@QD^79O z@plWSH&58%h-5P}sM0k1|ChR2^$K~}-U~TB!#mgM0z(^qecry%E?zStjy2iG2v~CW zu`0xu`nj(umL9KljNaPbjLoeow#N!A!1$$Y8@U=vSi^3!FquD*?ILkkm|XVZdFOvx z#zqo^_Wh6Y&AToIDgSt%UMHJ|KIs)P+mnzoKAmi+>)RXn&D>Jo>$l(LTRv6@C9q;tZdgv9~M1eKjSw zZxT7;F6)5hk!%^8cC)CON6(v0|DEz2Tz}-=aHi_{{-r{FO<#XZn_)0))S_AgCZrpV zho1S#EFG(XeVqUC!9%m`^!mx(e~x0#p8O6smzQM+f<_}myW1%At0OZw`QWGP3EJ>q zdTUS@n+20v)_wV5*AiZ-qB$#7w-iCd*0}Y~e*Mbn{SsF8X7S)xQ_`V_635!jSqDg1u}!AcSE90vL&b&2c_qR8nppP*vEK{F};I_X7{@F_MM3LI&;)c z_8qGzsHyoqgC`^zohbwwIEvU0Q4Q%AAFO#dzq_jb^62gE;!A1B?4cmWUqq;;)ynE~ zRI8Dhbd-^K5^X?s!o2gTAu9dna2L$f8jQ3c@o*x<65ZuPgq^zQz5dc@iDcI|5~Lhz zOxCX$g#nzqBGGoT6{49HHWFgq2ZOv*G&{Vs6Wf=e7rf*%{|sUHIKo7SXi@=1WP89n zxYrfe&l_cSmxGmxzDX_>f@t$HntQV@c4#^%h$WdD9nw^Y(oaMV7wFxssOuDELl5o| z?k)WH2xLyQ=z)*|u#eiV!TIuP-)BnOZ$1jcT==9X2KIh7U-M!Sh#*2u=iq9qw#U*J z5-p$_EY3Eu;XS^uY@mGhXqCpfzrc+>d+8O#8M6}*hDffP-)Q&UZn(Nk{P+yhR$T48 zE01IHu{`a|xkdwbMIqA!E195KWnu=#(VZ5wmwF$(bnc!j%|?`ZKK|JZn_@Bf`0lo<0mVnx0g6jbwt4kaHJ z?oV#NaL=;aeeTv(Ef8vYhvb}+lT3CW^%%?hULLJbA`5?w)KBmK8{Pq`+-gxeopq@@ zKhtkemOQ)|Lu}9MiTSfqM)qHP#&&d6Cz72Yi+~|vz6_W-Xlgo8qvWJop<`)TYSTtx%ES3}V_l71Sip|5DNtwcF4X%o2bJ!LRJi0Se?_G+y35a8N1n!4^-O<>e?2oy z)Rdj^wZvFawt;>1mVqiqPF;x=6uiuz_O(3i+kfMX{I{SJp^ux6Dj;T~ebp2aN4$vU zS&W6=x2^{R|CU{M6&^FG`})trL}Mqpr$%}m^cOF z^7V)ivfYv_Dv91ZF%82WLf^j^KtQe?oPBGDA$OBA0L3?2wM}hfSl~84lD|; z%`Yu8%dKo;d&-$CE;=1x>0-nvT71k!2}I%ILv(T(%j%XK`R#w8a}=(>Nnw!g)!e-y z3c%5f4_o63LZnTZc*DpFAc2ut7=qa=$-h3U69A`QlB?egG)YUdsj zS77dXRBT26@rIj~pK$hNk5b&?;hHWcmj-Hs=q~?!*tlvabs;&(>@V3?8v~kx7`emz z76A%uT63m6ntpXB6#v4hLHgZ+d~bosNeURQvi?4!yh9 zggU9x6hHq_Cg*%|QwJBP*8%64|8^=YAIbO^@&(7%sNw~fnE!wNxes4Oo-?mwBXghE z&++4geTZU@_cYp4GKmA+rs18&kDUtWPPz{c0Og4Xp+@nfE6=tcGu z(Y*Pb1#J}#5VGsS)IxVH&b6MSGNXW7BV}^C!VOIvAYC{d zsSnqsDK3+GWLt59ykrmHb1d_E`sy{UNm8RvOtij`jRlEOHltibMrH%R0iX41f2wz! z)0gal4iygvGeo+ET+6Lm`1)-9!Dku;>Iobdb7# z6)vSi%uwFt`X1}6^tYtaT}91Pr3%gg)*ykte!(Uks$LDKhowov4Yq$QPm zd@qk{5t?|wv;))4Tcl}sGS403Et+?V!bA4`BO~quk$%tp?wl9`n==2AR^kbk1DWk^bRXBT8%beZ2Qe0j zBk`Vhd)~j0F!`n{Pg7c0{%!YXaKjF5$|12Qi`^2LEAq|)gVMW~t%m2MI1%Ho1ysk+ z9B0vr(Cmq0q?Hs#%ip$Ije!{&AVKj&B}m1g(xfR(s;&Zwu4tOHti64u^Xm=ycwN_) zeq)h$TJMMm&9ZM-R5L{eF~GbI)Pw0}Rl<#@>$f~!y}lO4I&=G0K|86!Uz`gHU?GJO zMBC~U+|whs(r~6vr(@`-`o5WSP7y`QO;T1qk;h! zaKVrC{`KY9R0;-7mHiIYP2oiStX#h`a-lCb(L(=&@KvYFZsT%|e2o{BMInIoZJj)O zs(t(1)gt$UXa^(WcRfGL>OB$P$@bYMcEdn6C_t50ojCS5PpUfOA6QrbE7Xp;2oETD ze1z^|dE`%TxBs<8HaU9wl^yKsLQm;GUn{S5pRikn6@C-uNQS<3L~LBJJ^wHQikZyI z__YqLsqHamzP;L&ebmfi&zQ(ZiTF9pWVXXcQfl%O$OVFo*|&UKuHE~R`mqlIr?~ep zk}F|v7oiwDRK5KT&&~ji-ql{ogWwdIEC7}685xj<&NXKWTL5@OX}B>`0{UJ`c*$e* z!Y2i#H`eD!Ojgz2>tzh2!kP87uY$-PVF%Xw-O64sKQaiH4GCxCqxe^d5Zc8o2QIv# z>CojmUQhXesYt~lxh&gRfXHF5tW?@6aE^F?uMmrZ_VC!;II5%5%46kUDMSnk>@EWm ztN;YwhA|hWEMm^TN=!F@VE^ae@9xq+UG(7o79d*YTUo8Q>k|yrklulWNw&nXXXP#j z*u%1|V(WfGQzUrJp)@aF+Qoq?GI;=9cJ!POiT;B3fxpo^5u{iN#JY`d< z+`dNN;IYg8^qNgvfQdq9DFjh-KAULDXh?ieKBO#}F3feC2z1TPI1`PqFfof3muz}1 zysyQyhL&VLY5>J(EvLYz6r$iATm1W_Hef4QhIq78II?hIR(*HXUq@usrWzH}w z2x})};CS=NV>%JFat!T*>>HjbDJ)>S8a+9AtjB_}mt%)P5TM$n0BqexUovr}*6Gkq z-p6Fvn4h!Tn_Oo?ebQp(aNFfId@bly2(HTLnLL%I7Nl5FIF=CJh7;9w#kGeAnl`dv z+NK!Tis;DpD>v(0%7=%flA#b>1^=r$7jtt zf3#7ZwYuUS+}w{~bbfe0$05DCqtqOuJFzj`gq&`VgIsIXOe?9Kl`D5ERVPBx>k z*~vlGswa0}I4}2RsugZn>UFA0(PvZ#2?$C?Q@vo(ydSaTZ+av5*uyg&o$Y@@@0ju> z!%!9e+T8{=IkjwZU44cPRD|@Y|rqW!6InTu>ZU;X%Hm8E8xj-9~*}s9dec?8q zhfJOY$#Wr4gwnm7;^Q<@`Xd!--%}Sv7gX$;Be7yQjLogUicOOv!ApuZH}w&Jgd2o% z5aRz)0GrHK;nrIDrSs-j4^gqB&rlmcGD@L@pi4At#Xu1PNz20S%9~X66bp?4xTIYk*sU|ogCT&so9kcS0l;`Hq3H?~m-FVYH?}sGhHzV=%uYYeRb6KHMJC1(V=UVhQP6H3# zUkY%g6>$$Fm!O$HN)PSMg(7kWl03}yf4qF=)ak=nbPgR>ZWh7>$+E&ywJ+&Usz|B% zaM@ii*PQ|9h0V^p`rz=h!(v%RA;&%D#(yAfcYUD1K!tZ8=SlP*=f%s9a~H72FaGx- zLckrD0<1%r9(P#0>A<1wr~6B6a|3eChDNd)`2pUWK@k&qS3$D&<+tG+xOp~U9Jc!p zwC@}Qfl%@?aX0PQ)>E0ljWw9Vl{&_&t*R}OZD*OLLvIgpA_D|BJs+t+1Kf#DI8{D` z@rUF%f$e-3@w;^>X$A`Ps@IP*i7~3QRCHF`lDY;0Wii2%dN+oAlG4Aa5ZnjB3e}Nb ze%5wL9Lvf!Q%&netu3MEukWtO#~VP-o+-sOTCKpQ*VP}K)P!3BG2dnyFbGi>FTwwJ zQW8)hU^-^Z=MGcc$m9>U29FeHQ_(qDO$pL8^PUqE!2@Yu%({wMM4?iVFf3b1-GIb`imPcp0!Mbqpi4Ji1M}_>dn> zrm)qY+AGm|M?p%*Idj7S!H*CBysIKBi|bTelvhA(iiB0-1tG0(1DHTucwJ|8rV?0T zFfYS+&{EwJBdD-gJn4D~4OcHV0*BVg_`P1?LFl$Zt!?7v#hwUtyN2Q2M>9vF zEZ!qw_{8l4JN{t?($b$`2*$#%=q>B}o}eBp2wSKnEMCgE>PFUFd=lZL4L6dGcxpTf z{W#k(ZJUJ(R&1km@H-nhKQ$tC$Hg_8l^gdXUjICk{Ji0ckg2qOL!5C%2$4+sLEDZh z5AfzTCU_1#qE#uBjK3)mB9odJORYU}D@)h|gQ1b9V3_wnDHer+0gvr03YN5v)Xo=L zkwLS=fPrW8cpp;Bt_@^;?(N&?D!+fH$9cp=3KgETV{FP&28*(Un{(;W_t+QVXM0tK zO%UJ#Ndz6bmZ)z|t98_^GkSzK!^e_V4k?4-xZp|~%Np&mV`dj&sofXTO`IQflHVQ% zI`6RGY}_JQ@a&nB^`+t4%Hu*PmJfi9sxiw~=G-bz9&aMLB{zfncVNN?V7!aX-zYfr zA9$N7=6%kql&V0%?nN=(dKJ%qWuswxylW5dVt|CoVIev(67@;@^o0cLX=UH+qY^OE z0I;{*_^1a`i4iGFJ1^t2`f9Wbu!Afgy+~A;Qmx_c;XPcW!n}3S;eTAaO#V6mEmVj;SaNdlGSrCszapb_Ack;p>A@3!Rfz zgYowpa}N!wryE2nV+F50SREhSd_+1h zX}Sj=AJSqXP|XTP`jnbyE6qh~FZN2ACAPk}&#%6sWURQ*i0`!QjOTvr&4*FJrCzNU zZl{~-PSX?W8L1e}MIaSkw|&KORA%G$wYh*Z#A$j{9lw*ZJoy2Sd#y_p=-ayQZGdUS z2GA054+7Z8LS2wb`HQ`HQ$Bw0(w6?WRurn*sVlEo+*<@2{`Fgxplw#qCYCxXk@|r` zf>MOF#f!2MW_J}Ei(Q-D*k`Y7#t6f^e+7kV%HW}dUnBrJ)>rw<>D?7zj?Rl@8Cej- z_N_HAY%2_jxWN+z^ohQs(xpzkoVc{%tFW6vqkPI%YJp}%Ntm!U>RNAbNOTI&i2lpx!i`+pU3o8DU${=`NK&0naAZOH!ra3Yok8loPa9YK2%+f! zsCiRtn8$2ZG|z~#YPmTtdsYldgXs<>^)-w;yB`KQPjc**dF9gf7N)x6BY8TP+V*JJ z@dR;iZ^>^U7nfKU$*m^4snVaGGq;K#HjcMgJT0AWjMNh>v}#w3IZInCn(Q^Qr^h_d z=+9h+3qzkhq6Ix6{m8bWKZ4?#L0tG`NTF*Z8{Tv?ii;KvCZN6>cJdR11sYE3A(5T|IOMdQ|D6eaWyFc;yM;S1=OQP>s}SfyAK>Z z@ak=m!|jTrgNqS>_;Wils(B84@40-4;s?uP**J;9JQY`TJ`!5#I1km{HH_^ zHVz&FGW-Asssn%DgX+PgYb20j*Ydb zPwl{)8=CsWIyx-+&!aA9;>+2YZIw}c1=-`-F-c#WJ4X+Cu&wv^&g!x(wX|BoXQr>! z<;;G&Qy+Urf*ay}yn*_h?^aw={-&=vdhF^({i^B6J$danaDRhBN01PjO#$K+HTPz& zZ8^=~;l9)A{XO?Voczivr_8VHS?{o4)5a{==m&P_CJnZ8wpyOtX#I_1ow=a&KIYZ< zGwn+Y>NJ~h7FaR_kD3r zSwVgQdIicL@L&9kj&#lBH!mG-@$%;yDocN>1mN2p{rY5G&nY!)zAMyeQaAXcvh&au?$y%YX* z2o)$|WtK5fbgxH9eOh1nO6B>t5|H4%?HysNe)5L|6`gZZT}>t4FK05SA=t)S`iZ`*%2Da z&|TT?bKo8_7(!=kzOsLjwTWM&g9|BX8o z6qCX}cWSyPw$}}1UigER99eg)Q&`bOCz~WN2(R?@nq6!Vu#HXDLIUk<&HLIZ=Ecj%U?&1Xn2aQ196u7h#ibt21lKS2nZagm@?pE#i-cvJS3b-?6 zS`WC(;sO+|cby1aJm9c2E9ww2MA@Wa)P9KQ>1DPeOL3B-`xHbq5m50}@7#7K>?|3rnt_0sbF!0F(`yb1KKW z(v1CHZW(duP;H*@IdUYk0&ufrJ%mj&>m@8-W;^+On*ezJ2n1s1QZh&md=ivqEWvSf z0wuR({|AB`FFZRq1^&)vTqAI`#r=JakW{F3kq4`6=_t?QWp+jPaPC$~wXITKCyAy# zw=@apzKX5C@BnZQPFYc@i#sZASYz$1VBwJ#E(+vkk=`5zN8(O84(BkIg)~OQ^7I4A ztcJkw#fM4;@OS6T`zbtNN=h2Q9#XeG`Vx8LfKQ?60DT8=sw?X^QN7e(m^a_VC`5@? zfDy2Q7rEQH6)k)W5-)0R$Lu+kN$`4fRe#j?^*2+7a$^TRb{VQ$cQVuC{*t*AvgB-2 z9%gFv{?JgL=11d*v~fl-GAOr=rroxm#)t*C5$%2tEPOD?YxGer8Win`*wy+z*;%X^ ztCgISL;My13o;8r4)G6C4+m%4;CiVg*(GzWQVusdL_5}_%Vp{UT7bABZs~(TRd%Sh z@j~wD$zR2J%tHE_l6y5OJUV?f*SniO;gyYY8#tt$cvbZe2jmcoX3ftgcgBe z_m%_c=bhj1^~C@6wtTKvZwPfd{nqPQ_i@f(UHuD&6k9TWOE_K=Ie%@Rb&4R~J`Hp`BLOHxu$l8g=22YO<}(EwL+_XnlF@cNpRZZonNZ^U{OG$IJF$!-0zI(hlIiwzNS z)mwr(k@7dTnEAFY!~SWpDe#}84K zg2Xv=V2xpSbTLix7L*#nkN^Rg;+5q`SOqiL9iW2yn6wk?ot2fp5hMt|ZVb~hsYq#^ ziWVD7OJf5wD}ER7JI{J%KB_{{a^ssMq95s17-%r85aUkTdac;so4qP79g=Gsv0@0Y z8$N#Vi}%HEW<-TX!@dyB9&;MAed$5LNuZ#rCV>2DHY6N)aadtfQ9$}=?5W-(kdad( zHU}(ku{J#$ji8=ZVqE~lj8;6A-e2^wa4F+1R4O(oK>O_|^|+#2s*9)XqJ!kn+6yqd z1De!Vj$L(13(wBW{WkI`h_sQ#Ny__W^Tsr(ucAfhe)+q)PJ`>uW6#`De}HYrVivev zTsLs`5#yDd7ZRLQGiTeq2bQ{GH)$&(;e%KOnnhnvFHvq`79faSamWS%$q5zHK18h7 z+kqQ7l(0p>%{(=P1L(MH8J=TtpFoBY22q80}j_0%J zXx47_@8d5hblhl4uG2Xi#}}nOSesFKh5^$Gva+hx-)kl#Ae$EOHzrRQI=8DI&LR;#SE(Zl@c6)evGYG{z1xA8) zI*9K!ZxzJw>}(A>vTwO9EI^UyeM7gh#}=QEFRQjv!0VD|@(!KxsBi#cqtkA>7@J5E zXb&Ol;Sg@kCJS1w4@YN%r|izQRD9}_Ou0fWDm}lzxH% z84FuepRs{@vY(&7LcYCcw1-{r-~=5V6i0ug{RV?y3#KXKv{z}pK?{~`O}}No*I$kO z3IF#+(w-B0(4*?ML_05e2*>0^%BO)Baj^aq4hyL@>AGH_^_Net2DE+jk!zX<=y?$Z zY=jscu=`BHu1{fc|BQV!{9jYk-ag-<4Ug+jsnG&OhLS({7pS$`rJ!}XI_g8r@z5-{Vrl6kFY@dM6!-bLZV zABsF{ttsYLZurp&Azuj*XX)pcRK;OEHqn)HAD4sF|yn!mYv zu{%tC=<<TAn6wstDzobgc^+|epcCEh-# z@0Mp^7ncI_knzJzM$2(pF#3A+f1t6K>yN{4z1wYV<9mX;Ypl!eXXUJVLYF$=Uez9w zyy$2lOKAuXFfmM9m`Q-&;+)ezFZp)(o#J`rvo)#X@6I;77>u4fs1-D9OVKX$4HD#i z42^7kpKGhZ()1Yr-dGZ(R}DCO-I^{QU};e|RlwZ1SjE97VHXvAUkhRST+Hffhh|+d zg&P1~{H@n0X(-Ay9oPtN7;vQsUj0QA@1i+F!c_5KH+Ufz-ggR*_P2hjSVlSGaBo-deVxWi0#b(}9}BZ5!$E zfTodsmbuy^dW}o)bj!T$f|Epi?rq#pQzniXqf}km+Joy6rH4$l#|n{xhc5L?!W}yMr8N`V2DQf zY`ZW;44{;OEx?hHA-pYxB+MfSH4Iv%Szah(+^r`oi<- zA)6I<>a$Xn&uC1~Cb~U5{`F^eXmX#&G4^*SP;htl6RC5~VI{itr8*B>DTRT+RH^8&^2&2pPUW5* zK8or%#N}t#Dtr^=HZ@{>ei2PfKpcEbC+BVj=WxMJs^Ekh#^y zx_{>2qRL`;78bEGoin(U!|Y!fluOcH2zzflunZGslci0+xSNl(E^pj_!PV`a=G&Yb z9ZtAxVj?Z=EKnNX^x8uldVo*0%fNLWRk$`~&V|oz1Z13ja{Si4^EPku)-Krb5-2Hs z{l)ys2yY!D7ad9m8xgrI=w&K>WJ4l|GTigi#|x!~u27YDGQmDZ)+e!|YKvSVR+ko; zV`sq9g+3`Nr(%(ysB7Y^>2IebQ#xs($l^Aefk~JCTvJ94jcm$3WNd4I$QIbB-iAqs z4gy!=JJX-U6{t|y0hyu2+`z>go|iNjaRU#WSel`7N|LXM67$ddmxiW+@wtnFn!;lA z3LDt-rmlvXf!rZF!wUf*Zle8Y(FW@EQNJSjr};ck0qNCWqJoWBz2D1PtP)A+n_OGN zExb8bWW&vnnHsU>cE-!hI&6}Fyx{t&gTYT6s;&;a&M|LTb(*{6<;r<6 zb|&dlQ4PO8W?^n%GkkR~)iPfq{sHQ&*Md$?C)S3@!qp-Ld3;JAeSM{J(bEy40B+Xj$=JcU z?!!Bf2bVkx!berJ-YA-R)KrAG%DK_#ws>N~yta7bgztDQ%HGy^Z!I!bEV-MpI(7KO z7x(u^c@DebM53YxP81X{kND(OA!TVCgE4*d>P?Dd6Y zyE~zlabBr|XC`zdL$h@|&6fgHOlgpT6~w2A3)&h3jn}W-Ym$48s zQaceuC6jH%4;06G_DYJf&G0b^ht|69gPfnC-g8&e zC|WY-OvocLFg#d9uWa(6yPAx2!F(JRn32T8S>4xXW)up%T>NwLSbxvYJJ0q=>F^K| zO^up-oQgi2YHVq4GUjWsz&y;@Bs5%TE%O2OfLyeX*igy-WVs;T$PAN6;_Bw2^H!fF5Mt zTk-8J|83!b+VfgtJF9fP4R{z9inl6u6Ohf1{&``>E@`izFyg%X~PC&p1(#eA7qj z&aS~8C3m8E5>R)Tc0(o3}&W z+k-Ty+}^wyvSl~2C?#&FKqN=$vE7x`mEmEb!&y(mu#&#bt2hu9PYyRmmU1PxSC?gd4DiiQbDYC|Yq>#qv0E^jBNuM4# zDs+B$edGJ?e$ye2y|4}xjIw%5B#+BIGtFTi7|IC}KWZPF1Ydy#tZ$p+{z8`qz>*vogd;9tUUsVr7~ zUG8O{{1*!PfzH|^-!cI}li5PfUJ{&V)RdTRiU|Ivd&^{D_E!3}pPxlJoN|J!x7ppC>Ok9+gl!g3 zJPXQJWtw=nESzeMH0{|z_x%hh7}&Oe`9-1#asc6V9fUz%e3`Oz>i$lT4dS{7Z1VWJ zf0(sqAIIGJMW+1dT?NO+W z9u_95rf}Dp*h}PR>JAEmlxzx3sV2N9AIv9ZwcnT?t>{qPt^R_-3cuvzPXPVN1N?pu~my|Muf=v`Of$Ia5&B!wNsGWrRd%D$5=e~6;Pyb#I%(-{? ziIGG219|wxgS9~xP%ZBGFLKmhj21)F5P4NCbplQQ+E!Cmh0TY73QXCk_3yAo0aXc$ zs;H?Ey7x%O#w6waF78`;95?j(Ss0vp;Al{)?zojL|6^|a{NYH&(dsE%w1n#AKxt=% zC}Bl7_l2_acgMcZ#3m06QfZufPG8YoVAifEgMn&tr)^=*j9&y98!oN{c^m@*M!32x(PV?ei zqH;2Aw{q&YW_?c~uF6Rdu1zh$YnBTKXW{6V3VL=(6$B%MGwLW_)fu zb$MsQkgoA5z#>|!Rneqh$An!J#P$wv(wZHv@h@(oW2QUi7M*cVC2WDUOUKrGmh z@nkba6A#MwM_C~mCXbyvRsS>uF4WrEQ>|}qwIgW6!?$69E=R8s2T$Jcd{#d1ffY(B z;y0OdJho)6j2Ja;{e!<$>Wr>z71hE7LZ+Ve>D?N(0&0Mbc{rS}`_67CZw4zC)`BxE2`cKk+h9zXFv z&{@M{*7DezVEfsFGyj1u7nNndsrs%asr??)10^539>dQtUWwgh%q|EGz5dXrAyp@< z+l5#OQTV9CkpbAlX2VrV#3n#E63G=8jyQ zI{oEqdFbQsZ~m7ZQuyOigL9sQ?HN)qdW$=O+XSC7bCk9Do46OlxqA0x{CHd~(|32R zXQz1GH(*5<_1IYqgI5=PwjlnwlRM?d_7?*4(^e2OO5CEJaSDFK(^C5$y#i>AVMTqn z{1uX&y3f!&7oYs}(;0r!tQ%kpwy%SC2x)+g10=`@Z0}YG(er<2R&n6vmka>^yNCxP zce@PhgVJCDc2>1OSjgRG+nYdN$BE|cgcZ{sKp9+gDvBMfaS!kgJ7_&h;lXywZ;j_9 zT>2m3g_%039yq1^kW|=r5{pF4o@hcP+w#Qk4sQZnC}8zLA5K2(>1##>BXU^Dr3__$s_!s^t--)k(Eh}8@9Ik^e2){KV*9;1 zPhCk*gIqIG|27;TSpKf)XcfD{izB5C?*t5=i1wUPcWGsdb?KC4uAB0r=IiPRbwX1$ z2D!vte_&VGrEG^CXQ2hE8=Jk)N(2VQ*i*(V-cZpKX~$vEBl^1(2s-L@(%oIM;rS^H zOI=;Y3gJf!OD!{7t)|=NHc`=b89w<5&|nJjWLY>Tu}I&_+vIEqBFPW;TCOD7*%K_O zke9mis|R{gjHXV(Kh1;+>VR3jGjd+~O!2*yLnG})KXeq@K@!v=KK3_%-76@P4R{dV z>YZYnh2Oq!R^8NorCA?>f^XEiOkvm`^bK2YU9F5$4}3O9cGiVrgw(?bEpsnR_jM7o z1T)DMf6u3MAtWLM^yc7Y-lMgq=2sr0@ypf$9&dhJ2M_^l2#8T5>6I{}7dVu!bnoU5 z8ZB&kU^;1utQb-vmTx%75Mw7fF-ttHEicWsN`9cUnN7J>Txi`*zs$uC5A07KYp!+% zEip(`qWNgHzDB?E?mpNFZPPgbxXsv|Md7QJQqdr&-EFWKT09{gPjYFX-=sTwV194g zxTg9?rX<7Qd}8q?1XanfAZ>sKNC7iHj+$|(9ouD#n8!B`hF_40W0ZKg)9fMtkksp2J zcCcy-zM0TqqJ`nz)cB}nbYDS(x#GikHV1Hf{s~M<>O&z_Irzzr@lHgCik<=+Y{doD z;K18sJqc@-ysNiSdR2y4WEg5Z%o&Two19(TMC?&fzZKt>w{oqx zTa220{*$v2q~m?DK-weBSv%|PwJ3_i+Xbm9-;iIlqtS~B3FCXieyaTuEGl(-U^shG z?fd2)j(xNUJ>}PU^o+0f{{}2o(tUhe3d=iCaHA4PAJx2n`q$=>iH2D9%*^Jz;iGv7 z*QPQZ@0WymC>^8qt>*B&n0CEp&w88p%f6sk*0Q16rAFm0l{VCC*E*uKpOyuno~YA( z6?^`6{rxx%fzkmlSlB;?Wv^LDvZijmAhcXGUY*(@qFN2~?10uQ##%BG)mJ`hA9--h zeTcn@i&QzkO}~7yCq&-lcGr`qrWr?r&!(gXqXo1-f8S}As*X|`o5-xZLcFtQ;mFpV zT`fh3$8(q$sr{%u;Gm4419VwC`Yo*zr@kK(U9qv7JC5&S{G3tOjlP9;`@xkZG-z74 zB!en>8;MGlTdz>#`Jlbm0@MSYQB14g5(3{^wC>Wu@mBUN5Xuo9V+no07Y8GtN`vvv zys5(pY7>`9wGfTQ%N@shb%$|^mI^dP5vzwZnjM{V|F%l1-1;@AtcO)%gcfFmLBLl< zD%2uDjaC_3C7}3dAkp8O+?>|I#Vbnxzv%01L$jU2*Ivh5xRR>L(z(A7$&WB1L;!Ft zbnq#E9r*bpe9$xT2_%rkkwMeu0q_8swwzhQTR;y|EqEF_*sc|gg7z(H zKi3WLR_!6S0jdhQ6y%|77qvTdc#7({uu7|^u8;xECqd>1WO-~~X$bf*iP7{t=D zDX~H_6;&lfs9?o|gp!_wd?8JhV<*%F220`xCp(0MgjFM4pxM*ZjdvuVRp=20b-Bm* z-_SY_dU-8#;=L$l@3qSzzzRj5gBG5g(EXaxYE^3sBQ}2{_kP?q8)PYV9;laVRIocC zW{Jb&d4OTc;S5H0R<%Lk#osw(_SRo$Pmz=wHj)oY`t>vctxtM}LACA|{8G#}(bK0> zi1JQ!m~`c><4;PApUD4eJLXky5xKJu3-a}cnl5F;Df`HL)D~BtMEB1B)0W3UX;7>1 zgc;FC#pQA>EkdNqz*WKj3N!*+UPUpBT%OgMWbI7U1D0BwZUr7SSqaMfxVr62J97oBO|NYBEFc>8bQ8lH znI;^+Bx#EJ=F|}dZYjCx1#BB2mi|l8&V)wV1S&yAvBz$b3TZP!VM~=Za zR9*QJEgztwEo zl!mOsZl5^)^rC4X<_n>)Q#J?>A-5wCS9}KF0&TQ&$!|}Wr?#|)b{-yyy?aatAbjSB zV#WDjUWn*Qt(8CE+eY3l#cQMiwXb@x?&`rNnJl7PBS*8&E6WByT||ryRT-+*0$GQJ z&=lWT9~Fqn!@Kp13O-Zl<3#&xR*@yI0f!a+&Vt3P@gRMVa7VvyxKCmw2DaK*F-wbJ@yYVMjP$oDgAWMEQlC_fVxm0so)mn_rUJP~I%t$1;xXE5 zqKaezH~mT!MNcvcQ~?6D8{~pOud>b>vOht%NT4;`ZSw8Cf$gWA-_t&G0O;-AGLtkE zf6OFqbq>I0O;!ACe)90~>fv#}xIdsgG>!*-z=QTI=kC6yAO1;V34Hy|Du}OyM=COk zN}oI>8TLy~fe?II`3wKQj{*6HI!A5X1Z~L>4&3-Ew^VUpr})3oWXO_+%i@0^sV3D} zLwg^%M|b~CS$^)036?jtpE|t2opZR5B?)KNW3L~g$Ej6}FH&s(#HedK(&`6~1woi+ z-NpTi&>1x9vVz!4AssIB{qkE?px@AXnJO5OFdti18rhsvbF+^pkm?X z8Dd>nRNy1e3;oBhyl03VLNAKgUp3y z-s#bxrH(XwP6JZqkr`*g+4H!(Y~B6rhcCgmf0Zj=kuwHM=j}AqR>*gBof#%hV1nU1 z1n0!)$sLDIUaYSD=4*R!PjDa8Fg@cTtM)5lBb_gcT%M@c0I!=0^CQgnjjh6yy^1x(V9BPQMc#irmvpVp47$tp=ng%ragDe zpB!}wc>Cr*P|L~Z4vxY8t@gSin@4w#3Oh;D^?Tb02gdWg^jZWBe}-(HikucUr=o+4 zlODdT*%Oi0KNPU$9p5V(cjY9YwXcVmlEmobx9?plW?{yVcHZ?R;U(kOcDWrNyT%E+ zdiNcbY{nSxml%@J?>cD5e*GDc{$9gwkAxf{eH%XKDR~KeUq@^{HnaS<{D#131TOB+ zT9n6TjuWX9tqt^a(^AzGRR&3wE&?vyD{W+2hPX3d;@|~44cmo8cb1ZV(;QFDQN@~I&{@}5iGZ)AVLIq$%G!9PMO zW^tgLjp))>qB7emx7vp#nl=x3a8stfkiIESpY_8+GxKxV;xLC7<|8S(hFl&R@QO@Z z#vjVfQ0U)h|N7}sWyPerq~1!%1b>0)RqqSC@0Ngf#bNjY|KeusIFf3gre;+s?llXV zMR`SUZUZJz`pOEosa1DkgV;jRgI$XF4epj=tJT9fIPJyTY?H&#XOZYBYR}TLMWJ3b zKNv)_{saz+_Nld5eAF&v5@v0kdY|hzTR&YCkIYXasVyWD(99TLSe#Q4Wk;Wnp;ziz z)q-AC5`>jwZ-h+3c6j8WHks6meJw`j6fs*1wQfd9jUf?KQESb)|MUIJm=3ygEy7y#g3o68O~u6tw-D8GYlIC zr)k?}ve%G9Y+0&bQ~Ov>636}&KsX%>7@LaU-2T4*w|n5JkbQQ3c;_>LI}** zyA(9r{jb*q1qu|UBRE71Y9HEsv@QdTF|Pa-g+sF~s)cW7o5Ybqn&g0uXXo;Q5i z(zxjSH3=ky1^@w9=4J?J)#J}dL$es+v8m)}#OS<9yKORYvRIj;j2`&2IgisZ*Tv4M+sy#4t4Ff(EayY_9reT!QQ~w_GaRGc zWVXQa(c~(MjaJ)YybZGqaCoRhs!jQ+N!TykC%S~(lGc?r$tXO3Yde${ZbE}1!)7vU zvgy7y$n(v)*cg2r#t1;}^E}<}xw*l1yw3Uq_g02kvN`Jg!ltnwv?S&GH8#SX-k13LOBZSfl&P4u*S5Nj)Y%0egb zQ=5lek=GxPSERVF&$qbpdxYXHGWiJh+MDEt5PO@bY)z)~`TjVdN!4vUt}@zn*FB7! z+N_@?<^av%uCamSJW^#)lFGsfx!4z%WB&#A*kwso47fq{ss%6z!EWf;{QV_oUS&ZzrdJ(UV8GWD#aq;bt6_d1yeuKC_`tSSQ&S@9FEXQd$ z)xND8Fk6V9a`q-e#d?D~0^Sp0Hq z@Rg!Yhi^#)<*py^E-%)H78xax@u^k_g5*aEF!hcfFdChkIlYCQio?YZx;GiSw|oTe z7`kmUx;q_}DzE4{aMSs)F}`T@oV7W{K$$*9Nn%=Bc#6!|^GA!*_qZC}BbElN-6w~Y ztLE;`Qf%695aG4bu4b_ZfFp1|fWC*Swub~A8h`iov5(G4xjNRNPIVugGssL5Py+Ay zM_gCjvJ#oB4~)J$ZDZND%=zw<7V@C&UiJnI5 zcE42%4O`B^N&~M}ovtd~M=$oNhpsz&y@MGtfJXLjb&`giN$(z%Ui%_jW_xRO;4U6wrTQx!E)?yQzRFrH$j zrx>jyNr}m6>ejPCy5dJz3S9;^TN;k>FU$fd*5oW(&QBn6Q)pTif`E;;u*FKF_MOKf ziwqgkYB2rN!&85z(B9)feemj&>P;AXdGayUS}Kc_gcOqupTu+cV3DwF9uy=PLqGX{ zsK!b!n9}tNhZ9u?i_~7=Dcl*2(&$4{2lPk5X2?(d+-)&LQk$a~;HK24#6(?{= zJ@4%1Fd-{8Hf8_!aY^a6PheTgWl`j2kNI4j8O7lR^gXgNO!Y=Jzmh%~N3|vRS$@?1Z}YAIrLU_}7uBGekCJ7S zBPRFK1ue$|*WxZV2b?ay2C{47Q;fYbtm?PXH4K~iTKOAW{?8F?t_%pTnuc*s3%og^ z+p~9&giy)gt33mOmM`6rl2=YWOkSWr zEZ@6Owv0hSfS|^LDA0<(5j=6{Qr1iLGX!{dtnIRJ{i{FfZ4_Y`>MCwK0L5`i%#4?o z%XGk86N0HPEoK?GWR||Uv{AZo z!iV(aiPT<;`V!-|*UfT~B4^7RPw1#k4XA)26}9Kfx4T5xLYFr#_!|XMs}@ zndE%SzJ}@2fDSAU(6yOol-EKhCoH7455<4_{_@?ohhKfa@ax_Ny;%GMjaE&aG&&MLF_ z@S80M`3sRQ4zIp@a?f5eykyp8`Km1Y^Z1jT+~A=dpk@Tu`;z_kw~<%Bo^BmnZ@ZrM z3;X@xO1#opkJkMU2XB0V|HVc!-BZ3_OxIC^ex_#@_}S;oc;Fz3(j1@OzNH!AdS8N} z{nzm_GRo`EjhA~WK_FYdnZ)p-v^x7O+bH|ugV(CHtyMc;`!cPvenwM;BX4fpXh|wE zC{JR^CUKS@@t(Z!Y!J5dmLIE4J)`ip8a3|P@h&!_LnzSeK7)63n5DC#$sN@dX!s7` zxnnooTYTQ*z?!${!IJU%{%lKQQov-Dx;z+l1gktBm~z3tR$j zUo5zBH@2h=kp@AIzmjrR-IorZwuh_DW@M(qWj|Rxp+w;}NCf-^A5(@FDodYfiSLwM z6ZVG-Go&H7Nr>rE7UcvEn!D?NKaXC>ALQ&{pL)oM>=Y#03SyiUD#q{oTGAAPKumKA z5GBE0fMm}RCc$xME~|n_zwT<}198^G@JT9_;cza}&PwYzdb~rd$f^?IH!Q{XX%KF@ zo+t%0A=iJ&_4^!9AU&@E_GHnlUWBwCf9JcZquGhX*sblT&)TTXP1wlfgGVk}_=E4H zy3(n8=^=A;bt0G_Hj(wj2juHPg|43 z1b!Z3N0){`F~yew=O4@lq2{na0c5&%^{;p1bSjSReN_dE7ErVM7xf6p`TkFQaft+s zLW`2^CXzwsu5g7NuV`nN>gT0)G(%?kdKdTRqmyoLw6|jcmT-KzJzd(SE0g}BK!#!r zngahNn5|Fd&|Urmg;VJDgEt5utSi#I>aM5WX?-s!-{1@vf;}IscQ+d9KNTS z4?B*gPMm(kN~o!}Z4dG?j7PIAr0*6Fu~oh)I@OgJ792 zI|hsxta3w!vur0-$-t{c)2VAe{o!l+M#4UK$0fBcDG12Rul)cELO*;i`)D;qAw~M_ z(FRE1VaZu!i`V!wU@ACRCo zT^#uQy%M(L+w!!_mf}vhSw`NGeNBrCX%PTTBTM|>9lp2EnC9(U9WBLuQYu%A0Vnl} zEWvCq+d*Rk(QvV+gTs=rC32HJ8J22cHH!;W?wO zFT9^hV_x4QhyVV*f01B2f408?ZPC&g)-G&~jOU!zT2EtpYWDhkOTG6+_{!7d1X*Ca zwUhGDoL{mlQ=COtl0Ua{Ddk+kmqzzT7vE(3N^4}O*zFyW8fGg2lyfi^0$psST1XyA z|J#W0src-z@@TtCuJwz@r%s*3GlyEjK0R3)d4X1m86&>NY&M=d?(#CR`+r5gvfUZo zGSzi^b19s7mf`{spGYU4Y<4BYH~x7gaQZvA&_S3eq| zW}w+g7xQP-enY>R##aW+Uv;@8e5<GK8%9y^5{Su4xsNsLCNpY`0C=_!l$$7#;3 zu8Ey%sZ@sO-!=QGU(+3onJ=Xbw}8?D>kespvJTLoOyI5A&SaE^EI_YO-0mG!f}a$# zy;1Fx#6$9Oc$NK7~9VRt1u~-Zve)C`SkI1O>MVg;+`Nn|Ugg=;QiGw%s{{tzA?52OEep#g1x#aHX>t8C47ex%_L-1_D z42o1g8_#=gcA@R~)hdtQes_+-Dc06dYEg6U*aI@$6uPPm;-hKt`;38(r)eo>C~TYY0Pk?x%y|aXShe`9cSxo z>QRc?zl^lahvRD~+Mw$NJKtCiT1SGyI4{QjX@h5N@MCBU85r1Ayt>Hn4fWf5x*mf^ zZpJ8PT5q~;xrtTWMj-5Wah<_9VUY;A$tb+)<`$$6fpf8mzXWlY{$0JMC()ou5T|zk zzmMtt)QR&q6%}{c6mGL>QxNwLZHsRDuqL(W!TI(?gmt|6eJL1y%%7yDF6a}>Lu~A+!)$z-`T1OtH6i!bPPZ4HW z0%&bB?FfY}yW^^s2q!&HTCH&yo*%)x(DUG=m{bSoep**~!jySKtF{@ye#*Re`_&jY zKh8cm{tkpD#ozhYz__>_oN4+rSX^nEUR;pfgqs6;pIc>Kl$3NldID}nrmL6JfPbb* zdQl-wQ1pp)&g;={&|`Bis8eA}D4qjV!%coo@u<_mdu`wj^(g4i@IJmEwz1N3Qt>-d zH3^_eoW^9e2*QZs;F^MRSlh93`flM54>ECzUU73WwEZ^Xkl_V}K6~0(sU=@~&&wP# zO4JnrvL>*3og0f+iEy#A=Rwt|5D0Q|X>(2RHKA^6m?dD8g-%Yz>eLzNY2FwXEAhS2 zF)L|1Ne9`yFqJ8&?V)t;M%Df5FsLFKQz!%;(YW_KRz?b>argedI|mL#^iOpu+ zS04N1eI51KWuxk0cTTH8t8o{nHH`&HHWkE@9Z#gcd}K-VEoE3I(_iXM^7t=JQfFGiJ_LZKbH2!aNoC>hf;IeT@ehyt@a%kjN!<8$7 zm!u(zw3P>mtqT>GRishbE0fd!u$9CCmY%E(zZyS@ErOlz6Ve-HQ!NgEe#4+xv~$im zb%NI#pn-GTv5efixo6k({0`CzxlXUYEH;M5H9(hC6i&D3w#sxMYG=Hxt)cO}|~PsJ`4F zbEU#a*Fafo&_SHqC=e)7+uYS_et<|)s+rj9;w)I4%cq+;FjLd%^UAB)7>1o2SI+aEQqw%IVT9K1tt*k%ka+PW& zW_1jtWQhPRWxz)Go>CnwS&dQNC-zhfC zq~`QJc0evE`VQnG#RyXRH3>BfLUy+?Ka?Y7i^T>8zpG`vLLYwDQ$EcO$f-iH(Y`|lRTO0eJ zwa9MAP)br%FMd?l|7%`&LKn~XEh0+ekXteS3l)9w-3}&Y+?)_71%#V2fC96Yf(JXg zdn%NzNp@)PO@XgEku0iAo9qO?MoFOI&<38sOlTYjP1ufmgGL&@)|2~FHj92RIf65b z-g7z84J2Nvq3@*!qu^GD`sspLZIT{asbxim(u|DrRWe&3fRylUICN%nX8DU~hQVTr zTwb8Grq%0?a?A=~?De!Z({XR{%4NIa_GLWtr$g$BtR0Ar>NUTO6lk;H+AQ`iq_5(3 zj8iA9oHPbN>o*w#AfM{Tsoo!12b7LJ@l^-^f%Z+2M>3=?S-K0Ks%A#4{LsjFmo6`$$?Z6J=7&|ca?2F9aok1$QUnx#Rb;`Y6M2yT*%BPHCm~N zeH}h%*cW2QftqgC**lkbg0mucfJh@HpMY}}9w02q%ldz11Hv27{UHgRzPBxXUIEVovRK5AJtK zPf1I+X$bcD3IMbTE2sFFr79vxDXKF#D9cWR3+a0?d6Jb~WGmzlKi#3ZWhB!Lj@ogZ zXlK*W(}kD*IM|Aa7G^np*y zSc^-|8M01#27f)qv+MHFQqX;oL#)wHOnnAF6n6F^!X-3w&%6rpyxBYzz%um>nO${^ z23@Meq`Esgpy@FTmb^WI9@-{Jq4JOmnM?On;BwCl{!+64YQCm3Vw*!D6&jXR?7}HZ z!{A?pZQE~<=;#U-&ij@|2F$3`TnRf~h*^_HR{2rl@VtALW%n%fW8G4P&rOB=fj5>- zr<>qQZ9ptH47aA%el_M4Q6S&=a=gK-=rhwG3SvGS3X*M}xPl)G`5r_gkI-dvhC^G8 zm;_YeAH_#9wc&ide%tOJ!Vw4- zz8U&}_A}97_tV{j?vTp%RrB|s#bxO+>INrJumu6FOw+4E5JOldv(!V zKEEC+9&%ZK$^?=>9$wX_UrKWnG{CtUx;Ek<3&=3tRDl?tz@)x;2gK9V0xeCe)gqhl z06FT#k6eQ6LmO}ggXC%iuyr|THEX^yYo+XpY>JZ|sCX?6-l^eJv@RfL1fUY7PzkI& z)IxT9o7sk_Qfd~=!@%P6zp`%Ws3oKP_U$mOxSTbH==Aah+?aDv_4IQ`H4`pBdr({E zYnxPw^c{P!+HXz%9w9rUO6{ar0_>*pO4HS6?;Y&FzA>ThdhUHKR@OiAWc@C$G+Ak9 zn+{T!0Uj}Z(Iz!4HpbyYU7FRmD+w=r7r!1hg=2o!r2298Suse2Ha#0?{(?i=jsN|Y zGY+_M`eESPH_spY>yLQs8*J%#mRu1B-fIm4ywg#L=l`JR`i|V^-aqlJ>Mu6Cv1B!0 z4iV=HXwsV;Nz}q5I{DHrVXZoHJ!-*x%VWMfNw@IPV5gu19axrnY`-Q`>-+HHj!ATC z69V$0|Lfp~*P|0JKW3}POkW={J+&9#w6DI+*gt`zvH^Y=P$apov32a4`u=(Oq}iHF z@`3r6E;ssao%sB|)9%%;$U|d!Rw_xIjS3{TVwU-uP$Rw3W$gN`|3H#QuEW-+TNkD` z-yQesb@mZ=&kNjB(|+*lLrK2@#f#-824(TDSBo+$2v3BoZ&TjprY;WXs@V2-z9%$Y za_U)~Zhw(=!>9D>o}L!wJ4ts zC)5~>idrcm%42FZMm0? z)g#xCXI@|*mElk{CNeGHchFgM>{OxhAQ2HZk_va~PcY0-;0;7u_eQEjq*w zXv}FmqCSI}2l-~!lb+a4;YIN}1bWKkW9a;=72)P~=zy%Bxn%_+!mxJV?Nlj58%!p9 zd8nP^UXrDc$=BJk%KXU^?CdjZ+Dzgc*@hC!>A-&1?DclM@hM5tiNt8pu)kTgnFUWdQ6U0t-Ei|2 zJE{IC(E*L`rZNoKxC4N=&KTc}CG;Y_)B#hF?B=53+eD%VO=<^l$t-pd+9f10Y;Lf8 z`Yi5>rYx0jFf}zXGK*Lf&O*xNMjwXpvXH4QeZ{Mz`CxJz-SBnRPLw)zx;Lp0^p!75 z(t~|vlO&@!LQBu}rfCl1@!O>RT($&hN9^xO@kQ{bM12N1XIc4RijO>c*O_kRg=$|} zF>4P7wGBw?Nc|Z=S6Ju`N2wR{`j<|&@Aw0=CV(=%g{_kR(_MtT|LGosNy7j&647+e zs&b;`lZp|Y18Nyljs8W{{u%E?i(A5ECpthKz(d1-Q+e3M--$Rc5Gsp8z{BS@oZBdF z1+SvAQ`jRp>}Jj+5IR~9Ne`pw{@^DT9iD5BH6b}_*R_;w|?t&?$(U% zZ)<7Id^A>*Z3?a{!aowvLTW<-xQDa3JdINcy#MhcUz`fQ)ExccKKy3chnLKsyPOI- z4fr9Ppw%^zP0akSg(Gvj`cE6(g|!AuG)Widzr8b)f|oT`kFH$eWo+(TFK4T3_3S+# z)&2C*=Ri<{gYigcI`>^Qm0mvq=+JP=j-iUwZ(IB{4t!x zcIo6Li8u|<^&QPjkE?cG*L_)knQglgOrLiI!08#dVTQP@0H@#OyudR!2EOHTN``I^5v^8-6pO~EIvFdUHsH9r&7pB z!kY7V-^S3Uv5~+b`e}3FLxZfl0TItmk(#Q{$}A(CNp@_35wT%QLZu}t=wQm(Z;8)v zvho<9DTX&yh!S2hWJ#JenJQ5Mu7DTKp|hJpR0ihLkE|w+Y6-24jS`2POa&q39$4kc^*)~K zoL=ww*&YPcpH|oYS?DlT3{Hw2ykfU6n4SUKv3UL}xZ9(!Vf+@%VaMrk*9>c}+lh^{ z>D|3_znk1KP(lwZ>A5{9HocUpH~7SUmdc2&|NK9U&BZSwwo(H`M~a^qTOF^{@FcLV z*3d>pv{!nT7J8G_BCr5wdNVDjM;N*1+7^Ea)n=|JHG?(FPQR)+0N_aIJ6W-0R_|=^ zmAc$Bq5Xd!T9(l~)CE4}q*x(P^Uvv}14wnDtB-`8Gxw2{M^kWx@xL*kN{%VMQMBSc zaQ@mTH*41o+J$+X8jj6}2onaM`cIrWNICz&tCT)Azq(q65N@oB{sS30#2-qgPd&<* zlR+P@PO7IFW{)5>c=xW(NrdlW$I>kv6$gu~Ug;*lW?bg1nrM({RdR zq=^=6LHKMHqwHkA6WN@OrVq}BZRZitOyFimkeb>5-MitO)h&8rC`@$=nElm@jMS}D=o^~SXl}D&~TmBN$J`pc@ zyMp~t|EFp&F8kbx_Ti7Au#XX}g`)K`Syv|c%{O|G2}}$pB# zwzExteRC4%JUJ_o6K=N@Me)2hT~CqpY%L=P<6O@i`WC|+Ko4(z~f?->1Czslz* zVD971+V8TLz*ahykn6a~tp<_Fyj30C>+_nliHAy?G=S{Rp0mXT(Pvi>Kp+U+eB>Ge zoSugz?By##lIY{NAbk~o3~7sV$!B-Sb;yQ1A1^MD)kOT!vq7`ALoi~b2e0D15J7JYIkEC{=M~r2U zJXAvaH+_1WdZmrb1ubz9h!xc8lou1Uk7Eh6KB%<#oj>k`0*?@77DZ1#Gul>Eg7BHJ zs@ist75ViS>1Q@VL9xH=9%XU6pG_wZLknQsZqic*e;KHy&Dh;;(LaO3%*Y;P!Q_Q3 znZ?YT_Z-r7kK{VYl@5De-JLaXQo5i#TROh5EpkxL2-0TAlFeSuZ+1``@H}C9?%@gO zs;lR<3m9*7v6fyWHfPC4EnQ_Xb4F#9w`Vvq@Q?_ybL49D?9<@#3+LanZ_mv9y8a7y z`D0j|C4b)XGAG1#6UzVfZZvWw2@9P6dX{GnI25hyw~hGs*e`t}FakpGX-Ddh+}?ev*ZX$x=<906FRi`fXvZfq^7m;5Bxx=i2uN#GP03YU&F{;^ z(*cAvh+~-jQw==(@-_(x#_Qk^-51~ww-OsjtX||BOaqB^(+b7!(9zubv$rOzHeu6fM%FbH0&ED zoYEmICULRiKBi(YGO#*vKk)3Lr_iXjFYjJ#+XJ=UNAEk>Q|gLYAN;#4aqXWLJ+g4^ z=pj@6Yme7od|C>~Ukkjp?|x1DYlVNJF0t&wQhfUu*p72`QDgVjb9E{IyB~bXzGpV< z&HH;MCoA}QdO!X=fBEpbVKMPSv{Bl#nh}LScjK^Cps(8Q`@*cQ7_m4j z-6{2|WUS~J3FI7w(w=f<;>9IF*({%g*2sS|uLdp-pR08D2*D&9DAuIxgV|V~SAAbc z{TyA`I1*TwI4y4SiJ7Sno zK+$g(#IL+{3r<30>VCn8<+_(N%Z?#Q(oMYHDnEay=7$s6Rw`FMF$khpL^HFi^=R=* zS$0u!GB|1*fTBD{7J2046WFV>+`UIt z?WR|F&bAg`3yb0|RD05Fr63~^H4}M4hT~bnMkZPuT=YdP^S%$joM$S=$i8YBPH zyBd5WRDkqHOx7tKP)yOi@#>w1-0gu2IdyoRcqk9IS>e~+19sf9gee~;M*DxjZLg3l zltd?DMlXp^Z~nR;d}!iTtYpIV0BSE8=d8vCO@?QV8{W=Suc=IOZ zaRJWYAfpk5RgGcl5!!KMdmAlQ(-yYh&5w;5-D-3j-8yjF=3;MXZN6Raj4NUm6Qm80P48_vYwd4}#17Y%(g5#(9szTMq?2Cw23dcrzY)D>;-g=ThRU!=XMW`7jc9q%z7P9fownY_Uv3@N`g6L*04X>^ zzT=X;R*C_jVk0xsCb`XUbs-BGl`!(mtSmr_ByHtfQk8?11vrC0wCl-|BuhJ@EaU9$|h zf0~dC1DD>X)LxzFaOa5BwjT%HlwOFU`DQ_Y+mX~7ce;m0x3)#;^E!_0oLinUv#>X$ zgQ&$fSd98IT= zp>^J+j#!qg2xql2tVe3vv4A2YgaDWAM~~oUKI0Ugy_ar>A6gQF$zQ+j8MRUhlJ!Sp zbEc=i-q9X@rm5PI!Zc`Pme7q5>g#3>YJtzTZb7iz=Wma?!$DaDBrRH2o-kv(b+?wL z2a_KMRkb3z-qXF%>L$&u=sbixzRV~=2?=@5+Wf) zIf)gs=}cG0BS&9yKA!vRsPIzf6|HON;>lM6MVgJLaWE&uu)VQ0BcUsP@894iw`xMW zhG(45^twAn7X$+7C1n1>K8}vJ5L(M))aCJ<7o+y!HR+Bz+y{)Ab#!eMyvgKcf3n)V zy=2R&%)HYb_m8f$N&lg85VJcX{wOQ#4wPY~v{@TN`aZ_b&k~7t7m7!*FMbq(v@&E4 z-+34Qu0qS93y1PjtONO1Y`S>Nga^G;D(v!cNz(|W#ZuqpFbHLF18j_6lNZjsC3NjS z5YmOFhBKr6IideCo&EqoE1-|aZf(y)NJu6$2)UVHFU|hR1nKJz!W%1ky{z(ghhv+uorxO6`lm1GXxNqza*=ER-y14kmUvq+j zj*h=h8n^oxXl10>G6J6EKIPh)PCq@P-cO+t8<_UuFpe*WN z5>@nB3zK__#`$2qGFE&Y_#7YyVK!z`rv8XWXOO!tjp{gAOD~(rPj7~m`Ds>b+-~|| z)iTpi?{#2ge9P#g&HY1(RylP(h&nH#+Q}JT~Ku#C<5qZ=Y&cn1s{?EeK?* z1X&zU0KBo*R#}!P)S)c9c5G2YkXO75k;};&gTpoZm7+lYJ@IK1W3!S*{yN61+l5cG z!gY3E2pM>J%ugWq4T`K=VAygw@JZeK;rvJGvJplo-QFU1xYL?#8;QybG9fp0R#>a1 z!+}#VZfyk^reb@@e}FgJ$2Z1$3fidL@$k%CavchYpX1=_?`_Umle#P+5gnBC2Vs9n zWWb+V^mEe%qI*)2=^h}lG0k3qV*KYP@^RRY@Kxo1?1vKKUWtoh6l;osKF85Q-ZT5o zMgh|#`51kt$OGT>CuTcp+(R1*1sQd@vDlaWHv};Wncj4+RS|o-HzZAS z9)lZ9N@>DnvcN({iOcq7cKwwD`;Y$X64XhgN?tN^sEWQ)WVbKEXTl_6XC4H>sf+I% zN-~Msj2=UVSxmmM?to2DbFH;^2~8UuenEGz)+|ClKf^T!^`v|~%4yJP=nc>aa((0|lKqU<|M)e;K z-Flc?J3A`#sX>C$+AR$SjtW2=GM;@~*U4Z&oX_$#n8YK@Vtj_w0*2b~=s5*=C0`?c z>0Vq*ltE>FptS7A$fO>UB;G6%YF3#r;3Dg$jBqQH;3L{f~`i%Zu#&2+5J zUt3)QTl;C&CahB;#luw{&IN#!+va|bvJX`&Ik@nUENVAAw4BTm>w+2P0|Ytfi^XYM zTk+dZEOFhIpKbHZFJn^obyiTf?n0f4HzsZSR6Q#0jM_nFjT~YD82NF3jmToMwD-o} zi9$M!0z7o+lh3WoQoKs38{R{g#jgx7%kV-m^ikWZmZ!8arT^~WxC-%a?nE^o9kRGw=wUgkqlsmK+^~DVD{1~J zHsKo#Jk2gYkaD_A3*&o-uE0*{S%KsUd(n?jc&?d4*MA@_ABG+PIutB1itUMnNvIi= zPcDk*y*CP1>1bp$Q&>mY^_tbmu-0fs6w2pb4(Qdm8?H!qP+9;7P2^OTEfvMdek7bioQ%r0rt@r)!Cib%755RHfc7Nf0K`wS;Yo-}Lx- z=yiQoNV5+fZ)Vrteg30WT9w@yj6k6@fS(P787$@xKa!zXb|e&09IiKuGHwnGb=|#Z zePti*g0v(~Kn}bu#<{kOpNnD|xKiw<;>x0z zPJSwCzzJCi0O#ukpiG+mtThN9_gF&&-6+Mrl2y>p>5;i+13%$0Z#7TSqkzmJ;adZO zNyv{}c1W4J#k+bEZncDVEaXqz+5+Tn)Z}92nKOyMchyPQQx$^_(rpk9cT(7&=-J;k z7Z4|y2yuE8#{5f56kx;>U&_NlODx>2!}W9o#@S4(G&OS0dRUc3Yi(1_t;#P7aNy{X zEJqo2#{h-I=*a-QSwm~g_2x?oys#(j-Vx*@506`1vD<$J0*zb%+&GbS{=vrX9GbFrlX)&M2XmoToj*@p#N~=AzE_D$ zo#cykN2;aT;@WwL=Z7SIoz`u$?Fou>`&4sfe^a;Qu&;tX@Q9arF*foy@4K$gw|#lq zZdRD=)9<~SGz)wGkD_yrXR`nQ_-2^H%pq#K4bvvaTSjSfraPzP6iG=!Nkuj}hm9PY zF{0BN<=nw3g;H&)Z6qrcAx)d+ob#dZ{awHR_UHB3W4k_w_v`h1PP}jJJbP@lC!ca+ zeEDDFB*~BM&vQ)wTOB>z5bBs`x2=L}rh+OcQ-+rBb0S~7-}E!S`o8u2nh`Tf>ZDW- zpFm*Gnekn}dpjfDqt^}+hx1Pd77GXD6^As=v|UEG++1zDKNxjDt5s3XGW0JhrrtfP zTS>oAXUXCBA|{Ay1)BqIG#pc5acUi1jkl31r#fFEhj1J-3cqH{!n=qy(^ z*QYjukkEuTaPeTj3wBK8*_UUQsZ0K<{?ajcS3TyKIc8%uIBEL=iw0`t)6^ zdQ>oD80ib|Rg+;k!aRVO=)w|_rWkTK0~{ZaUg(;>oxm5bl-Jui>k_s#1xxEkn-1?B zmES$4d~Sm^PO)>e(?ts?tuS%=5ww(?6f>0mcOvu3f6p0#~)%Iv%waFrQfJ z>L_oi6yn{K!na2=iNeJr-Hzo zN7HGonm;Nf!-^Q`bgo-!X)mMhhl#y`M1oNqj%}-lANN3oX*9mqmH~|fUoJrDc2(my zviX6D^N!KXaJV_K5Z6VPP72XvP`C6tJMj~)WIT{s8M<{6e`+z|_p{uMRyX7CgW7gL z_@)lHD1Tcwl5tQ)3=bLM5{428x<7zcuLo;*5fIH6z&)aKiB=3j(3xc5#nOM&afOat z(=T+Wd~oJfG^O)sAw2o{n`HC`=M- zIITGe|6?$UTD5+1WVzP1d%GAenDae86#86JDs%a@zeBIh8Drn;B}d93=f6{ie|2_p zKGPITOwGTXDy;DXOPJ_dF(i`mS_NUm<#HOBJ9(f)Qb%2L$rQ=C*n5k&ib<@Li#z z=rqO1L*{nhIg@TKht;|CMa}wvMQRhSS=a-K8JMSlf=o@#Di_aWVi9Dx*-06b6ZYB{$ETZ(~F8$8l-t#}uwYvcac3Qr_aUuAb(=|4F z!_ShY7?rpN3W|RDdYvHHzaAqvh3RN1;>M+(y;SY_!auJ&+O4P8^|M%^CHgsd;uSyA zmvwr-TnuPj}^A9bZ*voPL9_axi6ry;z|mG^sy*q>P}=QRCnKjlE2?P zK$m^xkT-R1=p&~YC?ZWyuRRPM$x$_q7uE|)xuXnOsAMev;Tm_nFE)*Rv)iD|Sd0#f zMY7O4@?VkdtYAwYF(&%dGUFdH;1ToriZnYYer1YCf3H2*Ap%@wO64FSBPDFI$n`Lo zMr0zE`Bi4in;AIuXl*&DqtR1+==~noWnPd?+iGU@}Uy0~(cZcetk`xED?m4>{z`u^ckC~4IkmY0f-@j8~XA){S-`CYi z&Y%~wzEHewOF+!ZPqJxBfRYJ)Eb2I=Q+Gmf{0JJRWLEU)>MI_P z=EG}xVyiQWWcQ?H6*b2g<`D&_sWH%M_x_(; zjps#l3ZP+yE1n)$3Uxg|?zMbAQ@AE+87Ad_Yt^WlN+$k(%Ok;+^aiCR3BKsXhp)@D z98wJqE-7`CoVE0!8b=rXp);rp8++VGL_0A>EyzEb_s++E+B>RUe(3z|v$Ak${~LPa zG|)y;Shbfc?eMIO+`f!Zhstrud1TInbmAKKQ$JZkMpC03b^uZuAbzqZUJ#-cuXH?` zT`|)6`MbJyixI2v=)cdTO-&EO!U}d_SE^@@aeOtLwVjGvzzqj*J$O*8polf;TA@^S zCXr6vL3@|V{CQ)QODv);6j8&L_BFOjR(+*Q-VOAn`vXHHDokRKB_JnA-hS<)>!+>zjj-QQP{fprR(`$pmVU_T6|~!urIK5= z-x=LB83T8dU6lM+KMIw3HX(=-oq#dq@dGF^nA{T=&37M>5U7!*d>9Lh%VIzsn0i8J zyy+z|JwMSfJQC3UpL}f)wNv9MKKUhYGVh*x-3s7a8OUl^H;6yBz5R32Tj#~UO;Wi_J?g?@!#gs?hwe7Nf#$QUfA)`o@^{eMx~ z`nK@j1VyY1U7Z;cY3ZzJ1scrI03z zWN{ol2CNBdtL4@txGW2g?LTw?FT2Oz6Ypiv>`@$90a*|FA4n0o-=I;saDtHh_=IWQ zEliciPx}>dZc4X8rC&G4?e0PFH2;b2N2VV(-%V}GY`_|Kt@Vuo!q(9VnRTncQ6w{u2- ztScxg;cASvUmtlF&-fvE^UahK)S4iQsskzB4gww-yC}3NiLK;)8y{hD+4$kai{I$FCJ>2 z=cfN&scI;l?fYi6TK8$A5ER`&Z=sOusmzMFdgik?>g!?ewUn*^hQ|}}rFP6k&IJF_ zMB{~t{rIo@+0r@%PtUYqq`jzfJx8HK`!360OoXQIz3NZAe}O&}$X!j|d$h)9{wMBCm z%<-I*bQ*pvSMRf@V~vjqwHWa>MiPX_iyL%@xqFCMYIoc&Y~fL~xZav}UKdmh5}{zY z9y5M*+2#ern&ZUdo~YO7zO?1X>p;kkpGGo9@QAhATe1+1hww3EEaiC!(H;I1|2@5P z69;50jBW|XH!_9vqAlBh;;=jVtfB`6sef9l^%ofinf^)}cMt!jM*dsKE&UB?rm8q= z$W|#e!JZmrcSMdKp$*$@_@uHD#TbaST~&c}H%cH@xA$TTH@sEsy&a=sX{L&o{s*!+ z^)fD~M$(w|`-R(U7qMh$6s`bRpDMKs^QtYg&ymOv$qbNmbXo!*yWn-h%`^>cNPlK` z4%)KFx499+8;Td9La*>Q{(LU>_tPQgb!s1%RZa7OOajSLT5{u^Nc9g`weP#7I$+vR zCNwafje^BZ9x+h9MNea)&e)$Wo9!X2ZiW-{TJbB8vMI}Lt$Rj}UhVC-1EjWu>A&FC zt(Hwu@jQN6#mx_wr1GI9>Z+Ufwh}>h{1fJx3LI0j^nsd7ny&35`W${V++;g({;g?1-AR;;b zcPV#yoWvTphtx%Pu5LCNm}>eC33hV0zCp_JQr7CgT5A2ec}4lZI78Hqw!?e;(?roN zOn}E7n3ge~u3T&+w-Z9yvZ*Q{gSFyO=`B{w+rUM?+^ME9=i{GCafQ9uyA<04wjC^u zr2@+k15K;VZqXj>>F=hO1j4Ck<{;a8$-|dDbC5blR!?NUIlc7pT;Pf8IZxc3O`LVS z%UV!WfXY7|cz;a8_sSFKiI?;nIR%_X+<)F(<>y9VqM~Lv(4>pnM)&oUKMIe^&@Q{1 zdbh;rU|19Zzc!bg>6rLRbN$=kX{{UAv#Iu|hh#fRCE~y^a5_2>Dx7eP4`8Nt*6)j5 zI_P{ddV_4S@lpl?k*u+9=zt(J6w$HS4@`5Y3e_R1uqnaTN3n`w2ocj zA-Tep*-2MfAPm9?rAa4>7q)#pfEMp^;4@B&Y?S&-Vz>3m|QNS67O}~H*ns3Xtzi2eM_buOMzW{+}!Wq ziTFu=0HYxMcD4nj0n`=M5pHl)A!9{z^9tAXJi+$Byda37AKu1cqsfd~RIVRmCn ze|B+BS(J9G`>_&d(6Yf?6iwlwneiyH#C!P`0#YX9S~@{;(SCyzj|N!VV50AcIws?T zlIh3U{Jw?qDx1~g44N}4aeJTixxxT0M&)*Vd5~7-$U7QYsT|s3ZQ z%plF+r@Bw3FIR@<(SbSOhI+|v8dp+$9`gzGitziJqdEwVC?2&7lqF!aGHsf(Fc5-9 zqE@};y$kVviI48Rj?Nz~-FKB6g}{)VH|&KV2(4H$!|R^iZXJBKDhh@I`Yzszt-4S4 zQA${yR-mZ1*&oaw#b_+qt|!IY=ZurqR><%7CYF0gm*n?7@Oagp2FKA0{B(7T1`15f zv=3p)A#yc-Qn8KD*NWPWT>F_sa>t^6M;$3nQ@-UWGeP$bj_m9OgeW7wVA(BI18B8V z_x5E?^c~s(M|hp7OVD`s2r0^@y4wBPU-01@J*ttgSN@JsQ5Ip=Jsv{m zL<+|Vpjp}86t4H;&q2ewoPz*UxL-r(BwwSgQ}~1+r?0~fa+b{Q9Kq|-+M}0Qn3@md z;UaqTqKxM*#OBtP{<{JK(u%eVk9l)iJne->a*Z)K)#UFl0NfP|uU@Svj%U_RR| zK7%}jEe8eUwOOSdjFJ(+#mFNyYQ7SYkiFzOvu2dA3Ve{ES+PiXyV(Yd*N$#6IFOj% zp?cd&AP9+?0*Hbe@9}zgMSW!+X+zr_MkyANpl(5hibucTzMqj2>iCiW(i8(ih1U5; zItrj5&vAQAh<%hS!MpaRuDq2gBuF6`Kpvsrb>>w-@9C{}wUnoTmoBwG-(rHT2B+Vfp) zB+rU#v?p{1+;kTL9U4+;MOFhQtJzJw&s3pYVp!dQFoKmR=A$G?=6iprp67kXM9TWg z>b|c%_TmA^9OLh*tD6=c7Qq(hiENwRm`{}>B9ZJ7MXyg+HYc|)8rr$GIXa|Si&{RmGp-DCvF6b< zW@Gli4!tYKB+bmf3@^@V5ct?-j_g#@eu=$Z?96^_e!DeZD?d`S@DT~pW1*u)?tRbl zuy?LwwNkqZ^%OL}C=|eD|4rM)1Q^;u^Woi;hTi5wvg{F8sS#NSHS*79dz${y^Oh}Q zwAzLp$0>y=wiPvt1QdX4Lv#B7wq2p1;FTH;XzK+!Z=>j3DUV1QYhs56$g6$!oL6%* z-oRd+3}tTpNwZEkv)l9_xVa$CAi}0&o|B+DLroOZ%nHo5Qw`1>HH4@;-$m?&OSE00 z#dm793Yl#an;WkGrI`kVM!FTVptQs_wwT7O^OZA|7;k9B!`^)8v;BInIrVCOP`g}q z^Mvb@$FzsBk2WS=k_D&;;XVii^pPm{6xOuiKI}4O_Tttt2^U>SX4K&wOc7`H((3=G7(UoH86q{N)$NasFcph ze(ImZuwDj8oaP=4w4Z;BxfQzU$&WuW&CZ-y6U|4nd*ZGCgq0!ggFC;smg(@|yMn~% zLLBvfAlyJxX5h7}_hW&FS0$MyMNa~$g$f?)Z^u&rL=40y^sdh3HIXHa4mci-v;!5A zh|QYL6F=_MnRmT8&^^eC3F2ZGXr{6#xNtE=aKKo0?4z&tGuB^#{@5b_&d5 z?A_x8hs<43V=_j&tf*Izo{4``!grW9rN8O+K`XH&Kq5_9Hg|dhj}IvB`8w`%Hn-3s zWOJnw0*bL=knF8|&t2MSG*v~AW6H>~y9(f7$)#5CrhkjAtuQ$Y5_-F-9XPc2obMEFWmgEc9vgB;&k0^Yvt9f+}_eYjvYhYCH@R3PF{! zI2Adzv6cRW!Jg>B$d09PNVvcssqzExcGD~R^XWP^TP;u{2GH~>(~#9DWAhDf+)DXYLBO(dMR zx|8s|B-rIcm~DKhSoIxJw(HvBH`qA>2rcF9d^!5}kI~}XbjsS7^qd16go?{s`ts_w z&siUdCkQbSMBN*b|70JWdQTb87{l&r&5l2Qy(#ud6S#d59U9740|+)h*Xh2N!}Sw*7LK>HPf6y z7AJ}aGJ4FLYNOAPG~;X-bl;uhkz+B1`-=mVX3F#d!XmR& zc@X*BBrUy#gVJ0$6^+w8Id!U&r7!7 zf{m`Lrk$?{Ae>pV=XZ%u++6RRha_e~wE4bdKqNXtmY zQ36IflyqUoqhxl!I{nTDVNrE&&;4qCShRWRMbtoAuV|zO)>MKKNumy7n5-C%LR_H> z>U^&=8{-*z?%dEri^7ZImnRSBL`KX!dEjqcb>rl_hZR=cCaoVr3*OWG@EbW+(Scjm z@4}_t_xEnZF8p_ne!I9tJIw{pQjbl4`Pr$rJx$M8_twd`lyUlIjSv!Td4>Cv_};+6 z^pQ4<_OicrL}o=zVf@LLdmlQkJc)>joXH1zYN|cQ&&ncE3*7rWfltZO$x%C<=b=nl zU)PZ=6(a^HN@&aP4_XX=`W|cQ0x*7#s9(Brc8Imc+f3!FZpZU5Pzcj$>`&Ne*$6h& zo5vyb?h97g4zj%Ue2$SBLg@ipvv&kNcxgQIP9n?n+9JQpTu2a5258^2acRfH?rmUe zIewc()UVdSpSN1oqxcBl#{=t@<&mw0AHv+%$Q;hcN!`xqYze3IKIWbN6U*+tSB(A~x=# zmW8FKgD(VR-mtx^tSljD{;v@Y905tbH}hDG{Hro7!<`=sLELZ&`{t`73mmW{klWU} zZ}5c022l!}K`kDOmeGfc#YlpdxrcRlHZp4Nvvgk8x7>>PKnM0O09vjge)t-LX(aN;%6u*g7zMU;h5hFUf zG@XoINl>UUn(5F1$sP|WKix=I26G)!pW1OJgJ~Wu6BKILR_tu7S_CkBqQADxKHhuj z{`Hf8E#>2N|AqA#UMl%d&H*w4YGZSqP?{GFPPQ6rEO+b+yxNdas2WuF@Lk^eN~cx+ zYQpRZCAO7UrI7o#m{c=UVc5z6Su45;2bUipv|F+d$w}q77?c$;FEF1y3Y^}>PfE6Q zc@6%jrSK)7apfdx-L373-*|OtvSjB_Ow);>w{*lW<1Xy*D;g<ZBQW)=4A8R<-bw)eD*aT!%kZZBZe-_~P zA!Pw+Vl#O~PW@j-VRZhzmvNgHZUuD@#tgwF=*>)vQr>phw7ZT&9ytyAv8@RX-Ixo{ zZq@!3@7w;iBH^NOUwiGDJ<)}SLp9q&(0xCm&nh`jwxF|cMT?o9od3^xn%CS)KoA~jq_kSR^xu!wMZ%#?cn$p34p0(WD`|Y#4 z;9ZV79&2!4+a2=88x%Rr`h)y*b#LV$f{ENLw;r;Lyln0iu7yR#gmA?HTJN^vr?&N8 zgm1~)#SNbJl!~8X_`vTFmP%5&xf@0kk_wUgQlQr zgLQ8YU1Z2-ewE(&&b&MSN!H@?<2!a@VC}*x_gz|7lE&pD><${#nV91EV*|C5Lunvg z15$f_V6v@TJouhX{D7@~s(zY;og|ZF-M_}uP;e?#ZY9a~@b@1ts7Aw0lE$)HYAWTV zWusKhWua&=m6{4LJS-FjXDnu?OUraOdLvJpn$A?$L_Az*uGr-2wm~p>YilWeKV0WC z_jrO13XK5i&Gw^0L-J3Ae}FrfDVJa}tpv2&d~9-(_hy+AL;^3oKVAB@7)d3nsJ{Ck zHX`Zspi+RLt^d!MyUfIZH}-0SiuB@#Oauafv5s=YtzgoR1a-Optbmba*&wpn?@tWP z)(QlG@`njle*fuhh?;yRbiBl4Nk{}O4AzmL(EM?Sref@)7xg^E(i;pDk7rL20Ns@@ zR>|cQ7abHi*$-$(`%s>a5DDiAr+RCBc|)n-U=<7HJ$^tA(vBMlXsf1hh2eIQxpkk* zuaZ$Av<+008C#gnltNnCk35#e=)?+^ivDQ12B_E#0p58l`sl5>>zUoeGD(|V7pP%m zVEY+mjmz~_G50B)ZI6&lJI;va2MQN-bKT~!(ntASM6#^SJ-CN!IMT=iA(^4@>7Uzn z-%-Jb7Ds)pINN8?2Ne1kP|Ri2ij|y0w_1*)F$S2y=}Gty`$KNZMcwX2Th zX#5S@0@e|C!fX*U3+Tn>;lRWHr0v+SIBciD%A zIX=<-JNnmjH99(oEKlgi&f#^ft{XurBLyBP`- z71tvtKkmQ!q&E`&H~$XwR^-{t1z=2-%Z$5pV)Ut98O!=t?H}7$>VXoj|I4y9qH`XbeIhx$c1*x)KI6w% zzcU|I|9m;-QQKGizY+J^xj_Yu!&C3TC7z0S?epIV{SU30>`n2dYeY_+&;q}nRJ)+QKe{(~6zMKuv9|BtvmNknOZ2gbl`O#6L z6Ld;XztE(@@x8BW%~evnNQ|LV?=14u|9A%sdI(S6Hja#JKPNmEZXCM%ys*gT1R^fN zG0&>C^KBz;jLd?xuHUR_KG3ipD49E|rKs3IQS!&cx?Mh70Bblm(t)l2$cZi*o>x4` zVguvRje+ZC1Y^?OyOP?HRH~2$;>d6k<20Zxc`yA4oP;12un^VjT4_Q9=81vs-R=j@ zw4fS$oB|y!qClHw+!Ll|?7sl7K-f$7k7XR_&Q*pOn%e_h`utSV$=3IVhN8%$dBe9Z z`w*aXj$#1G0v7w;OeZDC(f;lIpjM3~ni+RP;Q5Up8gIk)(S5;ayS%hrxJRb*W^7Gz z3VwNCMvmcjV}X)0+&6T}F;yio_D^nNL0hLUQbdK#yW=)!X7-5SO4mj<8=d9nW~!0<^zp(y#=ubd%iuLEbKhi@O3l6oOv+F_VU+dcwTgm%l>Y^j$mb;%aF z*i-BqLMTBy3-z<)Yr?-3xrcmhTs#kOJkuT`VAPuq2s-}~N$R5W{oDfpv)XYLF>&%%fjaQbM@l)XsNs4w(hlC6fBWab6*$>F_RcJdGdu$ zTmSx(hW;TZi|_o}f8#~ujjF9I>)81Oj*NV1-MLEK)4sZ}yl$O;2dlIU5XN&*_1D$? zik08Z4>0Fsh816*4Rrhkdfvwf)5>xu)c2GsTs2%TO4ven)&fQj^Dt@lwA{6?{gto;g3GHpB z7z5|~ul>Y{HP))4712UE-%4&f)5|>LY>4^+EbdfBwh(iEa$VS>tG0P>m-;>X&XELN zC>3R#_-A3-Zgre8`$@UTvo$0KNkI;cX96MzuK`S*Nqi5kx6&JglVT0u>OTOluD_(r z0h|pVwPA@W&fG2;G)%~}NG*Lpc18%o23o9BEf9}MbL!Mg2S^hxKomu?ENDlC(zy>q zo8u!YCGBn;JM|;$Qy4P}yiytLtQ-5&Jst%q8lDD(?~K`CVlg-isjf-HM2Ex+RuJ06~q6b44 zI2JKw4KQ^Qh@j22T4qg7|9-EpVTVm~mql>LJuK}{zj&`o9y^Izbd1OM5QKB9`{BPf zXy$Y18zU9WG8Bp`&>l89*IQ~KQ=A`AKrNWzmeUI5k6E~}gT{Xc8 zNRG7(aN`yul2be0;NXG~H6jE8rNp&q_Qva~Th)Xiw%;#a$f9u~c*5e2jAZ&!$V0$F zRGaHOBAb;V_v3~3b(o6BYZHKd*2lMl-tOd^N_(~eqjA6-S*wAso;!Q00?3?}K+lVo z@uF?5uJmS_ixELwUF}g{30XU9YUj;7EKO~{25b4aG4Bpf>TBvb{y?nwOW$9@I360l zs?p?#d+&_M1SwOBA)rJEWyaPv(%|v&go-Exc#$j(5Uo>fQhP484bUdk%BO*Uo^A5nf_H;`ih)CKRL2{2sN@w%Kl{WKel=S? zBNp8jY442?r8u?JUHI%Z9K}bX$VtL^_U1*3qmJ*WJ*u(+qG)XAZ;wRXd*4D^XZ?B+ zhc(+>R%p`J6X(dn{T>9jELtTl{kOLd@(>&1xXc%%rFHXA&zJ=OnPVJZltUJ+VF=X)G2{sHudi_#vFpeZ(Q#-dkZfmV0v)OtQKkGkl(w$5=Vv_dpP@1dKop2^Cd(ME{Nd6D zZBZ4K29!8b?meaHLsTkMUN)pe3?e~mwg-nO=_QcY1eVpGrQY%-7p*-k|Ksg%2|A!N zPn*;12ng`2@NLhd&mG?TQfRig9aeSHCZ>d`*UQESg02mJ(Epc*6<4?Nr|op_vw4El zT`7vw-WKeeXyXv<4ZW^xXV^QH)Ncp*qdc7t$$xzc7&DJH(*a zjA1rQo`v86Kxyjl#yz2Hv4pB2J;Ly1%0)@nH} z#^C9mcov&G#tF}uPYG7emr87yrqUTPs@Ecrk@hU0*s<}^TEk_qEsyNoT|~_Q zywlMY@kDQwYvbRJNDl&+pj(Yz;#l7}p`LluXW9(NZc zv<*u(`yn@pLBDlyKE>;#z5#Nx_d%jqq!nEH>_~;QWXQTRN+q6?OxS%x$wiRKo^jb% z=h#m(_t@M0pATKl6XXY+E+p6ZN2z@d4MvO7SVNojah)diV!Y%Pjm9;{@Qh4Hq(8}F zbJ%W-<}uB0E2E5rp-@q9AbKhX$(uT;+ubgo{jESO-|lEhtxMb*ZR2QU%5*4@M-UaB zLWpHt(85~d$^_v9TfWevt6gD}c8|!vl;ZQ!d3s&+w@LO|_9(UiShdL2kNcW39pztw zW(u7TU&C7!b5dc^)VTL}L(_&4fNFjIX8~j|Dmwq&+MjcGZ2p3Ha65Deb&dOzAf7z@ ziNe>+Li_;_0Au3AXk)6HZ^zYlUC0j<-uJ?jf6Ey{NS~_q5c^(k$T-+UqKM7rfU!7X zoyQaF+fDwrXs@p=WBRn}&l~|eMGXEeTV?+q?)Q{rdgm7r4ci4u)l4w&OzB<8D_rYZ ze+oUnyEdKHEtnNil~S+KX>lQxJLj>~np16^Jn#$RmOd*Kl7AnAs7C&DMBnOMXE3+n)LgfnA6Be&a77?J`%&LY zDN1I0)lMs0!{+w}O3nmmz|qQS$+aCH4wX2}JJ;C{)xJPW6p}nZ3h$KHm04A7g-5a_ zvnMQ`{ybR31%>Hqq#CzYU2{APxP8|>1p5UPZo z79}w|6U%rrS6xLtx_OeF=z?7if(n*T-)z9<<2g>+Z(aL_M z5t9=KwDb)Qq_r8?2fIs~@dPV@Srtzj^LbP50)$LgQJRdWv`1ZnhGM|t8Fz%S`wyX( zJ`eIb!AjE__uCE%gX(Vfp8d8;mxbv~ZO1^znTZj<6&jRP^b& zhZ`v+u+=JzkYyQi{&oRStSm{23nJM8HZivrw|qAH>5{ZOGmmC35>Iz-){f*=sKCwG zqSVsMt{31M-&`ri61Vyv!Gbi$GVObWOuGqv|4d)-vCDgrqihP_+HSc23PQkaeq;Oz zbhJeT&Z>%nJHiza``7~v4b~OWvKVMq*++fOal8IcmzQVpp@JexYX}U?l?)YxJ=Yw@ zX84$l(aO-T6S}*aX05-Y+H_v+pJWMWzIw^VLJaq|0jo~du;@0EgxF;C#<@*S_(_y zdz%n!tH<0ELWbU&?J$)J?s0ttC3qvKp-Lt`F;xaOz7;A4t$1IzrWsaH$EP%sEbyu_ zm8cbf6xu&Ohnp@{HCFdF!{AMTceSYdSdW$U9fdt zIQCMYs2Xk~^>t>G@N>(_>CUkI*GSA>wTuqK$0XBCn29rCmXSu}hXL&x&v{P1Pzyd4 zi0c)9ZO4T@>>xgw+*x$};@!VjqWCI=W8mBNpkfT2gRi~1KcqICsr7kgf8KvnLr+TX zss2N&=^WpB9b>0+^Kwu(f&#ch;yb*X2CmvC)Pxh8kHr~dnlnHYx|ah~dEW7-6GpeX ztbD94>!+ez{EoMOpx0x{f7xH9rxUF&KDFD5lWUu=I~C`>YP>-X;39qZQd(;TQHIR*yy_3h zV-fBrEfXSF{ z+6GQmDt4fdf^PWVJbj8Q~P>VG}b)lo#Js$q1~2!y&1Kg~0AGh$9zzPHfU3vE4(gW3Pgqsw~S zQ2eRRz8r96_ScW6YwtEvOyUpv&-1S@^CI>qTl5c3n_tAm&y^%k>H#vpm#$4JPUy7g zQ~8{|5Z#V^mE#u!k*_Z1na`bxs~p*9`H!uUA)xlsV2M!hEK2Um$@tyRGV$7{8s6Pk z24pYw8+>sf=E>B}JFmt+&i<16^6gYlBd7wVtD=(<1co&ERHrO%k= zW=G|B8f5!4b8!nq*J{fwP`T#xk<{q@-#^G2N1{40bn>@}2@SX$Fu z2Eu!M)J{*QY7h5AdZV4_QTfov^co1+D?JP;N+d}q+n29hSZD~)M?W&dp*LC7KWU07 zWr@lzi$Nf11g)Jon7$snTrL@fn}9+pcRwwN*PXkS?NHfdp3Yk(EDtj+C?!_4!BB-? zbIF735hv)6{8Qi8rHCx-UQ~J!gDOhJ9p5#I?R~uWraM#k&ox$i?Atwi(TEnq6SF_039~B)4zWYA6#h zkvEk`{iX_vcj-N4`boVfMu68ZM2R(9?(+TU2!chwbxk$;S-mD>|tW&ovdp>#DNgB|i z>1ncjJZ9R1jh1NRBA_IIv?V@>G7O{8UM1W9SurwS{15~4dc!v=`!B#i6eaq|rmvh>#Mg*JqKZDsPqsMsv}n zt`3flAQn$VX~BkV$hk$+f3N=!#Q1dL$hTub-z2PSK*NP6V^bDF=mXSzS5M6Fv$wPC zy*GOl!FJYwW3b2iy*37|DH{MTT>_4&*0oSn(Yqn!+&7w5>PL$vZ zAhdYqh`iBAzY8lTNx!YNHQ2!c4v;F2M~wS}cJ6mG+@y{)13tllDw$1_C_Mq{(pVb+ z%of|04%{(yKM6$`IWG(6r{5E_(q*L`+Kbb3(YBj{-SlF739$02%r-N)J@1N;)n85gD+)+g&B}t_--m>7EdT zB!xA}wV&+EJ%1=l!Z1`DQIIDl%6aIb!hpDNUm8gw0(6xHp(SeB4^*$62P{)DQ}83w zPTnu$$Rw8Fk~M&AShcz$ymO?+e#D1Pw(kL;iHlAtZT!g+Lv>)O- zvYi4jeNdFYw4L}#HRy7oi?Xx>W%Vjmu%mw`kgVR?EWlTY!jvC8HIcfN@SVcqqcuHr z@3nTa%jH{u)R;lkOFJ%_L5m(?zKX9{=E)J4BuI9uE){J-xrz`vWn6m)gXZT985Azy|>^0cx1pXP#8+Iqi8E>wE`5< zL>bUX3`)@wx^+5A7NIAU8a#@@`Hn9i=$|t%7h7hd;FwnS2? zRrpZJJ!Q>mwwrXSpI*YpZ#?arTlldvVl3gCw@z4?t==JQi(Bk( z`f1b6)2S+(_OH@euN7XO47CgE|E(Q!Ho(MN7T?py@e!#cJxM+?|J%N4KK45C$wjw_ z-*d%RH}-7Yk@;l)MI#IK7l7?=3b!5^x5q5JIo7wWcvbi74v&_cz`ucCW^*m{jk0}q za&b3@+(Mh4HVU|u)i*O!qtJC1)gLOaF%xfwk070!KmIezlwuU0^ZrX<4(Ly_TxDy67dA5F%i~a*`Yq?Mp(g2b#^%>}1{G$2WvcY{w!-G=t(I;1^||4(>O32z zX-(64U*>~|6N?%WXLlaUbZGbxQp476KI?06wF@ zrI>H-+Pq`TE|$qj(RX_E zd0t3`RtWQPJTyOKk}vdwgzRmNIC~BOc(WPlz+hG@!w-EE#LdKGwc6uFih)(>4CO*q z<}H59`u3HrLY%1{KiAQCi)#*)C|Cvuxj^Mi)!Tz~63Bn)0Pyk`10+RN2zco8R zAHfs13ZmCPIYBqz&Ap`4kzy>_@pnOuHHa12@dh!WKjp+zmy-|?5aKT{XkuzKv+B;{ z$0o|r1Cjz12|pFjtv+%3rZw2wStAu7P<-*yGTA#iIIHYK50M*0!|1f=XIYo#tT(FD zD#ThZRj8a^l{QI{eh+l?bYN+QGmWf|cH&6Pp+oMA?{8hOe$4=xksYHu-=7SR994nf z&gFxFP-Mt?D26G^Mqn3)_p4kFy|L5NakGHZ#`U%~aYBpJ?=*LRM2yIXq6*tXK&eLC zsdq%?GLo7z9e_BBnQHN9JjgUufvOy0GV5sIfo4YMwMxQ*zNBlz9@tl4;)N`#OT!!}lzA3vg8ti?ZDaszU9 zE`_^+tY+8K6b-!1%2c3c*3tQ@;-tq%A~c%UJY|f8FD|dIW688eA;vOmptZ*^?Q3Y? z=D}3y+o)NK6FoXFlKj{$7{$gx;&7?kLjQn&_4V)Yp(FNX&L@8EP-|hBVqqXy?N-8M z?=y#oHS#b1T(c`XY3b$fd-jHdC2Ugfcdk3Zn2QJ$IhH z^c!v;EL=mub?IU9NxQ~cufDMsUtU`*yZU)Nv(3s$uzvq~`&>)F3A~gob6qso==n??OM^@u7=!ygmbx!p2L8s3Qn16Ng z7i^x?-E_$~5{zN}bg6d%84wWtwCqB`t9`0Q+1b1tEC!vO(j#6253=D4aBID!s4X>0 zEfeF+br&H3-es0ZWb&LaK`acYIgB`n$TF4T%HSL=!XiExg0;iQ0b1{_>$Z3)<}k#7 zb+>!MDZr~h4q&(1K_Ck%w|OA-1V1=&9EjsCqqL8{K>BN?;Hv@|FU+sk+IYX^OjGE< zk+WpujxsV4@Aa^;9*Tgmu zKmzJ;I?Rh@B(t#D0YhcP z`ux0gOZ-vC7V9q$7G5nzN3a=x6D~v=zj=I(@xuSaIdpgo$6^H=Z}f-ZY+eP?9tEE! z#W50Km37ZxR{MzZM#-^mx1KinJ=BN_d+(E`b_7xf1ww*2SDgu#~C8v zYhUJnHuNA#!;oMbA{U?wvlln>%Fku`GVM<`Q97%Y@gOxvm{sb<^R;%)J;A{*e=YCw z1UO4)afvsy%?_h+w^Qebwhn$sc%Y5YjOdnjx|F<(KR`d!DJquKx{X|5xFfhHz~cGlc@YH-;` zDyd34%bF$I9gRTm_~XV9Uy%?+ElrT(R|QjURP9!2zIIa(;zs}aTvN4?cQ zaq?RLx8d>hmj6JFpWa{nj-D-$BZ8<_wmL4QX*_q$a6so93o@QtoDet~caVZ7ozGmC zPJ=~?vf>IhB963ifb*Hoz^|#3{I5ooBI@vS3;<_|*QRFa1nWRKJszxHCrmN9=~h zxRe9(D7)rHnI@3{HT;Iy+P2h!UH)LWa>EzVkMVnBFZ53z$YB8K-1R)*-$Nf3>wgs;l+_qJPJTsxoSS&*BDFCUE8b@Bmq1Onfxczq3|fxprE=f> zgF8ZnsNpzFnMlSmcz{fvd}PP(r)UkVfz0x0z=gFz;vBz)+iXnnZb2M5VWq&{Zta7u-`lM2yDdLKH(zd2`Nq;e(?D$2m%AFW_nD;q{`kP`9 zPvE_UfXOh|`7k#&kcJp;ne$VI#@0{w)&DoCfk$beGFO z8XG?Hk!dHc1aA2V$ujr3tX;oQBu&JmPq1WR1c`+OusS0sfG0Z(8YGM__0KgAHni`Y zV@t$SeUgmU6+6o`$aa0jA9uijFG`i6a7BA|x{C#74c7Z6!+vxaa{vUlp{}Vi4sO(8 zjan|-0a|4oO-)kxZHk!lpflDK3KNey8!sQXm9{c)%2lRDX%i%U%iiYQ^&)8QlngDO z*Axv*nsx0(kA{2Z3)r+<&l!K@@IDKS5QR@sJB4^LOLii&hsxBt;vS%Wk^_tLe_Y-V z=EFeBijF`+RC3vQd54NE9H9?{p3#x5{yU5S*rG9I$9tQf9d&-P$L}sSw4>{ZHiG*H zG!TVu6Q_=|Z!s+0nG5dw>J+}ut!~Y4ApCg6R6M!}$?8tizb35+E+lXhz3t|T*hU>r zs?lhf-4D}C{I6AH7&zRMlKRa&vhALlO)&GG<%ZT3>wrN7v~@Kwa*(0(Bc)qDK1^}! z4}(QZikBlSkTz(G#kKGlVG;pDTCVW?$QtltX@7c?X2g(&Qq|;O6)mWZ;p4iurz)cP z!#7BCcnV3qnB?QHZsvNh4Dfv;LUA5yZxt_Hkkz9V7&9c`hP4gdm-yFJmcA^#T1Vu_ zyBq>yalF^!W*OP2PRdBtUmBE3V~O@IEFsjaOWOjVdO)Z!**433J1=q6kw5%884nKO zT(PX5it9#TwjFeMx+8qWMLgAlrk3%Ut+0BOo{Y2e(?gd6WKH!%q1M_xp|IYJQ=#&y zU=Qfr+t-25%@xJO#Y+GvqL-=HW1Vy@MTZZj$lF-`ykye>dlZh3aHiMX{on zbQWrD?9n^JaKeqdn5a+Ri35eld74S>%=!;#&1f!6<1)(}{&T4C?LM^u_3tQm`lZX( zI@LKCJz7s>xk7D&c_t)qOx4MIaZk&4f8M3LDpRtEmgR|~2yKE3GBU{|7gn_>aI|=R zMY;rNyV~8RR_pYY1_LdK8wt6tLD*5-VOoK?5T0MZNiEgHRzT3nHmd+bz_O;V?SwHM zyzl){KZU1dVJ(-+5r7Wz0o(8d{u~I@WjLZn=}(w`t|+?YZ1MuFm^an`i}+hsJ^%IM z#E}e}fo4MKnTGg3&(bv4Uw|iAurk#cUPAsYBP(6!3636Wy{y)r_dFVK4u;*rpawO<#DAb(X}EEcldV0^B~jxPSy{)Klq(B5jq8R=DTRkHrt6 zhSmU84f6{mbg52u|7LG8rCP_ z8MLeJsg=9kyll3OQ! z8D-#-i+p@^EfgWlfA2oT7LK#xi&TNGAPO(6!*%f9}<9&d9Cd?vW!(&=n79@*BJLe%qbvm*N z+ob2xb|qa?TEC8V%~LdZXbR>Vm@0qN{Yb@9{}1Zg*ygW1;PffV2V5f=sJsyA84!`l zh~3T?sF`JS{X5q=;_Pc!8nr(Td(J>*QJl$I+dTc@9wg3mQq^#kD(TqsMcZ(Bepx3jo@ zx1)XL9i#j9I6+@XhBC?}*^WGI=r;R5vH*jBK`qufTn12%Z40VLQThE}OhkLW1zDp* zmbgx8F(gKkSIJKFO;Z@clfPv(hRDe0KKf1u++5${$4)jq)H&((5=ZHU#-l+VTvXO&`EJ) zY0il^SSmsgI5bAP7ts2w7DSeoYB=h*KcPVe+OYntx(C~(L_ve~Vs?@oVY()E9=qLM;n$Zcd+=b1x+_#EZJp-5 zZzO$hBj$P8?V4|M!FX)X!U{HeXN;WEv>qW8kzWQ1v22Vd3Ma!gRHI`hlpfK^=R3BR zylgmmwe5SjYS=Hzl!eWXS>F3*x#oA3J6mSWt?!>chV{_qYE!Qa#l) zWaRlI6~ZSCGcB`c&ef8lhWS^KPu^Ak#;*PoSxS>14ac00gcYGhY8x^uNIo|Vhk#oomW_K~&U)xmniSqXfE{Sm;Rg=bb51M=qTD|yDeDf(etCJ#YhgZ;xeU zcZz`PeQ{j;Fv^;xOJgFWM7ckb3Ero*0kq%Wr|#jHmOSZ+%>1$}a$FsR5s1(@kt1lA z=_G={$%Bk6JKqe!KnjeYXS+a}n7AFRLSHvvk|-?%;dD zErYJCq39`#4!rp+i%>=l_0XzKFDbBxic%O$#gIohIS$lcy+>cu&Y)`gCe7e6-3DM@ zTo#2vNOOwXdva5*AA2gM9MKEq^Cjp-LAw(QrG8JPO!|5|-Z&XV@{vkpjT9~$GajM} zo-iXetQ;T)H?|mUe&vSZ-ePQ3}GT-BKv6n$337cS~k0n3hz*B3}gNlH!sIm z$XATA&>DKxI{JSAojB@Bd7p^5NfhkUi(>Qvdhz4ubV-}fe8iw;3Y?PoF3X3F|w_D=#Ns+x2JLsoYJY*Cx|Kw9b+x9jf;z`l!fcFlib4LCzlk?uik=E zwf;Po87MR0jR6isDX>ps(q)Ooj?av!b4u83y?5Wgt2{c8%_0lUL`Wnl!BccOW9PAd zo1Pd%*5bV`=+__k0#~;6N@3wlk+S-9Hi*(9`1eAB#%=e1V&8sV2%l}HoIVbdE7Jo zuMm)a8)2bdDFx9B69aDnbp}$cBiib^#Nl~FO)v}ckwj${Lq$*@M#wt9#DCze zh+5FlCP6Pt7F6;;tcOl0sfGbyLRG$06bp(CGY(%@qaXy#_G%eNStijlZj;WsWS~$xD(vS*$Jze z=LbSeha0Vw7FB~nYCa!vHM7jrO?Njeaf1W7AXV15J`F>0hpGG|P?GitnUO5BvBt7b zb^$r7%0{lQ?%j!2yKd4vK)t(KDu1-Ai`rFn5w*^c2GFzhq|5)lX4jN3SmfM6hO zYG+&=@XD*Op-I$U)C%%X8Aw~srIloYeS z3;#aZh>>5swI@pLZN_5R6|f^tMpgidaBQdQU?2&if9&eU-ZAPxN-Yw$aEWN3Cmg+h z!tdc#ZU_%4x};qYD`mzUNjB;j5vuiZF#n2XHkGJnb? zkU9;?D_l&tk-}~(osS`B9-gj^6(%_vr3_fG50ml~?y*kc%xCrmBT`TsKG0HVgchm+Q+8hiQoAT?>#&+7-W} zB0iHncgo8rXNL6CDb}$*gjvU3K#za{SyHN78X}ERqf?pQe-|CpNB=+Fn{nlC917s`$(Z6$_e~H zb($7!XlQ^qR!}s%TwQoC9I_9BzBPB2iE#(g_s)*=eyKDJo*wB|$UJt=;fK|yH(3CA zHUK!ztM!#$D^>?y%-Xi>KmO5Ri4lVOmw5Z!Z~>3Brm!qPtVS)hJ1Hf$nynwX`|kCf z;^K*&YpVNqnO$t(mm%0rIv%1`y*rH|ZBC~pE1oU33J4;Z6slRO*^NBg^Uf9y|8yD zmhKcFx(|GOa$D!m0Gst!^ZEQ(EqW`)7SErI>z*~mul_aiq=XO4s@?*kG~j%Or%GV||kO9-aR!Y5c@ zP~5`!LYacn8-&2NxUzKrPLDpM7p4Zxem~C2QQt6< zj0*E4FO(U>q9NKVEuDz@EE^6=-CQ~1JB?x^+n(U<2=DAeB2cu>gr*)U0s!mM8O*nd z`A6P5ll%=rAA6rQ({e7xKF1TRbcqNertH-1i+lc+I4k6h|F#<= z2z-woXR}hwBZaJJ0%~zQW%Y8YIJq%*Z+;0N@w3vCOQ(c%!oUxt!#zV_*g6DK!|`qP zk?W*=`3z};GIT&yGR%b>_t%x98l?lSV(7t6bjS)c1RCEO{`P!LtX(Lp&Ly*=re>u-BOVDW{XqWnaGGm+NOFL8oSlumwedXeq^r(yemq`<@#<1Z{S!pAO1; z{6r_@R|jH-R%2qcs(dku-l>ZXr)4j$&w5iwr!=o+>be<*Su6XnQR+6RFr#jCWToAp z!%MuQP1s|E<;F7Y%=)hB2>-B3ppr3?y`pg#lIWu;1`)e%Zdk?W5_= zH26&F`iyCxGpEJ{+$4zz0vFy}yOAN3*UBBw%s(z&U9w9h=As-TDEGID|7BkNg2=cf z0n)vW4BEeQS6!6LPj8FK&mX?N@7)g6^N^;cKr5nj2B8h`!9GaPnRV~I`P}dRd0{P6 zm39%jjho5)XHO(Z1QMNqd)$0llKht!l&#vskjV(aUcBY<| zwd0&YtRH@d8!9uyG2eo?@ci)I5)sieMyf; zlTN}BjO}e4)B;MLddb{h^((P`5?j=U#FSwR6N02>4u+f?NGZ79>_V7eWN-l&MVP$= zJH?mONu2dx)_av4wG=(R<~~fDzbqk9)mw=bw<=DcDZk}@rrxCTe_K=m(e+rDWE(vd z!@(B;n%2vbZpb&57-(KcZPsF4@;Z&vt9;7O=3NKH`d@+2gn{$F^sAxJHn6tAJ%+@x ztjSINhn1-`aUlIMd9oFPT3eJ16u@5TU@&YcGno!@v}k>K{U1s&%P-2=L897srgMoQ_$*fd@B~r0$G+Z&AzayXen}{KynLm z#fuwG9_`1yRfWc;2tp~s#Yd}G#d2u`7sTiqV~K#VvR1Tse87vUN{5{HDcas!SC;q; zi54=}#B+%q5iUDj9D5MxKU-4e4}z>GSU9_9rXN>hGIIcQs?$uCq6OXxeDL2|YlI*8 zM85@XNE_vhqo5gqP~Zl$+K44=49l44Io)ZAR9Hg7euu|`WGtM;!3tVl<>yozL`Z@~ z9Bq)<#0YzmWcRTOt;UQ3{NEWEOA=J$f6 zF)Tgv-gsxz{i(Q5M=sM7KA(H(8-*B#$;-hY2)Sy%0K(c^ypx5qAVZT;H=%ItI*u;`)_{)ZzK!W2Q} z{DIf6t!^Y(o!#jKbsi7%9Pq5R3)(Xq6+N5gmu!D4`GXBayTXNRd}|8tCXtR+FQImh zHD+0N`BdC^o&Cz&NH<#>HVVCLo@RG!#e!_{4EN;vyevWCOLK1B7IwHfBP@1u>A)DM zTKf};g8+HRHEXMxX?*Oy?@J(}6;SkEU@|HBmi&04h7|m)0hKm4W0Z`iu}A5UN9JP% zrPAoPB{!p`RFO`?XOyd-lqZr*0P9+(kG6N6`mX3FqQ{{7|l$4bu~<=Uv)FCYXz z7ZF(X^b=lo*E7lU*VAh=lTRZgSW#Isi22Of4K6SAL4lrim~A-4x=8(1EJFdtxnDmW zWZTjXiS4Vdqh?OViu4BkMNDy*-ughxJrrOH^dk@D$#Bg=BtVF>?m=H0kT6S@dqlCa z6EeQqrBEv*dJ7{a*?{68NBE_}175!ABbQkhX`FnTRM2cFTa-5H@J8xdE!uqCRv^=UoH@W_!=LR&g*%= zB76r5jc&yAV3pVz*)=vjlZ^LVTYn!6yexs6Z2Cw_L2RJKf1p#0wp-uTPc?)etd@p9 zhB-R@Fkf5N@T$DiaqS%0`AuZe;PIQ5KU%!)s0$@}k;1J2ZW1uaWbo!n`6MPta*0r( z`tkkw5dfq*xJ{}k`E#m>IL(~sev5<2kZniln@dO3rNnFzqD^paqC+=}F zrp$o;s^B0K+(F@~Id#SfT`b{C%BPFdeq_1ZRzNhlcv~^6p+hE`zrXyfUg@6bHKjB^ z3Ta31qQwBcw^F6_;5J-603O6!TWr?ABh~?}?Ws`mukY_q-wwg%-yEPXqG{~Sob5Gc z6*=h*VDj=Wvi;h2fs^ARq92Av%{{hjmw|&Zb>2a6$FLZr>txT!JykNNKI19_l3sMF zMPAO8XHC0?}c3XEqYGU<0-G zYP)8D?p!Zt^$jaw(jHuE9^=2zA5Dbx2p5;jX*+w75wC9fgCvYB3poo~X7_*!J=}yv z?gF*BW0=hu!{1oReaDJ~Q|2$j3jemi%{?Yh%)+*U;+YHLdi`U>xdfYiC; zhYkMd8}X;W7zMfC4$Sp}!k;`9I`fZzDzzrer0(i}ptB!;rm&*LAzb_Q==J7&?YyH7 z_Dq~3NarfA<4?d1Qht$8sYgLQ=+FhMeyv?_vbArOHG}|S%8Zx+)3OoJuzQ%}Y4lFO zb+T?H*ne%7EzAHOy3&Q`wg4co(c0HiF=~zkY_grG`-S`9(_*}d3dp_fR}4s57L;na zqTcuj$5VX~0}?SM_oJ;0<**9*Z(bg@^tpHLtS%PVEndH*<;sZaFluSp-?kiTeU!n@ zIU@{ISQjsF9mDa)$FfzwSX)IA`gUpAK{}&0^MhbNv3Il=|9|$H_52^=q)MxmA5xt? zf=~=8a2q#1T0nI?v)U5$#b&T0YI_0Pb9*mlAj|w##I!a-)28E(R4YQFLDzU@ItuXo zco%BX)jr6dJwzle85g&JSbtoVHLdOU$<<0%H_I+Gs6_^*7ya8cd(AbCDDYY@O5W-| zh}Eq+ScKV^R77it5I|>F60Q(WI1k(;qx0X)Il{Z?8J7fek4GKx*4!?+bN%*%L@No~ zB^i%bL}lC!Tl&9(^zWu?W*WD%rG3W6Ya@&@+1pjzH*nKKI--6?5ikeNSzWJG0kb+v zU+z-9cF!+1a#~OsdsL^xhKq~o2#?;R-U2gpeDCm`J=$q+(8^EEmPjc~YoXZn!RH@! zk=^t7s>`a85@{z#fbzG#SSFvaUb+9t29sVN!^b?d09V2 zwFF7weZCC>Ne+kaf;D@^#>Kkn?RLh!SuWE1H0C-d4)u=5 z!_74wR(Q343jb?chXy0W6)n)HHVmdxy+-+O9++N-q4O088?;FWRY;N%)6uy9Dd}P( z)Q};pu{HV>k0eVKh?3kPj4Jf%5sH?RR=aRJ5**zuIF4NBjZgLWxT%x3ECKxvSujb?8ny|M9iM;bLmB5DcE5m zz)=|5-@AA0s1(fb)~CublP{WFoTKrp-U&X*m1Wp>kNq!oD-P76O?L`=k0F~?g*&|)ea{+ekpuU z#XPecB_6E$eo#R;Y`Xx_MlKP@?pvcPNb#NKa86?3sWH;oBEUv;_+Rg!hshsz?@W)V zq5Q^|^Im2r(K_UKgvx^}mqy~w!Y|^HOR7gI4VBEQA+p-j`8-xJwt&X-I~H^ILo>!Xsvf7>7bfu907 zeQG!UO7@IwXUyJT{SU<1JkT&x_@2_VbI8;Cv&w9BzxQd*v$FnS|IDbmpM3c?oA%MW zFp$jhkm^dL;De=Fw#!Ywi`Qz5TlUkrZj*y=a>Rl1eZuwPX3VfgO7pHO`%(+l_BIEm zdmQ~XwRig8tP$Svs;ZOw%|R6h-iH{JM(N|yS!o7I^{pV>e;}``wksaHn41biS0lQw z2o%YeC;FaVs=597=)sXABF)2*$-RW=o|g?iJKnm9bJy5P9PL_Kw^}o|>9F7S�?R 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