From 86383280c9f2c568f6086da731055821b9d26523 Mon Sep 17 00:00:00 2001 From: ekes Date: Tue, 24 Feb 2015 16:25:12 +0100 Subject: [PATCH] Initial import. --- composer.json | 22 + composer.lock | 525 + radar.inc.php | 181 + radar.php | 343 + vendor/autoload.php | 7 + vendor/composer/ClassLoader.php | 413 + vendor/composer/autoload_classmap.php | 10 + vendor/composer/autoload_namespaces.php | 17 + vendor/composer/autoload_psr4.php | 10 + vendor/composer/autoload_real.php | 50 + vendor/composer/installed.json | 527 + vendor/doctrine/common/.gitignore | 4 + vendor/doctrine/common/.gitmodules | 3 + vendor/doctrine/common/.travis.yml | 10 + vendor/doctrine/common/LICENSE | 19 + vendor/doctrine/common/README.md | 12 + vendor/doctrine/common/UPGRADE_TO_2_1 | 39 + vendor/doctrine/common/UPGRADE_TO_2_2 | 61 + vendor/doctrine/common/bin/travis-setup.php | 141 + vendor/doctrine/common/build.properties | 6 + vendor/doctrine/common/build.xml | 59 + vendor/doctrine/common/composer.json | 26 + .../Common/Annotations/Annotation.php | 79 + .../Annotations/Annotation/Attribute.php | 47 + .../Annotations/Annotation/Attributes.php | 37 + .../Annotation/IgnoreAnnotation.php | 54 + .../Annotations/Annotation/Required.php | 33 + .../Common/Annotations/Annotation/Target.php | 107 + .../Annotations/AnnotationException.php | 127 + .../Common/Annotations/AnnotationReader.php | 310 + .../Common/Annotations/AnnotationRegistry.php | 139 + .../Common/Annotations/CachedReader.php | 250 + .../Doctrine/Common/Annotations/DocLexer.php | 132 + .../Doctrine/Common/Annotations/DocParser.php | 988 ++ .../Common/Annotations/FileCacheReader.php | 258 + .../Common/Annotations/IndexedReader.php | 141 + .../Doctrine/Common/Annotations/PhpParser.php | 80 + .../Doctrine/Common/Annotations/Reader.php | 67 + .../Annotations/SimpleAnnotationReader.php | 157 + .../Common/Annotations/TokenParser.php | 175 + .../lib/Doctrine/Common/Cache/ApcCache.php | 93 + .../lib/Doctrine/Common/Cache/ArrayCache.php | 96 + .../lib/Doctrine/Common/Cache/Cache.php | 102 + .../Doctrine/Common/Cache/CacheProvider.php | 231 + .../lib/Doctrine/Common/Cache/FileCache.php | 132 + .../Doctrine/Common/Cache/FilesystemCache.php | 114 + .../Doctrine/Common/Cache/MemcacheCache.php | 121 + .../Doctrine/Common/Cache/MemcachedCache.php | 124 + .../Doctrine/Common/Cache/PhpFileCache.php | 108 + .../lib/Doctrine/Common/Cache/RedisCache.php | 119 + .../Doctrine/Common/Cache/WinCacheCache.php | 93 + .../lib/Doctrine/Common/Cache/XcacheCache.php | 110 + .../Doctrine/Common/Cache/ZendDataCache.php | 84 + .../lib/Doctrine/Common/ClassLoader.php | 263 + .../Common/Collections/ArrayCollection.php | 500 + .../Common/Collections/Collection.php | 243 + .../Doctrine/Common/Collections/Criteria.php | 240 + .../Expr/ClosureExpressionVisitor.php | 195 + .../Common/Collections/Expr/Comparison.php | 75 + .../Collections/Expr/CompositeExpression.php | 72 + .../Common/Collections/Expr/Expression.php | 31 + .../Collections/Expr/ExpressionVisitor.php | 81 + .../Common/Collections/Expr/Value.php | 41 + .../Common/Collections/ExpressionBuilder.php | 149 + .../Common/Collections/Selectable.php | 48 + .../lib/Doctrine/Common/CommonException.php | 28 + .../common/lib/Doctrine/Common/Comparable.php | 49 + .../common/lib/Doctrine/Common/EventArgs.php | 67 + .../lib/Doctrine/Common/EventManager.php | 147 + .../lib/Doctrine/Common/EventSubscriber.php | 45 + .../common/lib/Doctrine/Common/Lexer.php | 266 + .../Doctrine/Common/NotifyPropertyChanged.php | 45 + .../Persistence/AbstractManagerRegistry.php | 259 + .../Common/Persistence/ConnectionRegistry.php | 63 + .../Persistence/Event/LifecycleEventArgs.php | 77 + .../Event/LoadClassMetadataEventArgs.php | 76 + .../Persistence/Event/ManagerEventArgs.php | 59 + .../Persistence/Event/OnClearEventArgs.php | 84 + .../Persistence/Event/PreUpdateEventArgs.php | 133 + .../Common/Persistence/ManagerRegistry.php | 112 + .../Mapping/AbstractClassMetadataFactory.php | 383 + .../Persistence/Mapping/ClassMetadata.php | 165 + .../Mapping/ClassMetadataFactory.php | 74 + .../Mapping/Driver/AnnotationDriver.php | 214 + .../Mapping/Driver/DefaultFileLocator.php | 170 + .../Persistence/Mapping/Driver/FileDriver.php | 214 + .../Mapping/Driver/FileLocator.php | 71 + .../Mapping/Driver/MappingDriver.php | 56 + .../Mapping/Driver/MappingDriverChain.php | 168 + .../Persistence/Mapping/Driver/PHPDriver.php | 72 + .../Mapping/Driver/StaticPHPDriver.php | 141 + .../Mapping/Driver/SymfonyFileLocator.php | 214 + .../Persistence/Mapping/MappingException.php | 86 + .../Persistence/Mapping/ReflectionService.php | 80 + .../Mapping/RuntimeReflectionService.php | 102 + .../Mapping/StaticReflectionService.php | 107 + .../Common/Persistence/ObjectManager.php | 152 + .../Common/Persistence/ObjectManagerAware.php | 49 + .../Common/Persistence/ObjectRepository.php | 78 + .../Common/Persistence/PersistentObject.php | 244 + .../lib/Doctrine/Common/Persistence/Proxy.php | 60 + .../Common/PropertyChangedListener.php | 48 + .../Reflection/ClassFinderInterface.php | 38 + .../Common/Reflection/Psr0FindFile.php | 83 + .../ReflectionProviderInterface.php | 45 + .../Reflection/StaticReflectionClass.php | 112 + .../Reflection/StaticReflectionMethod.php | 103 + .../Reflection/StaticReflectionParser.php | 282 + .../Reflection/StaticReflectionProperty.php | 77 + .../lib/Doctrine/Common/Util/ClassUtils.php | 103 + .../common/lib/Doctrine/Common/Util/Debug.php | 135 + .../lib/Doctrine/Common/Util/Inflector.php | 72 + .../common/lib/Doctrine/Common/Version.php | 55 + vendor/doctrine/common/phpunit.xml.dist | 31 + vendor/doctrine/common/tests/.gitignore | 3 + .../Common/Annotations/AbstractReaderTest.php | 517 + .../Annotations/AnnotationReaderTest.php | 13 + .../Common/Annotations/CachedReaderTest.php | 56 + .../Tests/Common/Annotations/DocLexerTest.php | 137 + .../Common/Annotations/DocParserTest.php | 1208 ++ .../Tests/Common/Annotations/DummyClass.php | 48 + .../Annotations/FileCacheReaderTest.php | 40 + .../Annotation/AnnotWithDefaultValue.php | 10 + .../Fixtures/Annotation/Autoload.php | 10 + .../Annotations/Fixtures/Annotation/Route.php | 11 + .../Fixtures/Annotation/Secure.php | 18 + .../Fixtures/Annotation/Template.php | 14 + .../Fixtures/Annotation/Version.php | 11 + .../Fixtures/AnnotationTargetAll.php | 14 + .../Fixtures/AnnotationTargetAnnotation.php | 14 + .../Fixtures/AnnotationTargetClass.php | 15 + .../Fixtures/AnnotationTargetMethod.php | 15 + .../AnnotationTargetPropertyMethod.php | 14 + .../Fixtures/AnnotationWithAttributes.php | 119 + .../Fixtures/AnnotationWithConstants.php | 20 + .../AnnotationWithRequiredAttributes.php | 50 + ...ithRequiredAttributesWithoutContructor.php | 24 + .../AnnotationWithTargetSyntaxError.php | 11 + .../Fixtures/AnnotationWithVarType.php | 62 + .../Annotations/Fixtures/ClassDDC1660.php | 30 + ...assWithAnnotationWithTargetSyntaxError.php | 21 + .../ClassWithAnnotationWithVarType.php | 31 + .../Annotations/Fixtures/ClassWithClosure.php | 52 + .../Fixtures/ClassWithConstants.php | 10 + .../ClassWithFullyQualifiedUseStatements.php | 11 + ...lassWithInvalidAnnotationTargetAtClass.php | 17 + ...assWithInvalidAnnotationTargetAtMethod.php | 20 + ...sWithInvalidAnnotationTargetAtProperty.php | 24 + .../ClassWithValidAnnotationTarget.php | 41 + .../Annotations/Fixtures/Controller.php | 300 + ...erentNamespacesPerFileWithClassAsFirst.php | 15 + ...ferentNamespacesPerFileWithClassAsLast.php | 15 + ...EqualNamespacesPerFileWithClassAsFirst.php | 13 + .../EqualNamespacesPerFileWithClassAsLast.php | 12 + ...lobalNamespacesPerFileWithClassAsFirst.php | 12 + ...GlobalNamespacesPerFileWithClassAsLast.php | 12 + .../Fixtures/IntefaceWithConstants.php | 10 + .../InvalidAnnotationUsageButIgnoredClass.php | 14 + .../Fixtures/InvalidAnnotationUsageClass.php | 10 + .../Fixtures/MultipleClassesInFile.php | 9 + .../MultipleImportsInUseStatement.php | 10 + .../NamespaceAndClassCommentedOut.php | 20 + .../NamespaceWithClosureDeclaration.php | 15 + .../Fixtures/NamespacedSingleClassLOC1000.php | 1009 ++ .../Annotations/Fixtures/NoAnnotation.php | 5 + .../Fixtures/NonNamespacedClass.php | 10 + .../Fixtures/SingleClassLOC1000.php | 1006 ++ .../Annotations/Fixtures/TestInterface.php | 13 + .../Common/Annotations/PerformanceTest.php | 194 + .../Common/Annotations/PhpParserTest.php | 194 + .../SimpleAnnotationReaderTest.php | 97 + .../Common/Annotations/Ticket/DCOM55Test.php | 65 + .../Annotations/Ticket/DCOM58Entity.php | 8 + .../Common/Annotations/Ticket/DCOM58Test.php | 112 + .../Common/Annotations/TopLevelAnnotation.php | 8 + .../Tests/Common/Cache/ApcCacheTest.php | 20 + .../Tests/Common/Cache/ArrayCacheTest.php | 21 + .../Doctrine/Tests/Common/Cache/CacheTest.php | 91 + .../Common/Cache/FilesystemCacheTest.php | 97 + .../Tests/Common/Cache/MemcacheCacheTest.php | 45 + .../Tests/Common/Cache/MemcachedCacheTest.php | 48 + .../Tests/Common/Cache/PhpFileCacheTest.php | 149 + .../Tests/Common/Cache/RedisCacheTest.php | 30 + .../Tests/Common/Cache/WinCacheCacheTest.php | 20 + .../Tests/Common/Cache/XcacheCacheTest.php | 20 + .../Tests/Common/Cache/ZendDataCacheTest.php | 28 + .../Doctrine/Tests/Common/ClassLoaderTest.php | 45 + .../Common/ClassLoaderTest/ClassA.class.php | 6 + .../Common/ClassLoaderTest/ClassB.class.php | 6 + .../Common/ClassLoaderTest/ClassC.class.php | 6 + .../Tests/Common/ClassLoaderTest/ClassD.php | 5 + .../ClosureExpressionVisitorTest.php | 198 + .../Common/Collections/CollectionTest.php | 251 + .../Tests/Common/Collections/CriteriaTest.php | 82 + .../Collections/ExpressionBuilderTest.php | 114 + .../Tests/Common/DoctrineExceptionTest.php | 0 .../Tests/Common/EventManagerTest.php | 88 + .../Persistence/Mapping/ChainDriverTest.php | 130 + .../Mapping/ClassMetadataFactoryTest.php | 139 + .../Mapping/DefaultFileLocatorTest.php | 90 + .../Persistence/Mapping/FileDriverTest.php | 142 + .../Persistence/Mapping/PHPDriverTest.php | 18 + .../Mapping/RuntimeReflectionServiceTest.php | 70 + .../Mapping/StaticPHPDriverTest.php | 35 + .../Mapping/StaticReflectionServiceTest.php | 70 + .../Mapping/SymfonyFileLocatorTest.php | 88 + .../Persistence/Mapping/_files/TestEntity.php | 3 + .../Persistence/Mapping/_files/global.yml | 1 + .../Persistence/Mapping/_files/stdClass.yml | 1 + .../Persistence/PersistentObjectTest.php | 247 + .../Reflection/DeeperNamespaceParent.php | 7 + .../Common/Reflection/Dummies/NoParent.php | 8 + .../Reflection/FullyClassifiedParent.php | 7 + .../Tests/Common/Reflection/NoParent.php | 8 + .../Common/Reflection/SameNamespaceParent.php | 7 + .../Reflection/StaticReflectionParserTest.php | 45 + .../Tests/Common/Reflection/UseParent.php | 9 + .../Tests/Common/Util/ClassUtilsTest.php | 100 + .../Doctrine/Tests/Common/Util/DebugTest.php | 27 + .../tests/Doctrine/Tests/DoctrineTestCase.php | 10 + .../common/tests/Doctrine/Tests/TestInit.php | 31 + .../common/tests/NativePhpunitTask.php | 246 + vendor/doctrine/common/tests/README.markdown | 27 + vendor/events-radar/radar-api-php | 1 + .../Guzzle/Cache/AbstractCacheAdapter.php | 21 + .../Guzzle/Cache/CacheAdapterFactory.php | 117 + .../Guzzle/Cache/CacheAdapterInterface.php | 55 + .../Guzzle/Cache/ClosureCacheAdapter.php | 57 + .../Guzzle/Cache/DoctrineCacheAdapter.php | 41 + .../cache/Guzzle/Cache/NullCacheAdapter.php | 31 + .../cache/Guzzle/Cache/Zf1CacheAdapter.php | 44 + .../cache/Guzzle/Cache/Zf2CacheAdapter.php | 41 + .../guzzle/cache/Guzzle/Cache/composer.json | 27 + .../Guzzle/Common/AbstractHasDispatcher.php | 49 + .../common/Guzzle/Common/Collection.php | 403 + vendor/guzzle/common/Guzzle/Common/Event.php | 52 + .../Exception/BadMethodCallException.php | 5 + .../Common/Exception/ExceptionCollection.php | 108 + .../Common/Exception/GuzzleException.php | 8 + .../Exception/InvalidArgumentException.php | 5 + .../Common/Exception/RuntimeException.php | 5 + .../Exception/UnexpectedValueException.php | 5 + .../Guzzle/Common/FromConfigInterface.php | 18 + .../Guzzle/Common/HasDispatcherInterface.php | 54 + .../common/Guzzle/Common/ToArrayInterface.php | 16 + .../guzzle/common/Guzzle/Common/Version.php | 29 + .../guzzle/common/Guzzle/Common/composer.json | 20 + .../Http/AbstractEntityBodyDecorator.php | 221 + .../http/Guzzle/Http/CachingEntityBody.php | 229 + vendor/guzzle/http/Guzzle/Http/Client.php | 524 + .../http/Guzzle/Http/ClientInterface.php | 223 + .../http/Guzzle/Http/Curl/CurlHandle.php | 464 + .../http/Guzzle/Http/Curl/CurlMulti.php | 423 + .../Guzzle/Http/Curl/CurlMultiInterface.php | 58 + .../http/Guzzle/Http/Curl/CurlMultiProxy.php | 150 + .../http/Guzzle/Http/Curl/CurlVersion.php | 66 + .../http/Guzzle/Http/Curl/RequestMediator.php | 147 + vendor/guzzle/http/Guzzle/Http/EntityBody.php | 201 + .../http/Guzzle/Http/EntityBodyInterface.php | 73 + .../Http/Exception/BadResponseException.php | 69 + .../ClientErrorResponseException.php | 8 + .../CouldNotRewindStreamException.php | 7 + .../Guzzle/Http/Exception/CurlException.php | 101 + .../Guzzle/Http/Exception/HttpException.php | 10 + .../Http/Exception/MultiTransferException.php | 145 + .../Http/Exception/RequestException.php | 39 + .../ServerErrorResponseException.php | 8 + .../Exception/TooManyRedirectsException.php | 5 + .../http/Guzzle/Http/IoEmittingEntityBody.php | 83 + .../Guzzle/Http/Message/AbstractMessage.php | 220 + .../Http/Message/EntityEnclosingRequest.php | 247 + .../EntityEnclosingRequestInterface.php | 137 + .../http/Guzzle/Http/Message/Header.php | 182 + .../Http/Message/Header/CacheControl.php | 121 + .../Http/Message/Header/HeaderCollection.php | 108 + .../Http/Message/Header/HeaderFactory.php | 26 + .../Message/Header/HeaderFactoryInterface.php | 19 + .../Http/Message/Header/HeaderInterface.php | 83 + .../http/Guzzle/Http/Message/Header/Link.php | 93 + .../Guzzle/Http/Message/MessageInterface.php | 102 + .../http/Guzzle/Http/Message/PostFile.php | 124 + .../Guzzle/Http/Message/PostFileInterface.php | 83 + .../http/Guzzle/Http/Message/Request.php | 638 + .../Guzzle/Http/Message/RequestFactory.php | 359 + .../Http/Message/RequestFactoryInterface.php | 105 + .../Guzzle/Http/Message/RequestInterface.php | 318 + .../http/Guzzle/Http/Message/Response.php | 968 ++ vendor/guzzle/http/Guzzle/Http/Mimetypes.php | 962 ++ .../Http/QueryAggregator/CommaAggregator.php | 20 + .../QueryAggregator/DuplicateAggregator.php | 22 + .../Http/QueryAggregator/PhpAggregator.php | 27 + .../QueryAggregatorInterface.php | 22 + .../guzzle/http/Guzzle/Http/QueryString.php | 297 + .../http/Guzzle/Http/ReadLimitEntityBody.php | 106 + .../http/Guzzle/Http/RedirectPlugin.php | 250 + .../http/Guzzle/Http/Resources/cacert.pem | 3866 ++++++ .../guzzle/http/Guzzle/Http/StaticClient.php | 157 + vendor/guzzle/http/Guzzle/Http/Url.php | 554 + vendor/guzzle/http/Guzzle/Http/composer.json | 32 + .../Guzzle/Parser/Cookie/CookieParser.php | 131 + .../Parser/Cookie/CookieParserInterface.php | 33 + .../Parser/Message/AbstractMessageParser.php | 58 + .../Guzzle/Parser/Message/MessageParser.php | 110 + .../Parser/Message/MessageParserInterface.php | 27 + .../Parser/Message/PeclHttpMessageParser.php | 48 + .../parser/Guzzle/Parser/ParserRegistry.php | 75 + .../Parser/UriTemplate/PeclUriTemplate.php | 26 + .../Guzzle/Parser/UriTemplate/UriTemplate.php | 254 + .../UriTemplate/UriTemplateInterface.php | 21 + .../parser/Guzzle/Parser/Url/UrlParser.php | 48 + .../Guzzle/Parser/Url/UrlParserInterface.php | 19 + .../guzzle/parser/Guzzle/Parser/composer.json | 19 + .../Cache/CacheKeyProviderInterface.php | 11 + .../Guzzle/Plugin/Cache/CachePlugin.php | 353 + .../Plugin/Cache/CacheStorageInterface.php | 43 + .../Plugin/Cache/CallbackCanCacheStrategy.php | 53 + .../Cache/CanCacheStrategyInterface.php | 30 + .../Plugin/Cache/DefaultCacheKeyProvider.php | 46 + .../Plugin/Cache/DefaultCacheStorage.php | 251 + .../Plugin/Cache/DefaultCanCacheStrategy.php | 32 + .../Plugin/Cache/DefaultRevalidation.php | 174 + .../Guzzle/Plugin/Cache/DenyRevalidation.php | 19 + .../Plugin/Cache/RevalidationInterface.php | 32 + .../Guzzle/Plugin/Cache/SkipRevalidation.php | 19 + .../Guzzle/Plugin/Cache/composer.json | 28 + .../Guzzle/Stream/PhpStreamRequestFactory.php | 276 + vendor/guzzle/stream/Guzzle/Stream/Stream.php | 289 + .../stream/Guzzle/Stream/StreamInterface.php | 218 + .../Stream/StreamRequestFactoryInterface.php | 24 + .../guzzle/stream/Guzzle/Stream/composer.json | 30 + vendor/phayes/geophp/.gitignore | 1 + vendor/phayes/geophp/.travis.yml | 27 + vendor/phayes/geophp/LICENSE | 370 + vendor/phayes/geophp/README.md | 150 + vendor/phayes/geophp/composer.json | 18 + vendor/phayes/geophp/doc/api.html | 735 + vendor/phayes/geophp/geoPHP.inc | 301 + .../phayes/geophp/lib/adapters/EWKB.class.php | 96 + .../phayes/geophp/lib/adapters/EWKT.class.php | 27 + .../phayes/geophp/lib/adapters/GPX.class.php | 180 + .../geophp/lib/adapters/GeoAdapter.class.php | 31 + .../geophp/lib/adapters/GeoHash.class.php | 249 + .../geophp/lib/adapters/GeoJSON.class.php | 155 + .../geophp/lib/adapters/GeoRSS.class.php | 244 + .../lib/adapters/GoogleGeocode.class.php | 158 + .../phayes/geophp/lib/adapters/KML.class.php | 272 + .../phayes/geophp/lib/adapters/WKB.class.php | 250 + .../phayes/geophp/lib/adapters/WKT.class.php | 258 + .../geophp/lib/geometry/Collection.class.php | 294 + .../geophp/lib/geometry/Geometry.class.php | 347 + .../lib/geometry/GeometryCollection.class.php | 29 + .../geophp/lib/geometry/LineString.class.php | 190 + .../lib/geometry/MultiLineString.class.php | 20 + .../geophp/lib/geometry/MultiPoint.class.php | 21 + .../lib/geometry/MultiPolygon.class.php | 8 + .../geophp/lib/geometry/Point.class.php | 179 + .../geophp/lib/geometry/Polygon.class.php | 215 + vendor/phayes/geophp/tests/input/20120702.gpx | 11462 ++++++++++++++++ .../geophp/tests/input/an_empty_polygon.wkt | 1 + .../phayes/geophp/tests/input/barret_spur.gpx | 219 + .../phayes/geophp/tests/input/big_n_ugly.kml | 915 ++ vendor/phayes/geophp/tests/input/box.georss | 1 + vendor/phayes/geophp/tests/input/cdata.kml | 19 + .../phayes/geophp/tests/input/circle.georss | 1 + .../phayes/geophp/tests/input/empty_point.wkt | 1 + .../phayes/geophp/tests/input/fells_loop.gpx | 1077 ++ .../tests/input/geometrycollection.georss | 29 + .../geophp/tests/input/geometrycollection.wkt | 1 + vendor/phayes/geophp/tests/input/line.georss | 1 + .../phayes/geophp/tests/input/linestring.wkt | 1 + vendor/phayes/geophp/tests/input/long.geohash | 1 + .../geophp/tests/input/multilinestring.ewkt | 1 + .../geophp/tests/input/multilinestring.wkt | 1 + .../geophp/tests/input/multipolygon.wkb | Bin 0 -> 179 bytes .../geophp/tests/input/multipolygon.wkt | 1 + .../geophp/tests/input/multipolygon2.wkt | 1 + .../geophp/tests/input/multipolygon_big.wkt | 1 + vendor/phayes/geophp/tests/input/opposite.gpx | 10 + vendor/phayes/geophp/tests/input/path.kml | 40 + .../phayes/geophp/tests/input/paths_big.json | 1 + vendor/phayes/geophp/tests/input/pentagon.kml | 34 + vendor/phayes/geophp/tests/input/point.georss | 21 + vendor/phayes/geophp/tests/input/point.kml | 11 + vendor/phayes/geophp/tests/input/point.wkt | 1 + .../phayes/geophp/tests/input/polygon.georss | 3 + vendor/phayes/geophp/tests/input/polygon.wkt | 1 + vendor/phayes/geophp/tests/input/polygon2.wkt | 1 + vendor/phayes/geophp/tests/input/polygon3.wkt | 1 + vendor/phayes/geophp/tests/input/polygon4.wkt | 1 + .../geophp/tests/input/polygon_spaces.wkt | 2 + vendor/phayes/geophp/tests/input/route.gpx | 4749 +++++++ .../phayes/geophp/tests/input/short.geohash | 1 + .../geophp/tests/input/simple_point.json | 1 + vendor/phayes/geophp/tests/input/track.gpx | 28 + vendor/phayes/geophp/tests/postgis.php | 82 + vendor/phayes/geophp/tests/test.php | 258 + .../geophp/tests/tests/20120702Test.php | 287 + .../geophp/tests/tests/adaptersTest.php | 63 + .../phayes/geophp/tests/tests/bootstrap.php | 7 + .../phayes/geophp/tests/tests/geohashTest.php | 20 + vendor/phayes/geophp/tests/tests/geosTest.php | 89 + .../phayes/geophp/tests/tests/methodsTest.php | 359 + .../geophp/tests/tests/placeholdersTest.php | 60 + .../Component/EventDispatcher/.gitignore | 3 + .../Component/EventDispatcher/CHANGELOG.md | 23 + .../ContainerAwareEventDispatcher.php | 202 + .../Debug/TraceableEventDispatcher.php | 320 + .../TraceableEventDispatcherInterface.php | 34 + .../EventDispatcher/Debug/WrappedListener.php | 71 + .../RegisterListenersPass.php | 110 + .../Component/EventDispatcher/Event.php | 130 + .../EventDispatcher/EventDispatcher.php | 185 + .../EventDispatcherInterface.php | 96 + .../EventSubscriberInterface.php | 50 + .../EventDispatcher/GenericEvent.php | 186 + .../ImmutableEventDispatcher.php | 93 + .../Symfony/Component/EventDispatcher/LICENSE | 19 + .../Component/EventDispatcher/README.md | 27 + .../Tests/AbstractEventDispatcherTest.php | 369 + .../ContainerAwareEventDispatcherTest.php | 249 + .../Debug/TraceableEventDispatcherTest.php | 185 + .../RegisterListenersPassTest.php | 200 + .../Tests/EventDispatcherTest.php | 22 + .../EventDispatcher/Tests/EventTest.php | 88 + .../Tests/GenericEventTest.php | 139 + .../Tests/ImmutableEventDispatcherTest.php | 105 + .../Component/EventDispatcher/composer.json | 42 + .../EventDispatcher/phpunit.xml.dist | 29 + 428 files changed, 68738 insertions(+) create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 radar.inc.php create mode 100644 radar.php create mode 100644 vendor/autoload.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/doctrine/common/.gitignore create mode 100644 vendor/doctrine/common/.gitmodules create mode 100644 vendor/doctrine/common/.travis.yml create mode 100644 vendor/doctrine/common/LICENSE create mode 100644 vendor/doctrine/common/README.md create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_1 create mode 100644 vendor/doctrine/common/UPGRADE_TO_2_2 create mode 100644 vendor/doctrine/common/bin/travis-setup.php create mode 100644 vendor/doctrine/common/build.properties create mode 100644 vendor/doctrine/common/build.xml create mode 100644 vendor/doctrine/common/composer.json create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Annotations/TokenParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/FileCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/FilesystemCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/PhpFileCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/RedisCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Criteria.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Comparison.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Expression.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Value.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/ExpressionBuilder.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Collections/Selectable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/CommonException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Comparable.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Lexer.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/ClassFinderInterface.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/Psr0FindFile.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/ReflectionProviderInterface.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionClass.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionMethod.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionParser.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionProperty.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php create mode 100644 vendor/doctrine/common/lib/Doctrine/Common/Version.php create mode 100644 vendor/doctrine/common/phpunit.xml.dist create mode 100644 vendor/doctrine/common/tests/.gitignore create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/CachedReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DummyClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/FileCacheReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Autoload.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Route.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Secure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAll.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationTargetPropertyMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithConstants.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributes.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithTargetSyntaxError.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithAnnotationWithVarType.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithClosure.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithConstants.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithFullyQualifiedUseStatements.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtMethod.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithInvalidAnnotationTargetAtProperty.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithValidAnnotationTarget.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Controller.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/EqualNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsFirst.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/GlobalNamespacesPerFileWithClassAsLast.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/IntefaceWithConstants.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageButIgnoredClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/InvalidAnnotationUsageClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleClassesInFile.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/MultipleImportsInUseStatement.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceAndClassCommentedOut.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespaceWithClosureDeclaration.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NamespacedSingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NonNamespacedClass.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/SingleClassLOC1000.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PerformanceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Test.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ApcCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/ClosureExpressionVisitorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CriteriaTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/ExpressionBuilderTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/DeeperNamespaceParent.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/Dummies/NoParent.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/FullyClassifiedParent.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/NoParent.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/SameNamespaceParent.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/StaticReflectionParserTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/UseParent.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php create mode 100644 vendor/doctrine/common/tests/Doctrine/Tests/TestInit.php create mode 100644 vendor/doctrine/common/tests/NativePhpunitTask.php create mode 100644 vendor/doctrine/common/tests/README.markdown create mode 160000 vendor/events-radar/radar-api-php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/AbstractCacheAdapter.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/CacheAdapterFactory.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/CacheAdapterInterface.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/ClosureCacheAdapter.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/DoctrineCacheAdapter.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/NullCacheAdapter.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/Zf1CacheAdapter.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/Zf2CacheAdapter.php create mode 100644 vendor/guzzle/cache/Guzzle/Cache/composer.json create mode 100644 vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Collection.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Event.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Exception/ExceptionCollection.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Exception/InvalidArgumentException.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Exception/RuntimeException.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Exception/UnexpectedValueException.php create mode 100644 vendor/guzzle/common/Guzzle/Common/FromConfigInterface.php create mode 100644 vendor/guzzle/common/Guzzle/Common/HasDispatcherInterface.php create mode 100644 vendor/guzzle/common/Guzzle/Common/ToArrayInterface.php create mode 100644 vendor/guzzle/common/Guzzle/Common/Version.php create mode 100644 vendor/guzzle/common/Guzzle/Common/composer.json create mode 100644 vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php create mode 100644 vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Client.php create mode 100644 vendor/guzzle/http/Guzzle/Http/ClientInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Curl/CurlHandle.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiProxy.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php create mode 100644 vendor/guzzle/http/Guzzle/Http/EntityBody.php create mode 100644 vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/BadResponseException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/CouldNotRewindStreamException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/CurlException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/MultiTransferException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Exception/TooManyRedirectsException.php create mode 100644 vendor/guzzle/http/Guzzle/Http/IoEmittingEntityBody.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Header/Link.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/PostFile.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Request.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/RequestInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Message/Response.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Mimetypes.php create mode 100644 vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php create mode 100644 vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php create mode 100644 vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php create mode 100644 vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php create mode 100644 vendor/guzzle/http/Guzzle/Http/QueryString.php create mode 100644 vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php create mode 100644 vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem create mode 100644 vendor/guzzle/http/Guzzle/Http/StaticClient.php create mode 100644 vendor/guzzle/http/Guzzle/Http/Url.php create mode 100644 vendor/guzzle/http/Guzzle/Http/composer.json create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Message/AbstractMessageParser.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Message/PeclHttpMessageParser.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplate.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Url/UrlParser.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php create mode 100644 vendor/guzzle/parser/Guzzle/Parser/composer.json create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CachePlugin.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheStorageInterface.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CallbackCanCacheStrategy.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCacheKeyProvider.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCacheStorage.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultRevalidation.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DenyRevalidation.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/RevalidationInterface.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/SkipRevalidation.php create mode 100644 vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/composer.json create mode 100644 vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php create mode 100644 vendor/guzzle/stream/Guzzle/Stream/Stream.php create mode 100644 vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php create mode 100644 vendor/guzzle/stream/Guzzle/Stream/StreamRequestFactoryInterface.php create mode 100644 vendor/guzzle/stream/Guzzle/Stream/composer.json create mode 100644 vendor/phayes/geophp/.gitignore create mode 100644 vendor/phayes/geophp/.travis.yml create mode 100644 vendor/phayes/geophp/LICENSE create mode 100644 vendor/phayes/geophp/README.md create mode 100644 vendor/phayes/geophp/composer.json create mode 100644 vendor/phayes/geophp/doc/api.html create mode 100644 vendor/phayes/geophp/geoPHP.inc create mode 100644 vendor/phayes/geophp/lib/adapters/EWKB.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/EWKT.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/GPX.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/GeoAdapter.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/GeoHash.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/GeoJSON.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/GeoRSS.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/GoogleGeocode.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/KML.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/WKB.class.php create mode 100644 vendor/phayes/geophp/lib/adapters/WKT.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/Collection.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/Geometry.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/GeometryCollection.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/LineString.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/MultiLineString.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/MultiPoint.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/MultiPolygon.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/Point.class.php create mode 100644 vendor/phayes/geophp/lib/geometry/Polygon.class.php create mode 100644 vendor/phayes/geophp/tests/input/20120702.gpx create mode 100644 vendor/phayes/geophp/tests/input/an_empty_polygon.wkt create mode 100644 vendor/phayes/geophp/tests/input/barret_spur.gpx create mode 100644 vendor/phayes/geophp/tests/input/big_n_ugly.kml create mode 100644 vendor/phayes/geophp/tests/input/box.georss create mode 100644 vendor/phayes/geophp/tests/input/cdata.kml create mode 100644 vendor/phayes/geophp/tests/input/circle.georss create mode 100644 vendor/phayes/geophp/tests/input/empty_point.wkt create mode 100644 vendor/phayes/geophp/tests/input/fells_loop.gpx create mode 100644 vendor/phayes/geophp/tests/input/geometrycollection.georss create mode 100644 vendor/phayes/geophp/tests/input/geometrycollection.wkt create mode 100644 vendor/phayes/geophp/tests/input/line.georss create mode 100644 vendor/phayes/geophp/tests/input/linestring.wkt create mode 100644 vendor/phayes/geophp/tests/input/long.geohash create mode 100644 vendor/phayes/geophp/tests/input/multilinestring.ewkt create mode 100644 vendor/phayes/geophp/tests/input/multilinestring.wkt create mode 100644 vendor/phayes/geophp/tests/input/multipolygon.wkb create mode 100644 vendor/phayes/geophp/tests/input/multipolygon.wkt create mode 100644 vendor/phayes/geophp/tests/input/multipolygon2.wkt create mode 100644 vendor/phayes/geophp/tests/input/multipolygon_big.wkt create mode 100644 vendor/phayes/geophp/tests/input/opposite.gpx create mode 100644 vendor/phayes/geophp/tests/input/path.kml create mode 100644 vendor/phayes/geophp/tests/input/paths_big.json create mode 100644 vendor/phayes/geophp/tests/input/pentagon.kml create mode 100644 vendor/phayes/geophp/tests/input/point.georss create mode 100644 vendor/phayes/geophp/tests/input/point.kml create mode 100644 vendor/phayes/geophp/tests/input/point.wkt create mode 100644 vendor/phayes/geophp/tests/input/polygon.georss create mode 100644 vendor/phayes/geophp/tests/input/polygon.wkt create mode 100644 vendor/phayes/geophp/tests/input/polygon2.wkt create mode 100644 vendor/phayes/geophp/tests/input/polygon3.wkt create mode 100644 vendor/phayes/geophp/tests/input/polygon4.wkt create mode 100644 vendor/phayes/geophp/tests/input/polygon_spaces.wkt create mode 100644 vendor/phayes/geophp/tests/input/route.gpx create mode 100644 vendor/phayes/geophp/tests/input/short.geohash create mode 100644 vendor/phayes/geophp/tests/input/simple_point.json create mode 100644 vendor/phayes/geophp/tests/input/track.gpx create mode 100644 vendor/phayes/geophp/tests/postgis.php create mode 100644 vendor/phayes/geophp/tests/test.php create mode 100644 vendor/phayes/geophp/tests/tests/20120702Test.php create mode 100644 vendor/phayes/geophp/tests/tests/adaptersTest.php create mode 100644 vendor/phayes/geophp/tests/tests/bootstrap.php create mode 100644 vendor/phayes/geophp/tests/tests/geohashTest.php create mode 100644 vendor/phayes/geophp/tests/tests/geosTest.php create mode 100644 vendor/phayes/geophp/tests/tests/methodsTest.php create mode 100644 vendor/phayes/geophp/tests/tests/placeholdersTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/AbstractEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json create mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..75e1a86 --- /dev/null +++ b/composer.json @@ -0,0 +1,22 @@ +{ + "name": "events-radar/wp-plugin", + "description": "WordPress Plugin to display events from Radar.", + "license": "GPL-2.0+", + "authors": [ + { + "name": "ekes", + "email": "ekes@iskra.net" + } + ], + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/events-radar/radar-api-php" + } + ], + "minimum-stability": "alpha", + "prefer-stable": true, + "require": { + "events-radar/radar-api-php": "0.1.*@alpha" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..af017d9 --- /dev/null +++ b/composer.lock @@ -0,0 +1,525 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "80ea414a6d35f60a21a71bfd55c8ed5a", + "packages": [ + { + "name": "doctrine/common", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "d1c7d4334e38cad603a5c863d4c7b91bb04ec6b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/d1c7d4334e38cad603a5c863d4c7b91bb04ec6b2", + "reference": "d1c7d4334e38cad603a5c863d4c7b91bb04ec6b2", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/", + "role": "Creator" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2012-09-20 05:55:18" + }, + { + "name": "events-radar/radar-api-php", + "version": "0.1.0-alpha2", + "source": { + "type": "git", + "url": "https://github.com/events-radar/radar-api-php.git", + "reference": "7f65011feae28792fe5823e4569c6194f73bed94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/events-radar/radar-api-php/zipball/7f65011feae28792fe5823e4569c6194f73bed94", + "reference": "7f65011feae28792fe5823e4569c6194f73bed94", + "shasum": "" + }, + "require": { + "doctrine/common": "2.3.0", + "guzzle/cache": "3.9.2", + "guzzle/http": "3.9.2", + "guzzle/plugin-cache": "3.9.2", + "phayes/geophp": "1.2" + }, + "require-dev": { + "guzzle/guzzle": "3.9.2", + "phpunit/phpunit": "~4.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Radar\\Connect\\": "src" + } + }, + "license": [ + "GPL-2.0+" + ], + "description": "Radar API connect", + "support": { + "source": "https://github.com/events-radar/radar-api-php/tree/0.1.0-alpha2", + "issues": "https://github.com/events-radar/radar-api-php/issues" + }, + "time": "2015-02-22 10:34:30" + }, + { + "name": "guzzle/cache", + "version": "v3.9.2", + "target-dir": "Guzzle/Cache", + "source": { + "type": "git", + "url": "https://github.com/guzzle/cache.git", + "reference": "9d20d5afd4203f84893e809777ffa01e47bd4ea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/cache/zipball/9d20d5afd4203f84893e809777ffa01e47bd4ea7", + "reference": "9d20d5afd4203f84893e809777ffa01e47bd4ea7", + "shasum": "" + }, + "require": { + "guzzle/common": "self.version", + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Cache": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle cache adapter component", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "adapter", + "cache", + "doctrine", + "zf" + ], + "time": "2014-01-08 21:24:51" + }, + { + "name": "guzzle/common", + "version": "v3.9.2", + "target-dir": "Guzzle/Common", + "source": { + "type": "git", + "url": "https://github.com/guzzle/common.git", + "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/common/zipball/2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc", + "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "symfony/event-dispatcher": ">=2.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Common": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Common libraries used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "collection", + "common", + "event", + "exception" + ], + "time": "2014-08-11 04:32:36" + }, + { + "name": "guzzle/http", + "version": "v3.9.2", + "target-dir": "Guzzle/Http", + "source": { + "type": "git", + "url": "https://github.com/guzzle/http.git", + "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/http/zipball/1e8dd1e2ba9dc42332396f39fbfab950b2301dc5", + "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5", + "shasum": "" + }, + "require": { + "guzzle/common": "self.version", + "guzzle/parser": "self.version", + "guzzle/stream": "self.version", + "php": ">=5.3.2" + }, + "suggest": { + "ext-curl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Http": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "HTTP libraries used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "client", + "curl", + "http", + "http client" + ], + "time": "2014-08-11 04:32:36" + }, + { + "name": "guzzle/parser", + "version": "v3.9.2", + "target-dir": "Guzzle/Parser", + "source": { + "type": "git", + "url": "https://github.com/guzzle/parser.git", + "reference": "6874d171318a8e93eb6d224cf85e4678490b625c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/parser/zipball/6874d171318a8e93eb6d224cf85e4678490b625c", + "reference": "6874d171318a8e93eb6d224cf85e4678490b625c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Parser": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Interchangeable parsers used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "URI Template", + "cookie", + "http", + "message", + "url" + ], + "time": "2014-02-05 18:29:46" + }, + { + "name": "guzzle/plugin-cache", + "version": "v3.9.2", + "target-dir": "Guzzle/Plugin/Cache", + "source": { + "type": "git", + "url": "https://github.com/guzzle/plugin-cache.git", + "reference": "152bc4fa58e1578d01d501a97cbeee1c34edecb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/plugin-cache/zipball/152bc4fa58e1578d01d501a97cbeee1c34edecb6", + "reference": "152bc4fa58e1578d01d501a97cbeee1c34edecb6", + "shasum": "" + }, + "require": { + "guzzle/cache": "self.version", + "guzzle/http": "self.version", + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Cache": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle HTTP cache plugin", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "plugin" + ], + "time": "2014-02-05 10:00:42" + }, + { + "name": "guzzle/stream", + "version": "v3.9.2", + "target-dir": "Guzzle/Stream", + "source": { + "type": "git", + "url": "https://github.com/guzzle/stream.git", + "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/stream/zipball/60c7fed02e98d2c518dae8f97874c8f4622100f0", + "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0", + "shasum": "" + }, + "require": { + "guzzle/common": "self.version", + "php": ">=5.3.2" + }, + "suggest": { + "guzzle/http": "To convert Guzzle request objects to PHP streams" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Stream": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle stream wrapper component", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "component", + "stream" + ], + "time": "2014-05-01 21:36:02" + }, + { + "name": "phayes/geophp", + "version": "1.2", + "source": { + "type": "git", + "url": "https://github.com/phayes/geoPHP.git", + "reference": "015404e85b602e0df1f91441f8db0f9e98f7e567" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phayes/geoPHP/zipball/015404e85b602e0df1f91441f8db0f9e98f7e567", + "reference": "015404e85b602e0df1f91441f8db0f9e98f7e567", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "4.1.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "geoPHP.inc" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2 or New-BSD" + ], + "authors": [ + { + "name": "Patrick Hayes" + } + ], + "description": "GeoPHP is a open-source native PHP library for doing geometry operations. It is written entirely in PHP and can therefore run on shared hosts. It can read and write a wide variety of formats: WKT (including EWKT), WKB (including EWKB), GeoJSON, KML, GPX, GeoRSS). It works with all Simple-Feature geometries (Point, LineString, Polygon, GeometryCollection etc.) and can be used to get centroids, bounding-boxes, area, and a wide variety of other useful information.", + "homepage": "https://github.com/phayes/geoPHP", + "time": "2014-12-02 06:11:22" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.6.4", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/f75989f3ab2743a82fe0b03ded2598a2b1546813", + "reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/stopwatch": "~2.3" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2015-02-01 16:10:57" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "alpha", + "stability-flags": { + "events-radar/radar-api-php": 15 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/radar.inc.php b/radar.inc.php new file mode 100644 index 0000000..ad4ce23 --- /dev/null +++ b/radar.inc.php @@ -0,0 +1,181 @@ +prepareEventsRequest($filter, $settings['fields'], $settings['max_count']); + return $client->retrieve($request); +} + +function radar_retrieve_entities(array $entities) { + $client = radar_client(); + return $client->retrieveEntityMultiple($entities); +} + +function radar_client() { + static $connect = NULL; + + if (is_null($connect)) { + $guzzle = new Client(); + $cachePlugin = new CachePlugin(array( + 'storage' => new DefaultCacheStorage( + new DoctrineCacheAdapter( + new FilesystemCache(get_temp_dir() . '/wp-radar') + ) + ) + )); + // Add the cache plugin to the client object + $guzzle->addSubscriber($cachePlugin); + $connect = new Connect($guzzle); + } + return $connect; +} + +function radar_filter($settings) { + $filter = new \Radar\Connect\Filter; + + if (!empty($settings['city'])) { + $filter->addCity($settings['city']); + } + if (!empty($settings['group'])) { + $filter->addGroup($settings['group']); + } + + return $filter; +} + +/** + * Internal WP plugin functions. + */ + +/** + * Collapses subfields, simplifies field list. + */ +function _radar_field_collect_subfields(&$fields) { + foreach ($fields as $delta => $listed_field) { + list($field, $subfield) = explode(':', $listed_field, 2); + if (!empty($subfield)) { + // A field with subfields. + if (!empty($entity_fields[$field])) { + // Field previously seen, subfields we collect together. + $entity_fields[$field][] = $subfield; + unset($fields[$delta]); + } + else { + // Not seen before, add base field name to fields. + $entity_fields[$field][] = $subfield; + $fields[$delta] = $field; + } + } + } + return $entity_fields; +} + +/** + * Mapping for user friendly field names to internal API names. + */ +function _radar_field_name_mapping($fields) { + // Replace the nice entity names with (exposed) internal field names. + $nice_names = array('url', 'date', 'group', 'location'); + $ugly_names = array('view_url', 'date_time', 'og_group_ref', 'offline'); + return str_replace($nice_names, $ugly_names, $fields); +} + +/** + * Recursively pull the content for fields into an array. + */ +function _radar_parse_items($type, $items, $fields, $subfields = array()) { + $content = array(); + foreach ((array) $items as $item) { + $current_content = array(); + // Cycle through the fields in best order that we can. + foreach ($fields as $field_name) { + if (!$method = _radar_method_lookup($type, $field_name)) { + $current_content[] = array('field' => 'error', 'value' => sprintf( __('Unknown field: %s', 'radar_textdomain'), esc_attr($field_name))); + continue; + } + $current_field = $item->$method(); + if (!empty($subfields[$field_name])) { + $current_field = radar_retrieve_entities($current_field); + $current_subfields = $subfields[$field_name]; + $current_sub_subfields = _radar_field_collect_subfields($current_subfields); + $current_content[] = array('entity' => $field_name, 'value' => _radar_parse_items($field_name, $current_field, $current_subfields, $current_sub_subfields)); + } + else { + $current_content[] = array('field' => $field_name, 'value' => $current_field); + } + } + $content[] = $current_content; + } + + return $content; +} + +function _radar_method_lookup($type, $field) { + $lookup = array( + 'event' => array( + 'title' => 'getTitle', + 'date' => 'getDates', + 'body' => 'getBody', + 'url' => 'getUrlView', + 'image' => 'getImageRaw', + 'price' => 'getPrice', + 'email' => 'getEmail', + 'link' => 'getLink', + 'phone' => 'getPhone', + 'group' => 'getGroups', + 'location' => 'getLocations', + 'category' => 'getCategories', + 'topic' => 'getTopics', + 'created' => 'getCreated', + 'updated' => 'getUpdated', + ), + 'location' => array( + 'title' => 'getTitle', + 'address' => 'getAddress', + 'directions' => 'getDirections', + 'location' => 'getLocation', + ), + 'topic' => array( + 'title' => 'getTitle', + ), + 'category' => array( + 'title' => 'getTitle', + ), + 'group' => array( + 'title' => 'getTitle', + 'body' => 'getBody', + 'category' => 'getCategories', + 'topic' => 'getTopics', + 'location' => 'getLocations', + 'url' => 'getUrlView', + 'group_logo' => 'getGroupLogoRaw', + 'email' => 'getEmail', + 'link' => 'getLink', + 'phone' => 'getPhone', + 'opening_times' => 'getOpeningTimes', + ) + ); + return !empty($lookup[$type][$field]) ? $lookup[$type][$field] : FALSE; +} + diff --git a/radar.php b/radar.php new file mode 100644 index 0000000..f76fb69 --- /dev/null +++ b/radar.php @@ -0,0 +1,343 @@ + 'https://new-radar.iskra.net/', + 'max_count' => 5, + 'city' => '', + 'group' => '', + 'fields' => array( + 'title', + 'date', + 'location:address', + 'location:directions', + 'category:title', + 'topic:title', + 'price', + 'link', + 'body', + 'group:title', + 'group:url', + 'created', + 'url', + ), + ); + $event_settings = shortcode_atts($defaults, $attributes, 'radar_events'); + // Collect subfields of entities together, and get a list. + // Edits the actual field list to collect the entity fields together. + $fields = $event_settings['fields']; + $subfields = _radar_field_collect_subfields($fields); + $event_settings['fields'] = $fields; + $events = radar_retrieve_events($event_settings); + // Now parse these objects and retrieve any subfields into arrays. + $events = _radar_parse_items('event', $events, $fields, $subfields); + $content = ''; + foreach ($events as $event) { + $content .= radar_format_item('event', $event, array('type' => 'radar_events', 'attributes' => $attributes)); + } + return $content; +} +add_shortcode('radar_events', 'radar_shortcode_events'); + +// +// TODO [radar_groups] +// + +// +// +// FILTERS +// +// To alter the values and HTML of the output for a shortcode. +// +// + +// +// 'radar_shortcode_field_value' +// + +/** + * Basic implementation of 'radar_shortcode_field_value' filter. + * + * Prepare the value of a field to be put into HTML. + * Doesn't actually do anything but set the 'value' to become the 'output used; + * and the 'field' name to become the 'type' used for HTML formatting filter. + * + * @param array $field + * Keyed array of data: ['value'] parsed value; ['field'] field name. + * @param string type + * Context: The item type this field is attached. + * @param array $item + * Context: The full item itself. Useful for merging field content together. + * @param array $parents + * Context: Any parent items. So the topic of an event has the event item in + * this array. It is empty if it is a field on the event itself. + * @param array $shortcode + * Context: Array with short code type eg. radar_events and the attributes. + * + * @return array + * Altered $field array. Finally requires keys ['output'] for output value + * to be used, and ['type'] for the type to be used. + */ +function radar_shortcode_field_value($field, $type, $item, $parents, $shortcode) { + $field['output'] = $field['value']; + $field['type'] = $field['field']; + return $field; +} +add_filter('radar_shortcode_field_value', 'radar_shortcode_field_value', 10, 5); + +/** + * Date field formatting implementation of 'radar_shortcode_field_value' filter. + * + * The dates are in http://php.net/DateTime format. The 'date' field has ['start'], + * ['end'] times, it also has a string ['rrule'] iCal repeat rule. + */ +function radar_shortcode_field_date_value($field, $type, $item, $parents, $shortcode) { + // Fields that need additional formatting. + switch ($field['field']) { + case 'created': + case 'updated': + if ($field['value']->getTimestamp() != 0) { + $field['output'] = $field['field'] == 'created' ? __('Created: ', 'radar_textdomain') : __('Updated: ', 'radar_textdomain'); + $field['output'] .= $field['value']->format('Y-m-d H:i:s'); + } + else { + $field['output'] = ''; + $field['type'] = '_none'; + } + break; + case 'date': + $field['output'] = array(); + foreach ($field['value'] as $date) { + $this_date = sprintf(__('Start: %s', 'radar_textdomain'), $date['start']->format('Y-m-d H:i:s')); + if ($field['value']['start'] != $field['value']['end']) { + $this_date .= '
' + . sprintf(__('End: %s', 'radar_textdomain'), $date['end']->format('Y-m-d H:i:s')); + } + $field['output'][] = $this_date; + } + break; + } + + return $field; +} +add_filter('radar_shortcode_field_value', 'radar_shortcode_field_date_value', 12, 5); + +/** + * Location field implementation of 'radar_shortcode_field_value' filter. + * + * The location field location:location is a https://github.com/phayes/geoPHP object. + * It is usually a point. + */ +function radar_shortcode_field_location_value($field, $type, $item, $parents, $shortcode) { + if ($field['field'] == 'location') { + $field['output'] = $field['value']->out('wkt'); + } + + return $field; +} +add_filter('radar_shortcode_field_value', 'radar_shortcode_field_location_value', 12, 5); + +/** + * Item Radar URL implementation of 'radar_shortcode_field_value' filter. + * + * If there is a title, and the link to the item on radar, this is turned into a link. + * If there is a url field, but this is a sub-item, it has parents (group of an + * event for example), then the url is not shown. If it is on the main item then it's + * turned into a 'more…' link. + */ +function radar_shortcode_field_url_value($field, $type, $item, $parents, $shortcode) { + if ($field['field'] == 'title') { + foreach ($item as $other_field) { + if ($other_field['field'] == 'url') { + $field['output'] = '' . $field['output'] . ''; + } + } + } + if ($field['field'] == 'url') { + if (count($parents)) { + $field['output'] = ''; + $field['type'] = '_none'; + } + else { + $field['output'] = '' . __('more…', 'radar_textdomain') . ''; + } + } + + return $field; +} +add_filter('radar_shortcode_field_value', 'radar_shortcode_field_url_value', 12, 5); + +// +// 'radar_shortcode_field_html' +// + +/** + * Basic implementation of 'radar_shortcode_field_html' filter. + * + * Put the output into HTML. + * Before this implementation is run output for multiple fields are in an array. + * + * @param array|string $output + * The output to be put into HTML to be displayed. + * @param array $field + * Context: Keyed array of data: ['value'] parsed value; ['field'] field name, + * ['output'] the original $output before changes ['type'] the requested type. + * @param string type + * Context: The item type this field is attached. + * @param array $item + * Context: The full item itself. Useful for merging field content together. + * @param array $parents + * Context: Any parent items. So the topic of an event has the event item in + * this array. It is empty if it is a field on the event itself. + * @param array $shortcode + * Context: Array with short code type eg. radar_events and the attributes. + * + * @return array + * Altered $field array. Finally requires keys ['output'] for output value + * to be used, and ['type'] for the type to be used. + */ +function radar_shortcode_field_html($output, $field, $type, $item, $parents, $shortcode) { + if (is_array($output)) { + $output = implode(', ', $output); + } + + return $output; +} +add_filter('radar_shortcode_field_html', 'radar_shortcode_field_html', 10, 6); + +/** + * Link field HTML implementation of 'radar_shortcode_field_html' filter. + * + * Turns the external link field into a clickable URL. + * + * The field itself is an array, so this is run before the array is collapsed + * by radar_shortcode_field_html (weight 8 before 10). + */ +function radar_shortcode_field_link_html($output, $field, $type, $item, $parents, $shortcode) { + if ($field['type'] == 'link') { + foreach ($output as &$link) { + $link = '' . $link . ''; + } + } + + return $output; +} +add_filter('radar_shortcode_field_html', 'radar_shortcode_field_link_html', 8, 6); + +/** + * Title field HTML implentation of 'radar_shortcode_field_html' filter. + */ +function radar_shortcode_field_title_html($output, $field, $type, $item, $parents, $shortcode) { + if ($field['type'] == 'title' && !count($parents)) { + $output = '

' . $output . '

'; + } + + return $output; +} +add_filter('radar_shortcode_field_html', 'radar_shortcode_field_title_html', 12, 6); + +/** + * Subfields HTML implementation of 'radar_shortcode_field_html' filter. + * + * All the fields together of an event location/topic/... + */ +function radar_shortcode_field_subfields_html($output, $field, $type, $item, $parents, $shortcode) { + if (($type == 'event' || $type == 'group') && !empty($field['entity'])) { + $output = '
' . $output . '
'; + } + + return $output; +} +add_filter('radar_shortcode_field_html', 'radar_shortcode_field_subfields_html', 12, 6); + +/** + * Default paragraph HTML for fields, implementation of 'radar_shortcode_field_html' filter. + * + * For fields or the main item, not subfields. + */ +function radar_shortcode_field_paragraph_html($output, $field, $type, $item, $parents, $shortcode) { + if (empty($parents) && in_array($field['type'], array('date', 'url', 'price', 'email', 'link', 'phone', 'created', 'updated', 'opening_times'))) { + $output = '

' . $output . '

'; + } + + return $output; +} +add_filter('radar_shortcode_field_html', 'radar_shortcode_field_paragraph_html', 12, 6); + + +// +// Other WP hooks. +// + +/** + * Registers translation text domain. + */ +function radar_textdomain() { + if (function_exists('load_plugin_textdomain')) { + load_plugin_textdomain('radar_textdomain', FALSE, dirname(plugin_basename(__FILE__)) . '/languages'); + } +} +add_action('init', 'radar_textdomain'); + +/** + * Shortcode filter callback. + * + * Enable an array of fields from the comma separated list on fields attribute. + */ +function radar_shortcode_parse($out, $pairs, $atts) { + if (!empty($atts['fields'])) { + $out['fields'] = explode(',', $atts['fields']); + } + + return $out; +} +add_filter('shortcode_atts_radar_events', 'radar_shortcode_parse', 10, 3); + +// +// Helper functions +// + +/** + * Format item's parsed fields array for radar shortcode's. + */ +function radar_format_item($type, $item, $shortcode, $parents = array()) { + foreach ($item as $field) { + // Item containing other items. + if (!empty($field['entity'])) { + $entity_content = array(); + foreach ($field['value'] as $entity) { + $entity_content[] = radar_format_item($field['entity'], $entity, $shortcode, array_merge($parents, array($field))); + } + $content .= apply_filters('radar_shortcode_field_html', $entity_content, $field, $type, $item, $parents, $shortcode); + } + else { + $field = apply_filters('radar_shortcode_field_value', $field, $type, $item, $parents, $shortcode); + $content .= apply_filters('radar_shortcode_field_html', $field['output'], $field, $type, $item, $parents, $shortcode); + } + } + return $content; +} diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..0210e40 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0 class loader + * + * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + + private $classMapAuthoritative = false; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-0 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 + if ('\\' == $class[0]) { + $class = substr($class, 1); + } + + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative) { + return false; + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { + if (0 === strpos($class, $prefix)) { + foreach ($this->prefixDirsPsr4[$prefix] as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..ca28fe5 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/phayes/geophp/geoPHP.inc', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..36d78b7 --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,17 @@ + array($vendorDir . '/symfony/event-dispatcher'), + 'Guzzle\\Stream' => array($vendorDir . '/guzzle/stream'), + 'Guzzle\\Plugin\\Cache' => array($vendorDir . '/guzzle/plugin-cache'), + 'Guzzle\\Parser' => array($vendorDir . '/guzzle/parser'), + 'Guzzle\\Http' => array($vendorDir . '/guzzle/http'), + 'Guzzle\\Common' => array($vendorDir . '/guzzle/common'), + 'Guzzle\\Cache' => array($vendorDir . '/guzzle/cache'), + 'Doctrine\\Common' => array($vendorDir . '/doctrine/common/lib'), +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..c5f7265 --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,10 @@ + array($vendorDir . '/events-radar/radar-api-php/src'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..092d67f --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ + $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + + $loader->register(true); + + return $loader; + } +} + +function composerRequireb76dc235707b379b8d671a0307e67585($file) +{ + require $file; +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..ce9c2be --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,527 @@ +[ + { + "name": "phayes/geophp", + "version": "1.2", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phayes/geoPHP.git", + "reference": "015404e85b602e0df1f91441f8db0f9e98f7e567" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phayes/geoPHP/zipball/015404e85b602e0df1f91441f8db0f9e98f7e567", + "reference": "015404e85b602e0df1f91441f8db0f9e98f7e567", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "4.1.*" + }, + "time": "2014-12-02 06:11:22", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "geoPHP.inc" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2 or New-BSD" + ], + "authors": [ + { + "name": "Patrick Hayes" + } + ], + "description": "GeoPHP is a open-source native PHP library for doing geometry operations. It is written entirely in PHP and can therefore run on shared hosts. It can read and write a wide variety of formats: WKT (including EWKT), WKB (including EWKB), GeoJSON, KML, GPX, GeoRSS). It works with all Simple-Feature geometries (Point, LineString, Polygon, GeometryCollection etc.) and can be used to get centroids, bounding-boxes, area, and a wide variety of other useful information.", + "homepage": "https://github.com/phayes/geoPHP" + }, + { + "name": "doctrine/common", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "d1c7d4334e38cad603a5c863d4c7b91bb04ec6b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/d1c7d4334e38cad603a5c863d4c7b91bb04ec6b2", + "reference": "d1c7d4334e38cad603a5c863d4c7b91bb04ec6b2", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "time": "2012-09-20 05:55:18", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Doctrine\\Common": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/", + "role": "Creator" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ] + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.6.4", + "version_normalized": "2.6.4.0", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/f75989f3ab2743a82fe0b03ded2598a2b1546813", + "reference": "f75989f3ab2743a82fe0b03ded2598a2b1546813", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/stopwatch": "~2.3" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "time": "2015-02-01 16:10:57", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com" + }, + { + "name": "guzzle/common", + "version": "v3.9.2", + "version_normalized": "3.9.2.0", + "target-dir": "Guzzle/Common", + "source": { + "type": "git", + "url": "https://github.com/guzzle/common.git", + "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/common/zipball/2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc", + "reference": "2e36af7cf2ce3ea1f2d7c2831843b883a8e7b7dc", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "symfony/event-dispatcher": ">=2.1" + }, + "time": "2014-08-11 04:32:36", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Guzzle\\Common": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Common libraries used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "collection", + "common", + "event", + "exception" + ] + }, + { + "name": "guzzle/cache", + "version": "v3.9.2", + "version_normalized": "3.9.2.0", + "target-dir": "Guzzle/Cache", + "source": { + "type": "git", + "url": "https://github.com/guzzle/cache.git", + "reference": "9d20d5afd4203f84893e809777ffa01e47bd4ea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/cache/zipball/9d20d5afd4203f84893e809777ffa01e47bd4ea7", + "reference": "9d20d5afd4203f84893e809777ffa01e47bd4ea7", + "shasum": "" + }, + "require": { + "guzzle/common": "self.version", + "php": ">=5.3.2" + }, + "time": "2014-01-08 21:24:51", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Guzzle\\Cache": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle cache adapter component", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "adapter", + "cache", + "doctrine", + "zf" + ] + }, + { + "name": "guzzle/stream", + "version": "v3.9.2", + "version_normalized": "3.9.2.0", + "target-dir": "Guzzle/Stream", + "source": { + "type": "git", + "url": "https://github.com/guzzle/stream.git", + "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/stream/zipball/60c7fed02e98d2c518dae8f97874c8f4622100f0", + "reference": "60c7fed02e98d2c518dae8f97874c8f4622100f0", + "shasum": "" + }, + "require": { + "guzzle/common": "self.version", + "php": ">=5.3.2" + }, + "suggest": { + "guzzle/http": "To convert Guzzle request objects to PHP streams" + }, + "time": "2014-05-01 21:36:02", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Guzzle\\Stream": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle stream wrapper component", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "component", + "stream" + ] + }, + { + "name": "guzzle/parser", + "version": "v3.9.2", + "version_normalized": "3.9.2.0", + "target-dir": "Guzzle/Parser", + "source": { + "type": "git", + "url": "https://github.com/guzzle/parser.git", + "reference": "6874d171318a8e93eb6d224cf85e4678490b625c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/parser/zipball/6874d171318a8e93eb6d224cf85e4678490b625c", + "reference": "6874d171318a8e93eb6d224cf85e4678490b625c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "time": "2014-02-05 18:29:46", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Guzzle\\Parser": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Interchangeable parsers used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "URI Template", + "cookie", + "http", + "message", + "url" + ] + }, + { + "name": "guzzle/http", + "version": "v3.9.2", + "version_normalized": "3.9.2.0", + "target-dir": "Guzzle/Http", + "source": { + "type": "git", + "url": "https://github.com/guzzle/http.git", + "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/http/zipball/1e8dd1e2ba9dc42332396f39fbfab950b2301dc5", + "reference": "1e8dd1e2ba9dc42332396f39fbfab950b2301dc5", + "shasum": "" + }, + "require": { + "guzzle/common": "self.version", + "guzzle/parser": "self.version", + "guzzle/stream": "self.version", + "php": ">=5.3.2" + }, + "suggest": { + "ext-curl": "*" + }, + "time": "2014-08-11 04:32:36", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Guzzle\\Http": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "HTTP libraries used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "client", + "curl", + "http", + "http client" + ] + }, + { + "name": "guzzle/plugin-cache", + "version": "v3.9.2", + "version_normalized": "3.9.2.0", + "target-dir": "Guzzle/Plugin/Cache", + "source": { + "type": "git", + "url": "https://github.com/guzzle/plugin-cache.git", + "reference": "152bc4fa58e1578d01d501a97cbeee1c34edecb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/plugin-cache/zipball/152bc4fa58e1578d01d501a97cbeee1c34edecb6", + "reference": "152bc4fa58e1578d01d501a97cbeee1c34edecb6", + "shasum": "" + }, + "require": { + "guzzle/cache": "self.version", + "guzzle/http": "self.version", + "php": ">=5.3.2" + }, + "time": "2014-02-05 10:00:42", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Guzzle\\Plugin\\Cache": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle HTTP cache plugin", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "plugin" + ] + }, + { + "name": "events-radar/radar-api-php", + "version": "0.1.0-alpha2", + "version_normalized": "0.1.0.0-alpha2", + "source": { + "type": "git", + "url": "https://github.com/events-radar/radar-api-php.git", + "reference": "7f65011feae28792fe5823e4569c6194f73bed94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/events-radar/radar-api-php/zipball/7f65011feae28792fe5823e4569c6194f73bed94", + "reference": "7f65011feae28792fe5823e4569c6194f73bed94", + "shasum": "" + }, + "require": { + "doctrine/common": "2.3.0", + "guzzle/cache": "3.9.2", + "guzzle/http": "3.9.2", + "guzzle/plugin-cache": "3.9.2", + "phayes/geophp": "1.2" + }, + "require-dev": { + "guzzle/guzzle": "3.9.2", + "phpunit/phpunit": "~4.5" + }, + "time": "2015-02-22 10:34:30", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Radar\\Connect\\": "src" + } + }, + "license": [ + "GPL-2.0+" + ], + "description": "Radar API connect", + "support": { + "source": "https://github.com/events-radar/radar-api-php/tree/0.1.0-alpha2", + "issues": "https://github.com/events-radar/radar-api-php/issues" + } + } +] diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore new file mode 100644 index 0000000..fb5e79d --- /dev/null +++ b/vendor/doctrine/common/.gitignore @@ -0,0 +1,4 @@ +build/ +logs/ +reports/ +dist/ diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules new file mode 100644 index 0000000..51f0843 --- /dev/null +++ b/vendor/doctrine/common/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/vendor/doctrine-build-common"] + path = lib/vendor/doctrine-build-common + url = git://github.com/doctrine/doctrine-build-common.git diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml new file mode 100644 index 0000000..fc05056 --- /dev/null +++ b/vendor/doctrine/common/.travis.yml @@ -0,0 +1,10 @@ +language: php + +env: + - OPCODE_CACHE=apc + +php: + - 5.3 + - 5.4 + +before_script: php ./bin/travis-setup.php $OPCODE_CACHE \ No newline at end of file diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE new file mode 100644 index 0000000..4a91f0b --- /dev/null +++ b/vendor/doctrine/common/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006-2012 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/common/README.md b/vendor/doctrine/common/README.md new file mode 100644 index 0000000..c63f762 --- /dev/null +++ b/vendor/doctrine/common/README.md @@ -0,0 +1,12 @@ +# Doctrine Common + +[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common) + +The Doctrine Common project is a library that provides extensions to core PHP functionality. + +## More resources: + +* [Website](http://www.doctrine-project.org) +* [Documentation](http://www.doctrine-project.org/projects/common/current/docs/en) +* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM) +* [Downloads](http://github.com/doctrine/common/downloads) diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1 new file mode 100644 index 0000000..891a2e5 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_1 @@ -0,0 +1,39 @@ +This document details all the possible changes that you should investigate when updating +your project from Doctrine Common 2.0.x to 2.1 + +## AnnotationReader changes + +The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way: + + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + // new code necessary starting here + $reader->setIgnoreNotImportedAnnotations(true); + $reader->setEnableParsePhpImports(false); + $reader = new \Doctrine\Common\Annotations\CachedReader( + new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache() + ); + +## Annotation Base class or @Annotation + +Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored. + +## Removed methods on AnnotationReader + +* AnnotationReader::setAutoloadAnnotations() +* AnnotationReader::getAutoloadAnnotations() +* AnnotationReader::isAutoloadAnnotations() + +## AnnotationRegistry + +Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes: + + \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null); + \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces); + \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable); + +The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned. +The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories. +If null is passed as directory the include path will be used. + diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2 new file mode 100644 index 0000000..1d93a13 --- /dev/null +++ b/vendor/doctrine/common/UPGRADE_TO_2_2 @@ -0,0 +1,61 @@ +This document details all the possible changes that you should investigate when +updating your project from Doctrine Common 2.1 to 2.2: + +## Annotation Changes + +- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to + add ignore annotation names which are supposed to be ignored via + AnnotationReader::addGlobalIgnoredName + +- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry + in 2.1 and has been removed in 2.2 + +- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new + annotation mechanism in 2.1 and is removed in 2.2 + +- AnnotationReader::isParsePhpImportsEnabled is removed (see above) + +- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit + configuration in 2.1 and will be removed in 2.2 (for isolated projects where you + have full-control over _all_ available annotations, we offer a dedicated reader + class ``SimpleAnnotationReader``) + +- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be + removed in 2.2. We only offer two creation mechanisms which cannot be changed + anymore to allow the same reader instance to work with all annotations regardless + of which library they are coming from. + +- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be + removed in 2.2 (see setDefaultAnnotationNamespace) + +- If you use a class as annotation which has not the @Annotation marker in it's + class block, we will now throw an exception instead of silently ignoring it. You + can however still achieve the previous behavior using the @IgnoreAnnotation, or + AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed + instructions when you run into this problem). + +## Cache Changes + +- Renamed old AbstractCache to CacheProvider + +- Dropped the support to the following functions of all cache providers: + + - CacheProvider::deleteByWildcard + + - CacheProvider::deleteByRegEx + + - CacheProvider::deleteByPrefix + + - CacheProvider::deleteBySuffix + +- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid + +- CacheProvider::flushAll will remove ALL entries, namespaced or not + +- Added support to MemcachedCache + +- Added support to WincacheCache + +## ClassLoader Changes + +- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function \ No newline at end of file diff --git a/vendor/doctrine/common/bin/travis-setup.php b/vendor/doctrine/common/bin/travis-setup.php new file mode 100644 index 0000000..e9c355a --- /dev/null +++ b/vendor/doctrine/common/bin/travis-setup.php @@ -0,0 +1,141 @@ +. + */ + +/** + * Install PHP extensions required for testing by Travis CI. + * + * @author Victor Berchet + * @since 2.2 + */ +$installer = new PhpExtensions(); + +if (isset($argv[1]) && 'APC' === strtoupper($argv[1])) { + $installer->install('apc'); +} else { + $installer->install('xcache'); +} + +$installer->install('memcache'); +$installer->install('memcached'); + +class PhpExtensions +{ + protected $extensions; + protected $phpVersion; + protected $iniPath; + + public function __construct() + { + $this->phpVersion = phpversion(); + $this->iniPath = php_ini_loaded_file(); + $this->extensions = array( + 'memcache' => array( + 'url' => 'http://pecl.php.net/get/memcache-2.2.6.tgz', + 'php_version' => array(), + 'cfg' => array('--enable-memcache'), + 'ini' => array('extension=memcache.so'), + ), + 'memcached' => array( + 'url' => 'http://pecl.php.net/get/memcached-1.0.2.tgz', + 'php_version' => array( + // memcached 1.0.2 does not build on PHP 5.4 + array('<', '5.4'), + ), + 'cfg' => array(), + 'ini' => array('extension=memcached.so'), + ), + 'apc' => array( + 'url' => 'http://pecl.php.net/get/APC-3.1.9.tgz', + 'php_version' => array( + // apc 3.1.9 causes a segfault on PHP 5.4 + array('<', '5.4'), + ), + 'cfg' => array(), + 'ini' => array( + 'extension=apc.so', + 'apc.enabled=1', + 'apc.enable_cli=1' + ), + ), + 'xcache' => array( + 'url' => 'http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz', + 'php_version' => array( + // xcache does not build with Travis CI (as of 2012-01-09) + array('<', '5'), + ), + 'cfg' => array('--enable-xcache'), + 'ini' => array( + 'extension=xcache.so', + 'xcache.cacher=false', + 'xcache.admin.enable_auth=0', + 'xcache.var_size=1M', + ), + ), + ); + } + + public function install($name) + { + if (array_key_exists($name, $this->extensions)) { + $extension = $this->extensions[$name]; + + + echo "== extension: $name ==\n"; + + foreach ($extension['php_version'] as $version) { + if (!version_compare($this->phpVersion, $version[1], $version[0])) { + printf( + "=> not installed, requires a PHP version %s %s (%s installed)\n", + $version[0], + $version[1], + $this->phpVersion + ); + + return; + } + } + + $this->system(sprintf("wget %s > /dev/null 2>&1", $extension['url'])); + $file = basename($extension['url']); + $this->system(sprintf("tar -xzf %s > /dev/null 2>&1", $file)); + $folder = basename($file, ".tgz"); + $folder = basename($folder, ".tar.gz"); + $this->system(sprintf( + 'sh -c "cd %s && phpize && ./configure %s && make && sudo make install" > /dev/null 2>&1', + $folder, + implode(' ', $extension['cfg']) + )); + foreach ($extension['ini'] as $ini) { + $this->system(sprintf("echo %s >> %s", $ini, $this->iniPath)); + } + printf("=> installed (%s)\n", $folder); + } + } + + private function system($cmd) + { + $ret = 0; + system($cmd, $ret); + if (0 !== $ret) { + printf("=> Command '%s' failed !", $cmd); + + exit($ret); + } + } +} diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties new file mode 100644 index 0000000..ff311a4 --- /dev/null +++ b/vendor/doctrine/common/build.properties @@ -0,0 +1,6 @@ +# Project Name +project.name=DoctrineCommon + +# Version class and file +project.version_class = Doctrine\Common\Version +project.version_file = lib/Doctrine/Common/Version.php diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml new file mode 100644 index 0000000..71a9a50 --- /dev/null +++ b/vendor/doctrine/common/build.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DoctrineCommon + Doctrine Common PHP Extensions + pear.doctrine-project.org + The Doctrine Common package contains shared code between the other packages. + + + + + LGPL + + + - + + + + + + + diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json new file mode 100644 index 0000000..c87258d --- /dev/null +++ b/vendor/doctrine/common/composer.json @@ -0,0 +1,26 @@ +{ + "name": "doctrine/common", + "type": "library", + "description": "Common Library for Doctrine projects", + "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"], + "homepage": "http://www.doctrine-project.org", + "license": "MIT", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": ">=5.3.2" + }, + "autoload": { + "psr-0": { "Doctrine\\Common": "lib/" } + }, + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php new file mode 100644 index 0000000..6a1390a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation.php @@ -0,0 +1,79 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Annotations class + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Annotation +{ + /** + * Value property. Common among all derived classes. + * + * @var string + */ + public $value; + + /** + * Constructor + * + * @param array $data Key-value for properties to be defined in this class + */ + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + /** + * Error handler for unknown property accessor in Annotation class. + * + * @param string $name Unknown property name + * + * @throws \BadMethodCallException + */ + public function __get($name) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } + + /** + * Error handler for unknown property mutator in Annotation class. + * + * @param string $name Unkown property name + * @param mixed $value Property value + * + * @throws \BadMethodCallException + */ + public function __set($name, $value) + { + throw new \BadMethodCallException( + sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this)) + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php new file mode 100644 index 0000000..dbef6df --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attribute.php @@ -0,0 +1,47 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the attribute type during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attribute +{ + /** + * @var string + */ + public $name; + + /** + * @var string + */ + public $type; + + /** + * @var boolean + */ + public $required = false; +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php new file mode 100644 index 0000000..53134e3 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Attributes.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the types of all declared attributes during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Attributes +{ + /** + * @var array + */ + public $value; +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php new file mode 100644 index 0000000..a84a4f5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php @@ -0,0 +1,54 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser to ignore specific + * annotations during the parsing process. + * + * @Annotation + * @author Johannes M. Schmitt + */ +final class IgnoreAnnotation +{ + /** + * @var array + */ + public $names; + + /** + * Constructor + * + * @param array $values + * + * @throws \RuntimeException + */ + public function __construct(array $values) + { + if (is_string($values['value'])) { + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])) { + throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value']))); + } + + $this->names = $values['value']; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php new file mode 100644 index 0000000..d67f960 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Required.php @@ -0,0 +1,33 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check if that attribute is required during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Required +{ +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php new file mode 100644 index 0000000..64655ef --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Annotation/Target.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Annotations\Annotation; + +/** + * Annotation that can be used to signal to the parser + * to check the annotation target during the parsing process. + * + * @author Fabio B. Silva + * + * @Annotation + */ +final class Target +{ + const TARGET_CLASS = 1; + const TARGET_METHOD = 2; + const TARGET_PROPERTY = 4; + const TARGET_ANNOTATION = 8; + const TARGET_ALL = 15; + + /** + * @var array + */ + private static $map = array( + 'ALL' => self::TARGET_ALL, + 'CLASS' => self::TARGET_CLASS, + 'METHOD' => self::TARGET_METHOD, + 'PROPERTY' => self::TARGET_PROPERTY, + 'ANNOTATION' => self::TARGET_ANNOTATION, + ); + + /** + * @var array + */ + public $value; + + /** + * Targets as bitmask. + * + * @var integer + */ + public $targets; + + /** + * Literal target declaration. + * + * @var integer + */ + public $literal; + + /** + * Annotation construct + * + * @param array $values + * + * @throws \InvalidArgumentException + */ + public function __construct(array $values) + { + if (!isset($values['value'])){ + $values['value'] = null; + } + if (is_string($values['value'])){ + $values['value'] = array($values['value']); + } + if (!is_array($values['value'])){ + throw new \InvalidArgumentException( + sprintf('@Target expects either a string value, or an array of strings, "%s" given.', + is_object($values['value']) ? get_class($values['value']) : gettype($values['value']) + ) + ); + } + + $bitmask = 0; + foreach ($values['value'] as $literal) { + if(!isset(self::$map[$literal])){ + throw new \InvalidArgumentException( + sprintf('Invalid Target "%s". Available targets: [%s]', + $literal, implode(', ', array_keys(self::$map))) + ); + } + $bitmask += self::$map[$literal]; + } + + $this->targets = $bitmask; + $this->value = $values['value']; + $this->literal = implode(', ', $this->value); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php new file mode 100644 index 0000000..109beeb --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationException.php @@ -0,0 +1,127 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Description of AnnotationException + * + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class AnnotationException extends \Exception +{ + /** + * Creates a new AnnotationException describing a Syntax error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function syntaxError($message) + { + return new self('[Syntax Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a Semantical error. + * + * @param string $message Exception message + * @return AnnotationException + */ + public static function semanticalError($message) + { + return new self('[Semantical Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing a constant semantical error. + * + * @since 2.3 + * @param string $identifier + * @param string $context + * @return AnnotationException + */ + public static function semanticalErrorConstants($identifier, $context = null) + { + return self::semanticalError(sprintf( + "Couldn't find constant %s%s", $identifier, + $context ? ", $context." : "." + )); + } + + /** + * Creates a new AnnotationException describing an error which occurred during + * the creation of the annotation. + * + * @since 2.2 + * @param string $message + * @return AnnotationException + */ + public static function creationError($message) + { + return new self('[Creation Error] ' . $message); + } + + /** + * Creates a new AnnotationException describing an type error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @param mixed $actual + * @return AnnotationException + */ + public static function typeError($attributeName, $annotationName, $context, $expected, $actual) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s, but got %s.', + $attributeName, + $annotationName, + $context, + $expected, + is_object($actual) ? 'an instance of '.get_class($actual) : gettype($actual) + )); + } + + /** + * Creates a new AnnotationException describing an required error of an attribute. + * + * @since 2.2 + * @param string $attributeName + * @param string $annotationName + * @param string $context + * @param string $expected + * @return AnnotationException + */ + public static function requiredError($attributeName, $annotationName, $context, $expected) + { + return new self(sprintf( + '[Type Error] Attribute "%s" of @%s declared on %s expects %s. This value should not be null.', + $attributeName, + $annotationName, + $context, + $expected + )); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php new file mode 100644 index 0000000..286e7d0 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationReader.php @@ -0,0 +1,310 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; +use Doctrine\Common\Annotations\Annotation\Target; +use Closure; +use ReflectionClass; +use ReflectionMethod; +use ReflectionProperty; + +/** + * A reader for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +class AnnotationReader implements Reader +{ + /** + * Global map for imports. + * + * @var array + */ + private static $globalImports = array( + 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation', + ); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names are case sensitive. + * + * @var array + */ + private static $globalIgnoredNames = array( + 'access'=> true, 'author'=> true, 'copyright'=> true, 'deprecated'=> true, + 'example'=> true, 'ignore'=> true, 'internal'=> true, 'link'=> true, 'see'=> true, + 'since'=> true, 'tutorial'=> true, 'version'=> true, 'package'=> true, + 'subpackage'=> true, 'name'=> true, 'global'=> true, 'param'=> true, + 'return'=> true, 'staticvar'=> true, 'category'=> true, 'staticVar'=> true, + 'static'=> true, 'var'=> true, 'throws'=> true, 'inheritdoc'=> true, + 'inheritDoc'=> true, 'license'=> true, 'todo'=> true, + 'deprec'=> true, 'property' => true, 'method' => true, + 'abstract'=> true, 'exception'=> true, 'magic' => true, 'api' => true, + 'final'=> true, 'filesource'=> true, 'throw' => true, 'uses' => true, + 'usedby'=> true, 'private' => true, 'Annotation' => true, 'override' => true, + 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true, + 'Required' => true, 'Attribute' => true, 'Attributes' => true, + 'Target' => true, 'SuppressWarnings' => true, + 'ingroup' => true, 'code' => true, 'endcode' => true, + 'package_version' => true, + ); + + /** + * Add a new annotation to the globally ignored annotation names with regard to exception handling. + * + * @param string $name + */ + static public function addGlobalIgnoredName($name) + { + self::$globalIgnoredNames[$name] = true; + } + + /** + * Annotations Parser + * + * @var \Doctrine\Common\Annotations\DocParser + */ + private $parser; + + /** + * Annotations Parser used to collect parsing metadata + * + * @var \Doctrine\Common\Annotations\DocParser + */ + private $preParser; + + /** + * PHP Parser used to collect imports. + * + * @var \Doctrine\Common\Annotations\PhpParser + */ + private $phpParser; + + /** + * In-memory cache mechanism to store imported annotations per class. + * + * @var array + */ + private $imports = array(); + + /** + * In-memory cache mechanism to store ignored annotations per class. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * Constructor. + * + * Initializes a new AnnotationReader. + */ + public function __construct() + { + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php'); + + $this->parser = new DocParser; + + $this->preParser = new DocParser; + $this->preParser->setImports(self::$globalImports); + $this->preParser->setIgnoreNotImportedAnnotations(true); + + $this->phpParser = new PhpParser; + } + + /** + * Gets the annotations applied to a class. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @return array An array of Annotations. + */ + public function getClassAnnotations(ReflectionClass $class) + { + $this->parser->setTarget(Target::TARGET_CLASS); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName()); + } + + /** + * Gets a class annotation. + * + * @param ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(ReflectionClass $class, $annotationName) + { + $annotations = $this->getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a property. + * + * @param ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + $this->parser->setTarget(Target::TARGET_PROPERTY); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($property->getDocComment(), $context); + } + + /** + * Gets a property annotation. + * + * @param ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets the annotations applied to a method. + * + * @param \ReflectionMethod $method The ReflectionMethod of the method from which + * the annotations should be read. + * + * @return array An array of Annotations. + */ + public function getMethodAnnotations(ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + $this->parser->setTarget(Target::TARGET_METHOD); + $this->parser->setImports($this->getImports($class)); + $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class)); + + return $this->parser->parse($method->getDocComment(), $context); + } + + /** + * Gets a method annotation. + * + * @param ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Returns the ignored annotations for the given class. + * + * @param ReflectionClass $class + * @return array + */ + private function getIgnoredAnnotationNames(ReflectionClass $class) + { + if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) { + return $this->ignoredAnnotationNames[$name]; + } + $this->collectParsingMetadata($class); + + return $this->ignoredAnnotationNames[$name]; + } + + /** + * Retrieve imports + * + * @param \ReflectionClass $class + * @return array + */ + private function getImports(ReflectionClass $class) + { + if (isset($this->imports[$name = $class->getName()])) { + return $this->imports[$name]; + } + $this->collectParsingMetadata($class); + + return $this->imports[$name]; + } + + /** + * Collects parsing metadata for a given class + * + * @param ReflectionClass $class + */ + private function collectParsingMetadata(ReflectionClass $class) + { + $ignoredAnnotationNames = self::$globalIgnoredNames; + + $annotations = $this->preParser->parse($class->getDocComment(), 'class '.$class->name); + foreach ($annotations as $annotation) { + if ($annotation instanceof IgnoreAnnotation) { + foreach ($annotation->names AS $annot) { + $ignoredAnnotationNames[$annot] = true; + } + } + } + + $name = $class->getName(); + $this->imports[$name] = array_merge( + self::$globalImports, + $this->phpParser->parseClass($class), + array('__NAMESPACE__' => $class->getNamespaceName()) + ); + $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php new file mode 100644 index 0000000..dfa846a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php @@ -0,0 +1,139 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * AnnotationRegistry + */ +final class AnnotationRegistry +{ + /** + * A map of namespaces to use for autoloading purposes based on a PSR-0 convention. + * + * Contains the namespace as key and an array of directories as value. If the value is NULL + * the include path is used for checking for the corresponding file. + * + * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own. + * + * @var array + */ + static private $autoloadNamespaces = array(); + + /** + * A map of autoloader callables. + * + * @var array + */ + static private $loaders = array(); + + static public function reset() + { + self::$autoloadNamespaces = array(); + self::$loaders = array(); + } + + /** + * Register file + * + * @param string $file + */ + static public function registerFile($file) + { + require_once $file; + } + + /** + * Add a namespace with one or many directories to look for files or null for the include path. + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param string $namespace + * @param string|array|null $dirs + */ + static public function registerAutoloadNamespace($namespace, $dirs = null) + { + self::$autoloadNamespaces[$namespace] = $dirs; + } + + /** + * Register multiple namespaces + * + * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm. + * + * @param array $namespaces + */ + static public function registerAutoloadNamespaces(array $namespaces) + { + self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces); + } + + /** + * Register an autoloading callable for annotations, much like spl_autoload_register(). + * + * NOTE: These class loaders HAVE to be silent when a class was not found! + * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class. + * + * @param callable $callable + * + * @throws \InvalidArgumentException + */ + static public function registerLoader($callable) + { + if (!is_callable($callable)) { + throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader()."); + } + self::$loaders[] = $callable; + } + + /** + * Autoload an annotation class silently. + * + * @param string $class + * @return boolean + */ + static public function loadAnnotationClass($class) + { + foreach (self::$autoloadNamespaces AS $namespace => $dirs) { + if (strpos($class, $namespace) === 0) { + $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php"; + if ($dirs === null) { + if ($path = stream_resolve_include_path($file)) { + require $path; + return true; + } + } else { + foreach((array)$dirs AS $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) { + require $dir . DIRECTORY_SEPARATOR . $file; + return true; + } + } + } + } + } + + foreach (self::$loaders AS $loader) { + if (call_user_func($loader, $class) === true) { + return true; + } + } + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php new file mode 100644 index 0000000..e377e3b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/CachedReader.php @@ -0,0 +1,250 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Cache\Cache; + +/** + * A cache aware annotation reader. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +final class CachedReader implements Reader +{ + /** + * @var string + */ + private static $CACHE_SALT = '@[Annot]'; + + /** + * @var Reader + */ + private $delegate; + + /** + * @var Cache + */ + private $cache; + + /** + * @var boolean + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations; + + /** + * Constructor + * + * @param Reader $reader + * @param Cache $cache + * @param bool $debug + */ + public function __construct(Reader $reader, Cache $cache, $debug = false) + { + $this->delegate = $reader; + $this->cache = $cache; + $this->debug = (Boolean) $debug; + } + + /** + * Get annotations for class + * + * @param \ReflectionClass $class + * @return array + */ + public function getClassAnnotations(\ReflectionClass $class) + { + $cacheKey = $class->getName(); + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { + $annots = $this->delegate->getClassAnnotations($class); + $this->saveToCache($cacheKey, $annots); + } + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + /** + * Get selected annotation for class + * + * @param \ReflectionClass $class + * @param string $annotationName + * @return null + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Get annotations for property + * + * @param \ReflectionProperty $property + * @return array + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $cacheKey = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { + $annots = $this->delegate->getPropertyAnnotations($property); + $this->saveToCache($cacheKey, $annots); + } + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + /** + * Get selected annotation for property + * + * @param \ReflectionProperty $property + * @param string $annotationName + * @return null + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Get method annotations + * + * @param \ReflectionMethod $method + * @return array + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $cacheKey = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$cacheKey])) { + return $this->loadedAnnotations[$cacheKey]; + } + + if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) { + $annots = $this->delegate->getMethodAnnotations($method); + $this->saveToCache($cacheKey, $annots); + } + + return $this->loadedAnnotations[$cacheKey] = $annots; + } + + /** + * Get selected method annotation + * + * @param \ReflectionMethod $method + * @param string $annotationName + * @return null + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Clear loaded annotations + */ + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } + + /** + * Fetches a value from the cache. + * + * @param string $rawCacheKey The cache key. + * @param \ReflectionClass $class The related class. + * @return mixed|boolean The cached value or false when the value is not in cache. + */ + private function fetchFromCache($rawCacheKey, \ReflectionClass $class) + { + $cacheKey = $rawCacheKey . self::$CACHE_SALT; + if (($data = $this->cache->fetch($cacheKey)) !== false) { + if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) { + return $data; + } + } + + return false; + } + + /** + * Saves a value to the cache + * + * @param string $rawCacheKey The cache key. + * @param mixed $value The value. + */ + private function saveToCache($rawCacheKey, $value) + { + $cacheKey = $rawCacheKey . self::$CACHE_SALT; + $this->cache->save($cacheKey, $value); + if ($this->debug) { + $this->cache->save('[C]'.$cacheKey, time()); + } + } + + /** + * Check if cache is fresh + * + * @param string $cacheKey + * @param \ReflectionClass $class + * @return bool + */ + private function isCacheFresh($cacheKey, \ReflectionClass $class) + { + if (false === $filename = $class->getFilename()) { + return true; + } + + return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php new file mode 100644 index 0000000..c9a6f7a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocLexer.php @@ -0,0 +1,132 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Lexer; + +/** + * Simple lexer for docblock annotations. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + */ +final class DocLexer extends Lexer +{ + const T_NONE = 1; + const T_INTEGER = 2; + const T_STRING = 3; + const T_FLOAT = 4; + + // All tokens that are also identifiers should be >= 100 + const T_IDENTIFIER = 100; + const T_AT = 101; + const T_CLOSE_CURLY_BRACES = 102; + const T_CLOSE_PARENTHESIS = 103; + const T_COMMA = 104; + const T_EQUALS = 105; + const T_FALSE = 106; + const T_NAMESPACE_SEPARATOR = 107; + const T_OPEN_CURLY_BRACES = 108; + const T_OPEN_PARENTHESIS = 109; + const T_TRUE = 110; + const T_NULL = 111; + const T_COLON = 112; + + protected $noCase = array( + '@' => self::T_AT, + ',' => self::T_COMMA, + '(' => self::T_OPEN_PARENTHESIS, + ')' => self::T_CLOSE_PARENTHESIS, + '{' => self::T_OPEN_CURLY_BRACES, + '}' => self::T_CLOSE_CURLY_BRACES, + '=' => self::T_EQUALS, + ':' => self::T_COLON, + '\\' => self::T_NAMESPACE_SEPARATOR + ); + + protected $withCase = array( + 'true' => self::T_TRUE, + 'false' => self::T_FALSE, + 'null' => self::T_NULL + ); + + /** + * {@inheritdoc} + */ + protected function getCatchablePatterns() + { + return array( + '[a-z_\\\][a-z0-9_\:\\\]*[a-z]{1}', + '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?', + '"(?:[^"]|"")*"', + ); + } + + /** + * {@inheritdoc} + */ + protected function getNonCatchablePatterns() + { + return array('\s+', '\*+', '(.)'); + } + + /** + * {@inheritdoc} + * + * @param string $value + * + * @return int + */ + protected function getType(&$value) + { + $type = self::T_NONE; + + if ($value[0] === '"') { + $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + + return self::T_STRING; + } + + if (isset($this->noCase[$value])) { + return $this->noCase[$value]; + } + + if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) { + return self::T_IDENTIFIER; + } + + $lowerValue = strtolower($value); + + if (isset($this->withCase[$lowerValue])) { + return $this->withCase[$lowerValue]; + } + + // Checking numeric value + if (is_numeric($value)) { + return (strpos($value, '.') !== false || stripos($value, 'e') !== false) + ? self::T_FLOAT : self::T_INTEGER; + } + + return $type; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php new file mode 100644 index 0000000..de31e0b --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/DocParser.php @@ -0,0 +1,988 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Closure; +use ReflectionClass; +use Doctrine\Common\Annotations\Annotation\Target; +use Doctrine\Common\Annotations\Annotation\Attribute; +use Doctrine\Common\Annotations\Annotation\Attributes; + +/** + * A parser for docblock annotations. + * + * It is strongly discouraged to change the default annotation parsing process. + * + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +final class DocParser +{ + /** + * An array of all valid tokens for a class name. + * + * @var array + */ + private static $classIdentifiers = array(DocLexer::T_IDENTIFIER, DocLexer::T_TRUE, DocLexer::T_FALSE, DocLexer::T_NULL); + + /** + * The lexer. + * + * @var \Doctrine\Common\Annotations\DocLexer + */ + private $lexer; + + /** + * Current target context + * + * @var string + */ + private $target; + + /** + * Doc Parser used to collect annotation target + * + * @var \Doctrine\Common\Annotations\DocParser + */ + private static $metadataParser; + + /** + * Flag to control if the current annotation is nested or not. + * + * @var boolean + */ + private $isNestedAnnotation = false; + + /** + * Hashmap containing all use-statements that are to be used when parsing + * the given doc block. + * + * @var array + */ + private $imports = array(); + + /** + * This hashmap is used internally to cache results of class_exists() + * look-ups. + * + * @var array + */ + private $classExists = array(); + + /** + * Whether annotations that have not been imported should be ignored. + * + * @var boolean + */ + private $ignoreNotImportedAnnotations = false; + + /** + * An array of default namespaces if operating in simple mode. + * + * @var array + */ + private $namespaces = array(); + + /** + * A list with annotations that are not causing exceptions when not resolved to an annotation class. + * + * The names must be the raw names as used in the class, not the fully qualified + * class names. + * + * @var array + */ + private $ignoredAnnotationNames = array(); + + /** + * @var string + */ + private $context = ''; + + /** + * Hash-map for caching annotation metadata + * @var array + */ + private static $annotationMetadata = array( + 'Doctrine\Common\Annotations\Annotation\Target' => array( + 'is_annotation' => true, + 'has_constructor' => true, + 'properties' => array(), + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'attribute_types' => array( + 'value' => array( + 'required' => false, + 'type' =>'array', + 'array_type'=>'string', + 'value' =>'array' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attribute' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_ANNOTATION', + 'targets' => Target::TARGET_ANNOTATION, + 'default_property' => 'name', + 'properties' => array( + 'name' => 'name', + 'type' => 'type', + 'required' => 'required' + ), + 'attribute_types' => array( + 'value' => array( + 'required' => true, + 'type' =>'string', + 'value' =>'string' + ), + 'type' => array( + 'required' =>true, + 'type' =>'string', + 'value' =>'string' + ), + 'required' => array( + 'required' =>false, + 'type' =>'boolean', + 'value' =>'boolean' + ) + ), + ), + 'Doctrine\Common\Annotations\Annotation\Attributes' => array( + 'is_annotation' => true, + 'has_constructor' => false, + 'targets_literal' => 'ANNOTATION_CLASS', + 'targets' => Target::TARGET_CLASS, + 'default_property' => 'value', + 'properties' => array( + 'value' => 'value' + ), + 'attribute_types' => array( + 'value' => array( + 'type' =>'array', + 'required' =>true, + 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute', + 'value' =>'array' + ) + ), + ), + ); + + /** + * Hash-map for handle types declaration + * + * @var array + */ + private static $typeMap = array( + 'float' => 'double', + 'bool' => 'boolean', + // allow uppercase Boolean in honor of George Boole + 'Boolean' => 'boolean', + 'int' => 'integer', + ); + + /** + * Constructs a new DocParser. + */ + public function __construct() + { + $this->lexer = new DocLexer; + } + + /** + * Sets the annotation names that are ignored during the parsing process. + * + * The names are supposed to be the raw names as used in the class, not the + * fully qualified class names. + * + * @param array $names + */ + public function setIgnoredAnnotationNames(array $names) + { + $this->ignoredAnnotationNames = $names; + } + + /** + * Sets ignore on not-imported annotations + * + * @param $bool + */ + public function setIgnoreNotImportedAnnotations($bool) + { + $this->ignoreNotImportedAnnotations = (Boolean) $bool; + } + + /** + * Sets the default namespaces. + * + * @param array $namespace + * + * @throws \RuntimeException + */ + public function addNamespace($namespace) + { + if ($this->imports) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->namespaces[] = $namespace; + } + + /** + * Sets the imports + * + * @param array $imports + * @throws \RuntimeException + */ + public function setImports(array $imports) + { + if ($this->namespaces) { + throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.'); + } + $this->imports = $imports; + } + + /** + * Sets current target context as bitmask. + * + * @param integer $target + */ + public function setTarget($target) + { + $this->target = $target; + } + + /** + * Parses the given docblock string for annotations. + * + * @param string $input The docblock string to parse. + * @param string $context The parsing context. + * @return array Array of annotations. If no annotations are found, an empty array is returned. + */ + public function parse($input, $context = '') + { + if (false === $pos = strpos($input, '@')) { + return array(); + } + + // also parse whatever character is before the @ + if ($pos > 0) { + $pos -= 1; + } + + $this->context = $context; + $this->lexer->setInput(trim(substr($input, $pos), '* /')); + $this->lexer->moveNext(); + + return $this->Annotations(); + } + + /** + * Attempts to match the given token with the current lookahead token. + * If they match, updates the lookahead token; otherwise raises a syntax error. + * + * @param int $token type of Token. + * @return bool True if tokens match; false otherwise. + */ + private function match($token) + { + if ( ! $this->lexer->isNextToken($token) ) { + $this->syntaxError($this->lexer->getLiteral($token)); + } + + return $this->lexer->moveNext(); + } + + /** + * Attempts to match the current lookahead token with any of the given tokens. + * + * If any of them matches, this method updates the lookahead token; otherwise + * a syntax error is raised. + * + * @param array $tokens + * @return bool + */ + private function matchAny(array $tokens) + { + if ( ! $this->lexer->isNextTokenAny($tokens)) { + $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens))); + } + + return $this->lexer->moveNext(); + } + + /** + * Generates a new syntax error. + * + * @param string $expected Expected string. + * @param array $token Optional token. + * + * @throws AnnotationException + */ + private function syntaxError($expected, $token = null) + { + if ($token === null) { + $token = $this->lexer->lookahead; + } + + $message = "Expected {$expected}, got "; + + if ($this->lexer->lookahead === null) { + $message .= 'end of string'; + } else { + $message .= "'{$token['value']}' at position {$token['position']}"; + } + + if (strlen($this->context)) { + $message .= ' in ' . $this->context; + } + + $message .= '.'; + + throw AnnotationException::syntaxError($message); + } + + /** + * Attempt to check if a class exists or not. This never goes through the PHP autoloading mechanism + * but uses the {@link AnnotationRegistry} to load classes. + * + * @param string $fqcn + * @return boolean + */ + private function classExists($fqcn) + { + if (isset($this->classExists[$fqcn])) { + return $this->classExists[$fqcn]; + } + + // first check if the class already exists, maybe loaded through another AnnotationReader + if (class_exists($fqcn, false)) { + return $this->classExists[$fqcn] = true; + } + + // final check, does this class exist? + return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn); + } + + /** + * Collects parsing metadata for a given annotation class + * + * @param string $name The annotation name + */ + private function collectAnnotationMetadata($name) + { + if (self::$metadataParser == null){ + self::$metadataParser = new self(); + self::$metadataParser->setTarget(Target::TARGET_CLASS); + self::$metadataParser->setIgnoreNotImportedAnnotations(true); + self::$metadataParser->setImports(array( + 'target' => 'Doctrine\Common\Annotations\Annotation\Target', + 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute', + 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes' + )); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php'); + AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php'); + } + + $class = new \ReflectionClass($name); + $docComment = $class->getDocComment(); + + // Sets default values for annotation metadata + $metadata = array( + 'default_property' => null, + 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0, + 'properties' => array(), + 'property_types' => array(), + 'attribute_types' => array(), + 'targets_literal' => null, + 'targets' => Target::TARGET_ALL, + 'is_annotation' => false !== strpos($docComment, '@Annotation'), + ); + + // verify that the class is really meant to be an annotation + if ($metadata['is_annotation']) { + foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) { + if ($annotation instanceof Target) { + $metadata['targets'] = $annotation->targets; + $metadata['targets_literal'] = $annotation->literal; + + } elseif ($annotation instanceof Attributes) { + foreach ($annotation->value as $attrib) { + // handle internal type declaration + $type = isset(self::$typeMap[$attrib->type]) ? self::$typeMap[$attrib->type] : $attrib->type; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has array + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$attrib->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$attrib->name]['type'] = $type; + $metadata['attribute_types'][$attrib->name]['value'] = $attrib->type; + $metadata['attribute_types'][$attrib->name]['required'] = $attrib->required; + } + } + } + } + + // if not has a constructor will inject values into public properties + if (false === $metadata['has_constructor']) { + // collect all public properties + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { + $metadata['properties'][$property->name] = $property->name; + + // checks if the property has @var annotation + if ((false !== $propertyComment = $property->getDocComment()) + && false !== strpos($propertyComment, '@var') + && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches)) { + // literal type declaration + $value = $matches[1]; + + // handle internal type declaration + $type = isset(self::$typeMap[$value]) ? self::$typeMap[$value] : $value; + + // handle the case if the property type is mixed + if ('mixed' !== $type) { + // Checks if the property has @var array annotation + if (false !== $pos = strpos($type, '<')) { + $arrayType = substr($type, $pos+1, -1); + $type = 'array'; + + if (isset(self::$typeMap[$arrayType])) { + $arrayType = self::$typeMap[$arrayType]; + } + + $metadata['attribute_types'][$property->name]['array_type'] = $arrayType; + } + + $metadata['attribute_types'][$property->name]['type'] = $type; + $metadata['attribute_types'][$property->name]['value'] = $value; + $metadata['attribute_types'][$property->name]['required'] = false !== strpos($propertyComment, '@Required'); + } + } + } + + // choose the first property as default property + $metadata['default_property'] = reset($metadata['properties']); + } + } + + self::$annotationMetadata[$name] = $metadata; + } + + /** + * Annotations ::= Annotation {[ "*" ]* [Annotation]}* + * + * @return array + */ + private function Annotations() + { + $annotations = array(); + + while (null !== $this->lexer->lookahead) { + if (DocLexer::T_AT !== $this->lexer->lookahead['type']) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is preceded by non-catchable pattern + if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) { + $this->lexer->moveNext(); + continue; + } + + // make sure the @ is followed by either a namespace separator, or + // an identifier token + if ((null === $peek = $this->lexer->glimpse()) + || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true)) + || $peek['position'] !== $this->lexer->lookahead['position'] + 1) { + $this->lexer->moveNext(); + continue; + } + + $this->isNestedAnnotation = false; + if (false !== $annot = $this->Annotation()) { + $annotations[] = $annot; + } + } + + return $annotations; + } + + /** + * Annotation ::= "@" AnnotationName ["(" [Values] ")"] + * AnnotationName ::= QualifiedName | SimpleName + * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName + * NameSpacePart ::= identifier | null | false | true + * SimpleName ::= identifier | null | false | true + * + * @throws AnnotationException + * @return mixed False if it is not a valid annotation. + */ + private function Annotation() + { + $this->match(DocLexer::T_AT); + + // check if we have an annotation + $name = $this->Identifier(); + + // only process names which are not fully qualified, yet + // fully qualified names must start with a \ + $originalName = $name; + if ('\\' !== $name[0]) { + $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos); + + $found = false; + if ($this->namespaces) { + foreach ($this->namespaces as $namespace) { + if ($this->classExists($namespace.'\\'.$name)) { + $name = $namespace.'\\'.$name; + $found = true; + break; + } + } + } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) { + if (false !== $pos) { + $name = $this->imports[$loweredAlias].substr($name, $pos); + } else { + $name = $this->imports[$loweredAlias]; + } + $found = true; + } elseif (isset($this->imports['__NAMESPACE__']) && $this->classExists($this->imports['__NAMESPACE__'].'\\'.$name)) { + $name = $this->imports['__NAMESPACE__'].'\\'.$name; + $found = true; + } elseif ($this->classExists($name)) { + $found = true; + } + + if (!$found) { + if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context)); + } + } + + if (!$this->classExists($name)) { + throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context)); + } + + // at this point, $name contains the fully qualified class name of the + // annotation, and it is also guaranteed that this class exists, and + // that it is loaded + + + // collects the metadata annotation only if there is not yet + if (!isset(self::$annotationMetadata[$name])) { + $this->collectAnnotationMetadata($name); + } + + // verify that the class is really meant to be an annotation and not just any ordinary class + if (self::$annotationMetadata[$name]['is_annotation'] === false) { + if (isset($this->ignoredAnnotationNames[$originalName])) { + return false; + } + + throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context)); + } + + //if target is nested annotation + $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target; + + // Next will be nested + $this->isNestedAnnotation = true; + + //if annotation does not support current target + if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) { + throw AnnotationException::semanticalError( + sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.', + $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal']) + ); + } + + $values = array(); + if ($this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) { + $this->match(DocLexer::T_OPEN_PARENTHESIS); + + if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) { + $values = $this->Values(); + } + + $this->match(DocLexer::T_CLOSE_PARENTHESIS); + } + + // checks all declared attributes + foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) { + if ($property === self::$annotationMetadata[$name]['default_property'] + && !isset($values[$property]) && isset($values['value'])) { + $property = 'value'; + } + + // handle a not given attribute or null value + if (!isset($values[$property])) { + if ($type['required']) { + throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']); + } + + continue; + } + + if ($type['type'] === 'array') { + // handle the case of a single value + if (!is_array($values[$property])) { + $values[$property] = array($values[$property]); + } + + // checks if the attribute has array type declaration, such as "array" + if (isset($type['array_type'])) { + foreach ($values[$property] as $item) { + if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item); + } + } + } + } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) { + throw AnnotationException::typeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]); + } + } + + // check if the annotation expects values via the constructor, + // or directly injected into public properties + if (self::$annotationMetadata[$name]['has_constructor'] === true) { + return new $name($values); + } + + $instance = new $name(); + foreach ($values as $property => $value) { + if (!isset(self::$annotationMetadata[$name]['properties'][$property])) { + if ('value' !== $property) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties']))); + } + + // handle the case if the property has no annotations + if (!$property = self::$annotationMetadata[$name]['default_property']) { + throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values))); + } + } + + $instance->{$property} = $value; + } + + return $instance; + } + + /** + * Values ::= Array | Value {"," Value}* + * + * @return array + */ + private function Values() + { + $values = array(); + + // Handle the case of a single array as value, i.e. @Foo({....}) + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + $values['value'] = $this->Value(); + return $values; + } + + $values[] = $this->Value(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + $token = $this->lexer->lookahead; + $value = $this->Value(); + + if ( ! is_object($value) && ! is_array($value)) { + $this->syntaxError('Value', $token); + } + + $values[] = $value; + } + + foreach ($values as $k => $value) { + if (is_object($value) && $value instanceof \stdClass) { + $values[$value->name] = $value->value; + } else if ( ! isset($values['value'])){ + $values['value'] = $value; + } else { + if ( ! is_array($values['value'])) { + $values['value'] = array($values['value']); + } + + $values['value'][] = $value; + } + + unset($values[$k]); + } + + return $values; + } + + /** + * Constant ::= integer | string | float | boolean + * + * @throws AnnotationException + * @return mixed + */ + private function Constant() + { + $identifier = $this->Identifier(); + + if (!defined($identifier) && false !== strpos($identifier, '::') && '\\' !== $identifier[0]) { + + list($className, $const) = explode('::', $identifier); + $alias = (false === $pos = strpos($className, '\\'))? $className : substr($className, 0, $pos); + + $found = false; + switch (true) { + case !empty ($this->namespaces): + foreach ($this->namespaces as $ns) { + if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { + $className = $ns.'\\'.$className; + $found = true; + break; + } + } + break; + + case isset($this->imports[$loweredAlias = strtolower($alias)]): + $found = true; + if (false !== $pos) { + $className = $this->imports[$loweredAlias].substr($className, $pos); + } else { + $className = $this->imports[$loweredAlias]; + } + break; + + default: + if(isset($this->imports['__NAMESPACE__'])) { + $ns = $this->imports['__NAMESPACE__']; + if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) { + $className = $ns.'\\'.$className; + $found = true; + } + } + break; + } + + if ($found) { + $identifier = $className . '::' . $const; + } + } + + if (!defined($identifier)) { + throw AnnotationException::semanticalErrorConstants($identifier, $this->context); + } + + return constant($identifier); + } + + /** + * Identifier ::= string + * + * @return string + */ + private function Identifier() + { + // check if we have an annotation + if ($this->lexer->isNextTokenAny(self::$classIdentifiers)) { + $this->lexer->moveNext(); + $className = $this->lexer->token['value']; + } else { + $this->syntaxError('namespace separator or identifier'); + } + + while ($this->lexer->lookahead['position'] === ($this->lexer->token['position'] + strlen($this->lexer->token['value'])) + && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) { + + $this->match(DocLexer::T_NAMESPACE_SEPARATOR); + $this->matchAny(self::$classIdentifiers); + $className .= '\\' . $this->lexer->token['value']; + } + + return $className; + } + + /** + * Value ::= PlainValue | FieldAssignment + * + * @return mixed + */ + private function Value() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type']) { + return $this->FieldAssignment(); + } + + return $this->PlainValue(); + } + + /** + * PlainValue ::= integer | string | float | boolean | Array | Annotation + * + * @return mixed + */ + private function PlainValue() + { + if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) { + return $this->Arrayx(); + } + + if ($this->lexer->isNextToken(DocLexer::T_AT)) { + return $this->Annotation(); + } + + if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { + return $this->Constant(); + } + + switch ($this->lexer->lookahead['type']) { + case DocLexer::T_STRING: + $this->match(DocLexer::T_STRING); + return $this->lexer->token['value']; + + case DocLexer::T_INTEGER: + $this->match(DocLexer::T_INTEGER); + return (int)$this->lexer->token['value']; + + case DocLexer::T_FLOAT: + $this->match(DocLexer::T_FLOAT); + return (float)$this->lexer->token['value']; + + case DocLexer::T_TRUE: + $this->match(DocLexer::T_TRUE); + return true; + + case DocLexer::T_FALSE: + $this->match(DocLexer::T_FALSE); + return false; + + case DocLexer::T_NULL: + $this->match(DocLexer::T_NULL); + return null; + + default: + $this->syntaxError('PlainValue'); + } + } + + /** + * FieldAssignment ::= FieldName "=" PlainValue + * FieldName ::= identifier + * + * @return array + */ + private function FieldAssignment() + { + $this->match(DocLexer::T_IDENTIFIER); + $fieldName = $this->lexer->token['value']; + + $this->match(DocLexer::T_EQUALS); + + $item = new \stdClass(); + $item->name = $fieldName; + $item->value = $this->PlainValue(); + + return $item; + } + + /** + * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}" + * + * @return array + */ + private function Arrayx() + { + $array = $values = array(); + + $this->match(DocLexer::T_OPEN_CURLY_BRACES); + $values[] = $this->ArrayEntry(); + + while ($this->lexer->isNextToken(DocLexer::T_COMMA)) { + $this->match(DocLexer::T_COMMA); + + // optional trailing comma + if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) { + break; + } + + $values[] = $this->ArrayEntry(); + } + + $this->match(DocLexer::T_CLOSE_CURLY_BRACES); + + foreach ($values as $value) { + list ($key, $val) = $value; + + if ($key !== null) { + $array[$key] = $val; + } else { + $array[] = $val; + } + } + + return $array; + } + + /** + * ArrayEntry ::= Value | KeyValuePair + * KeyValuePair ::= Key ("=" | ":") PlainValue | Constant + * Key ::= string | integer | Constant + * + * @return array + */ + private function ArrayEntry() + { + $peek = $this->lexer->glimpse(); + + if (DocLexer::T_EQUALS === $peek['type'] + || DocLexer::T_COLON === $peek['type']) { + + if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) { + $key = $this->Constant(); + } else { + $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING)); + $key = $this->lexer->token['value']; + } + + $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON)); + + return array($key, $this->PlainValue()); + } + + return array(null, $this->Value()); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php new file mode 100644 index 0000000..3934861 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/FileCacheReader.php @@ -0,0 +1,258 @@ +. + */ + +namespace Doctrine\Common\Annotations; + + +/** + * File cache reader for annotations. + * + * @author Johannes M. Schmitt + * @author Benjamin Eberlei + */ +class FileCacheReader implements Reader +{ + /** + * @var Reader + */ + private $reader; + + /** + * @var string + */ + private $dir; + + /** + * @var bool + */ + private $debug; + + /** + * @var array + */ + private $loadedAnnotations = array(); + + /** + * Constructor + * + * @param Reader $reader + * @param string $cacheDir + * @param bool $debug + * + * @throws \InvalidArgumentException + */ + public function __construct(Reader $reader, $cacheDir, $debug = false) + { + $this->reader = $reader; + if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir)); + } + if (!is_writable($cacheDir)) { + throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $cacheDir)); + } + + $this->dir = rtrim($cacheDir, '\\/'); + $this->debug = $debug; + } + + /** + * Retrieve annotations for class + * + * @param \ReflectionClass $class + * @return array + */ + public function getClassAnnotations(\ReflectionClass $class) + { + $key = $class->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + @unlink($path); + + $annot = $this->reader->getClassAnnotations($class); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + /** + * Get annotations for property + * + * @param \ReflectionProperty $property + * @return array + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $class = $property->getDeclaringClass(); + $key = $class->getName().'$'.$property->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getPropertyAnnotations($property); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + /** + * Retrieve annotations for method + * + * @param \ReflectionMethod $method + * @return array + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + $class = $method->getDeclaringClass(); + $key = $class->getName().'#'.$method->getName(); + + if (isset($this->loadedAnnotations[$key])) { + return $this->loadedAnnotations[$key]; + } + + $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php'; + if (!file_exists($path)) { + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + if ($this->debug + && (false !== $filename = $class->getFilename()) + && filemtime($path) < filemtime($filename)) { + unlink($path); + + $annot = $this->reader->getMethodAnnotations($method); + $this->saveCacheFile($path, $annot); + return $this->loadedAnnotations[$key] = $annot; + } + + return $this->loadedAnnotations[$key] = include $path; + } + + /** + * Save cache file + * + * @param string $path + * @param mixed $data + */ + private function saveCacheFile($path, $data) + { + file_put_contents($path, 'getClassAnnotations($class); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param \ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + $annotations = $this->getMethodAnnotations($method); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param \ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + $annotations = $this->getPropertyAnnotations($property); + + foreach ($annotations as $annotation) { + if ($annotation instanceof $annotationName) { + return $annotation; + } + } + + return null; + } + + /** + * Clear stores annotations + */ + public function clearLoadedAnnotations() + { + $this->loadedAnnotations = array(); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php new file mode 100644 index 0000000..2dfdd4d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/IndexedReader.php @@ -0,0 +1,141 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Reader; + +/** + * Allows the reader to be used in-place of Doctrine's reader. + * + * @author Johannes M. Schmitt + */ +class IndexedReader implements Reader +{ + /** + * @var Reader + */ + private $delegate; + + /** + * Constructor + * + * @param Reader $reader + */ + public function __construct(Reader $reader) + { + $this->delegate = $reader; + } + + /** + * Get Annotations for class + * + * @param \ReflectionClass $class + * @return array + */ + public function getClassAnnotations(\ReflectionClass $class) + { + $annotations = array(); + foreach ($this->delegate->getClassAnnotations($class) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + /** + * Get selected annotation for class + * + * @param \ReflectionClass $class + * @param string $annotation + * @return mixed + */ + public function getClassAnnotation(\ReflectionClass $class, $annotation) + { + return $this->delegate->getClassAnnotation($class, $annotation); + } + + /** + * Get Annotations for method + * + * @param \ReflectionMethod $method + * @return array + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + $annotations = array(); + foreach ($this->delegate->getMethodAnnotations($method) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + /** + * Get selected annotation for method + * + * @param \ReflectionMethod $method + * @param string $annotation + * @return mixed + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotation) + { + return $this->delegate->getMethodAnnotation($method, $annotation); + } + + /** + * Get annotations for property + * + * @param \ReflectionProperty $property + * @return array + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + $annotations = array(); + foreach ($this->delegate->getPropertyAnnotations($property) as $annot) { + $annotations[get_class($annot)] = $annot; + } + + return $annotations; + } + + /** + * Get selected annotation for property + * + * @param \ReflectionProperty $property + * @param string $annotation + * @return mixed + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotation) + { + return $this->delegate->getPropertyAnnotation($property, $annotation); + } + + /** + * Proxy all methods to the delegate. + * + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->delegate, $method), $args); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php new file mode 100644 index 0000000..c09dd51 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/PhpParser.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use SplFileObject; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +final class PhpParser +{ + /** + * Parses a class. + * + * @param \ReflectionClass $class A ReflectionClass object. + * @return array A list with use statements in the form (Alias => FQN). + */ + public function parseClass(\ReflectionClass $class) + { + if (method_exists($class, 'getUseStatements')) { + return $class->getUseStatements(); + } + + if (false === $filename = $class->getFilename()) { + return array(); + } + + $content = $this->getFileContent($filename, $class->getStartLine()); + $namespace = str_replace('\\', '\\\\', $class->getNamespaceName()); + $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content); + $tokenizer = new TokenParser('parseUseStatements($class->getNamespaceName()); + + return $statements; + } + + /** + * Get the content of the file right up to the given line number. + * + * @param string $filename The name of the file to load. + * @param int $lineNumber The number of lines to read from file. + * @return string The content of the file. + */ + private function getFileContent($filename, $lineNumber) + { + $content = ''; + $lineCnt = 0; + $file = new SplFileObject($filename); + while (!$file->eof()) { + if ($lineCnt++ == $lineNumber) { + break; + } + + $content .= $file->fgets(); + } + + return $content; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php new file mode 100644 index 0000000..6a01cb4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/Reader.php @@ -0,0 +1,67 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Interface for annotation readers. + * + * @author Johannes M. Schmitt + */ +interface Reader +{ + /** + * @param \ReflectionClass $class + * @return mixed + */ + function getClassAnnotations(\ReflectionClass $class); + + /** + * @param \ReflectionClass $class + * @param string $annotationName + * @return mixed + */ + function getClassAnnotation(\ReflectionClass $class, $annotationName); + + /** + * @param \ReflectionMethod $method + * @return mixed + */ + function getMethodAnnotations(\ReflectionMethod $method); + + /** + * @param \ReflectionMethod $method + * @param string $annotationName + * @return mixed + */ + function getMethodAnnotation(\ReflectionMethod $method, $annotationName); + + /** + * @param \ReflectionProperty $property + * @return mixed + */ + function getPropertyAnnotations(\ReflectionProperty $property); + + /** + * @param \ReflectionProperty $property + * @param string $annotationName + * @return mixed + */ + function getPropertyAnnotation(\ReflectionProperty $property, $annotationName); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php new file mode 100644 index 0000000..4210d90 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php @@ -0,0 +1,157 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +use Doctrine\Common\Annotations\Annotation\Target; + +/** + * Simple Annotation Reader. + * + * This annotation reader is intended to be used in projects where you have + * full-control over all annotations that are available. + * + * @since 2.2 + * @author Johannes M. Schmitt + * @author Fabio B. Silva + */ +class SimpleAnnotationReader implements Reader +{ + /** + * @var DocParser + */ + private $parser; + + /** + * Constructor. + * + * Initializes a new SimpleAnnotationReader. + */ + public function __construct() + { + $this->parser = new DocParser(); + $this->parser->setIgnoreNotImportedAnnotations(true); + } + + /** + * Adds a namespace in which we will look for annotations. + * + * @param string $namespace + */ + public function addNamespace($namespace) + { + $this->parser->addNamespace($namespace); + } + + /** + * Gets the annotations applied to a class. + * + * @param \ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * + * @return array An array of Annotations. + */ + public function getClassAnnotations(\ReflectionClass $class) + { + return $this->parser->parse($class->getDocComment(), 'class '.$class->getName()); + } + + /** + * Gets the annotations applied to a method. + * + * @param \ReflectionMethod $method The ReflectionMethod of the method from which + * the annotations should be read. + * + * @return array An array of Annotations. + */ + public function getMethodAnnotations(\ReflectionMethod $method) + { + return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()'); + } + + /** + * Gets the annotations applied to a property. + * + * @param \ReflectionProperty $property The ReflectionProperty of the property + * from which the annotations should be read. + * + * @return array An array of Annotations. + */ + public function getPropertyAnnotations(\ReflectionProperty $property) + { + return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName()); + } + + /** + * Gets a class annotation. + * + * @param \ReflectionClass $class The ReflectionClass of the class from which + * the class annotations should be read. + * @param string $annotationName The name of the annotation. + * + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getClassAnnotation(\ReflectionClass $class, $annotationName) + { + foreach ($this->getClassAnnotations($class) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a method annotation. + * + * @param \ReflectionMethod $method + * @param string $annotationName The name of the annotation. + * + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getMethodAnnotation(\ReflectionMethod $method, $annotationName) + { + foreach ($this->getMethodAnnotations($method) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } + + /** + * Gets a property annotation. + * + * @param \ReflectionProperty $property + * @param string $annotationName The name of the annotation. + * @return mixed The Annotation or NULL, if the requested annotation does not exist. + */ + public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName) + { + foreach ($this->getPropertyAnnotations($property) as $annot) { + if ($annot instanceof $annotationName) { + return $annot; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Annotations/TokenParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/TokenParser.php new file mode 100644 index 0000000..a1ef115 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Annotations/TokenParser.php @@ -0,0 +1,175 @@ +. + */ + +namespace Doctrine\Common\Annotations; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Fabien Potencier + * @author Christian Kaps + */ +class TokenParser +{ + /** + * The token list. + * + * @var array + */ + private $tokens; + + /** + * The number of tokens. + * + * @var int + */ + private $numTokens = 0; + + /** + * The current array pointer. + * + * @var int + */ + private $pointer = 0; + + public function __construct($contents) + { + $this->tokens = token_get_all($contents); + $this->numTokens = count($this->tokens); + $this->pointer = 0; + } + + /** + * Gets the next non whitespace and non comment token. + * + * @param $docCommentIsComment + * If TRUE then a doc comment is considered a comment and skipped. + * If FALSE then only whitespace and normal comments are skipped. + * + * @return array The token if exists, null otherwise. + */ + public function next($docCommentIsComment = TRUE) + { + for ($i = $this->pointer; $i < $this->numTokens; $i++) { + $this->pointer++; + if ($this->tokens[$i][0] === T_WHITESPACE || + $this->tokens[$i][0] === T_COMMENT || + ($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT)) { + + continue; + } + + return $this->tokens[$i]; + } + + return null; + } + + /** + * Parse a single use statement. + * + * @return array A list with all found class names for a use statement. + */ + public function parseUseStatement() + { + $class = ''; + $alias = ''; + $statements = array(); + $explicitAlias = false; + while (($token = $this->next())) { + $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR; + if (!$explicitAlias && $isNameToken) { + $class .= $token[1]; + $alias = $token[1]; + } else if ($explicitAlias && $isNameToken) { + $alias .= $token[1]; + } else if ($token[0] === T_AS) { + $explicitAlias = true; + $alias = ''; + } else if ($token === ',') { + $statements[strtolower($alias)] = $class; + $class = ''; + $alias = ''; + $explicitAlias = false; + } else if ($token === ';') { + $statements[strtolower($alias)] = $class; + break; + } else { + break; + } + } + + return $statements; + } + + /** + * Get all use statements. + * + * @param string $namespaceName The namespace name of the reflected class. + * @return array A list with all found use statements. + */ + public function parseUseStatements($namespaceName) + { + $statements = array(); + while (($token = $this->next())) { + if ($token[0] === T_USE) { + $statements = array_merge($statements, $this->parseUseStatement()); + continue; + } + if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) { + continue; + } + + // Get fresh array for new namespace. This is to prevent the parser to collect the use statements + // for a previous namespace with the same name. This is the case if a namespace is defined twice + // or if a namespace with the same name is commented out. + $statements = array(); + } + + return $statements; + } + + /** + * Get the namespace. + * + * @return string The found namespace. + */ + public function parseNamespace() + { + $name = ''; + while (($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) { + $name .= $token[1]; + } + + return $name; + } + + /** + * Get the class name. + * + * @return string The foundclass name. + */ + public function parseClass() + { + // Namespaces and class names are tokenized the same: T_STRINGs + // separated by T_NS_SEPARATOR so we can use one function to provide + // both. + return $this->parseNamespace(); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php new file mode 100644 index 0000000..2d0cd23 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php @@ -0,0 +1,93 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * APC cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ApcCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return apc_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return apc_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) apc_store($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return apc_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return apc_clear_cache() && apc_clear_cache('user'); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = apc_cache_info(); + $sma = apc_sma_info(); + + return array( + Cache::STATS_HITS => $info['num_hits'], + Cache::STATS_MISSES => $info['num_misses'], + Cache::STATS_UPTIME => $info['start_time'], + Cache::STATS_MEMORY_USAGE => $info['mem_size'], + Cache::STATS_MEMORY_AVAILIABLE => $sma['avail_mem'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php new file mode 100644 index 0000000..a7a70aa --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ArrayCache.php @@ -0,0 +1,96 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Array cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class ArrayCache extends CacheProvider +{ + /** + * @var array $data + */ + private $data = array(); + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return (isset($this->data[$id])) ? $this->data[$id] : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return isset($this->data[$id]); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $this->data[$id] = $data; + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + unset($this->data[$id]); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->data = array(); + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php new file mode 100644 index 0000000..5493562 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/Cache.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Interface for cache drivers. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +interface Cache +{ + const STATS_HITS = 'hits'; + const STATS_MISSES = 'misses'; + const STATS_UPTIME = 'uptime'; + const STATS_MEMORY_USAGE = 'memory_usage'; + const STATS_MEMORY_AVAILIABLE = 'memory_available'; + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return mixed The cached data or FALSE, if no cache entry exists for the given id. + */ + function fetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + function contains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param mixed $data The cache entry/data. + * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + function save($id, $data, $lifeTime = 0); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + function delete($id); + + /** + * Retrieves cached information from data store + * + * The server's statistics array has the following values: + * + * - hits + * Number of keys that have been requested and found present. + * + * - misses + * Number of items that have been requested and not found. + * + * - uptime + * Time that the server is running. + * + * - memory_usage + * Memory used by this server to store items. + * + * - memory_available + * Memory allowed to use for storage. + * + * @since 2.2 + * @var array Associative array with server's statistics if available, NULL otherwise. + */ + function getStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php new file mode 100644 index 0000000..4221a62 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php @@ -0,0 +1,231 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base class for cache provider implementations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Fabio B. Silva + */ +abstract class CacheProvider implements Cache +{ + const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; + + /** + * @var string The namespace to prefix all cache ids with + */ + private $namespace = ''; + + /** + * @var string The namespace version + */ + private $namespaceVersion; + + /** + * Set the namespace to prefix all cache ids with. + * + * @param string $namespace + * @return void + */ + public function setNamespace($namespace) + { + $this->namespace = (string) $namespace; + } + + /** + * Retrieve the namespace that prefixes all cache ids. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * {@inheritdoc} + */ + public function fetch($id) + { + return $this->doFetch($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function contains($id) + { + return $this->doContains($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function save($id, $data, $lifeTime = 0) + { + return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + public function delete($id) + { + return $this->doDelete($this->getNamespacedId($id)); + } + + /** + * {@inheritdoc} + */ + public function getStats() + { + return $this->doGetStats(); + } + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. + */ + public function flushAll() + { + return $this->doFlush(); + } + + /** + * Delete all cache entries. + * + * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. + */ + public function deleteAll() + { + $namespaceCacheKey = $this->getNamespaceCacheKey(); + $namespaceVersion = $this->getNamespaceVersion() + 1; + + $this->namespaceVersion = $namespaceVersion; + + return $this->doSave($namespaceCacheKey, $namespaceVersion); + } + + /** + * Prefix the passed id with the configured namespace value + * + * @param string $id The id to namespace + * @return string $id The namespaced id + */ + private function getNamespacedId($id) + { + $namespaceVersion = $this->getNamespaceVersion(); + + return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); + } + + /** + * Namespace cache key + * + * @return string $namespaceCacheKey + */ + private function getNamespaceCacheKey() + { + return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); + } + + /** + * Namespace version + * + * @return string $namespaceVersion + */ + private function getNamespaceVersion() + { + if (null !== $this->namespaceVersion) { + return $this->namespaceVersion; + } + + $namespaceCacheKey = $this->getNamespaceCacheKey(); + $namespaceVersion = $this->doFetch($namespaceCacheKey); + + if (false === $namespaceVersion) { + $namespaceVersion = 1; + + $this->doSave($namespaceCacheKey, $namespaceVersion); + } + + $this->namespaceVersion = $namespaceVersion; + + return $this->namespaceVersion; + } + + /** + * Fetches an entry from the cache. + * + * @param string $id cache id The id of the cache entry to fetch. + * @return string The cached data or FALSE, if no cache entry exists for the given id. + */ + abstract protected function doFetch($id); + + /** + * Test if an entry exists in the cache. + * + * @param string $id cache id The cache id of the entry to check for. + * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. + */ + abstract protected function doContains($id); + + /** + * Puts data into the cache. + * + * @param string $id The cache id. + * @param string $data The cache entry/data. + * @param bool|int $lifeTime The lifetime. If != false, sets a specific lifetime for this + * cache entry (null => infinite lifeTime). + * + * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. + */ + abstract protected function doSave($id, $data, $lifeTime = false); + + /** + * Deletes a cache entry. + * + * @param string $id cache id + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doDelete($id); + + /** + * Deletes all cache entries. + * + * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. + */ + abstract protected function doFlush(); + + /** + * Retrieves cached information from data store + * + * @since 2.2 + * @return array An associative array with server's statistics if available, NULL otherwise. + */ + abstract protected function doGetStats(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/FileCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/FileCache.php new file mode 100644 index 0000000..da650b4 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/FileCache.php @@ -0,0 +1,132 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Base file cache driver. + * + * @since 2.3 + * @author Fabio B. Silva + */ +abstract class FileCache extends CacheProvider +{ + /** + * @var string Cache directory. + */ + protected $directory; + + /** + * @var string Cache file extension. + */ + protected $extension; + + /** + * Constructor + * + * @param string $directory Cache directory. + * @param string $directory Cache file extension. + * + * @throws \InvalidArgumentException + */ + public function __construct($directory, $extension = null) + { + if ( ! is_dir($directory) && ! @mkdir($directory, 0777, true)) { + throw new \InvalidArgumentException(sprintf( + 'The directory "%s" does not exist and could not be created.', + $directory + )); + } + + if ( ! is_writable($directory)) { + throw new \InvalidArgumentException(sprintf( + 'The directory "%s" is not writable.', + $directory + )); + } + + $this->directory = realpath($directory); + $this->extension = $extension ?: $this->extension; + } + + /** + * Gets the cache directory. + * + * @return string + */ + public function getDirectory() + { + return $this->directory; + } + + /** + * Gets the cache file extension. + * + * @return string + */ + public function getExtension() + { + return $this->extension; + } + + /** + * @return string + */ + protected function getFilename($id) + { + $path = implode(str_split(md5($id), 12), DIRECTORY_SEPARATOR); + $path = $this->directory . DIRECTORY_SEPARATOR . $path; + + return $path . DIRECTORY_SEPARATOR . $id . $this->extension; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return @unlink($this->getFilename($id)); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $pattern = '/^.+\\' . $this->extension . '$/i'; + $iterator = new \RecursiveDirectoryIterator($this->directory); + $iterator = new \RecursiveIteratorIterator($iterator); + $iterator = new \RegexIterator($iterator, $pattern); + + foreach ($iterator as $name => $file) { + @unlink($name); + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/FilesystemCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/FilesystemCache.php new file mode 100644 index 0000000..a27a717 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/FilesystemCache.php @@ -0,0 +1,114 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Filesystem cache driver. + * + * @since 2.3 + * @author Fabio B. Silva + */ +class FilesystemCache extends FileCache +{ + const EXTENSION = '.doctrinecache.data'; + + /** + * {@inheritdoc} + */ + protected $extension = self::EXTENSION; + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $data = ''; + $lifetime = -1; + $filename = $this->getFilename($id); + + if ( ! file_exists($filename)) { + return false; + } + + $resource = fopen($filename, "r"); + + if (false !== ($line = fgets($resource))) { + $lifetime = (integer) $line; + } + + if ($lifetime !== 0 && $lifetime < time()) { + fclose($resource); + + return false; + } + + while (false !== ($line = fgets($resource))) { + $data .= $line; + } + + fclose($resource); + + return unserialize($data); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $lifetime = -1; + $filename = $this->getFilename($id); + + if ( ! file_exists($filename)) { + return false; + } + + $resource = fopen($filename, "r"); + + if (false !== ($line = fgets($resource))) { + $lifetime = (integer) $line; + } + + fclose($resource); + + return $lifetime === 0 || $lifetime > time(); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 0) { + $lifeTime = time() + $lifeTime; + } + + $data = serialize($data); + $filename = $this->getFilename($id); + $filepath = pathinfo($filename, PATHINFO_DIRNAME); + + if ( ! is_dir($filepath)) { + mkdir($filepath, 0777, true); + } + + return file_put_contents($filename, $lifeTime . PHP_EOL . $data); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php new file mode 100644 index 0000000..5687b96 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcacheCache.php @@ -0,0 +1,121 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcache; + +/** + * Memcache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcacheCache extends CacheProvider +{ + /** + * @var Memcache + */ + private $memcache; + + /** + * Sets the memcache instance to use. + * + * @param Memcache $memcache + */ + public function setMemcache(Memcache $memcache) + { + $this->memcache = $memcache; + } + + /** + * Gets the memcache instance used by the cache. + * + * @return Memcache + */ + public function getMemcache() + { + return $this->memcache; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (bool) $this->memcache->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcache->set($id, $data, 0, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcache->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcache->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcache->getStats(); + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php new file mode 100644 index 0000000..75f1345 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/MemcachedCache.php @@ -0,0 +1,124 @@ +. + */ + +namespace Doctrine\Common\Cache; + +use \Memcached; + +/** + * Memcached cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class MemcachedCache extends CacheProvider +{ + /** + * @var Memcached + */ + private $memcached; + + /** + * Sets the memcache instance to use. + * + * @param Memcached $memcached + */ + public function setMemcached(Memcached $memcached) + { + $this->memcached = $memcached; + } + + /** + * Gets the memcached instance used by the cache. + * + * @return Memcached + */ + public function getMemcached() + { + return $this->memcached; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->memcached->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== $this->memcached->get($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 30 * 24 * 3600) { + $lifeTime = time() + $lifeTime; + } + return $this->memcached->set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->memcached->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->memcached->flush(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $stats = $this->memcached->getStats(); + $servers = $this->memcached->getServerList(); + $key = $servers[0]['host'] . ':' . $servers[0]['port']; + $stats = $stats[$key]; + return array( + Cache::STATS_HITS => $stats['get_hits'], + Cache::STATS_MISSES => $stats['get_misses'], + Cache::STATS_UPTIME => $stats['uptime'], + Cache::STATS_MEMORY_USAGE => $stats['bytes'], + Cache::STATS_MEMORY_AVAILIABLE => $stats['limit_maxbytes'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/PhpFileCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/PhpFileCache.php new file mode 100644 index 0000000..0971cd9 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/PhpFileCache.php @@ -0,0 +1,108 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Php file cache driver. + * + * @since 2.3 + * @author Fabio B. Silva + */ +class PhpFileCache extends FileCache +{ + const EXTENSION = '.doctrinecache.php'; + + /** + * {@inheritdoc} + */ + protected $extension = self::EXTENSION; + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + $filename = $this->getFilename($id); + + if ( ! file_exists($filename)) { + return false; + } + + $value = include $filename; + + if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) { + return false; + } + + return $value['data']; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + $filename = $this->getFilename($id); + + if ( ! file_exists($filename)) { + return false; + } + + $value = include $filename; + + return $value['lifetime'] === 0 || $value['lifetime'] > time(); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + if ($lifeTime > 0) { + $lifeTime = time() + $lifeTime; + } + + if (is_object($data) && ! method_exists($data, '__set_state')) { + throw new \InvalidArgumentException( + "Invalid argument given, PhpFileCache only allows objects that implement __set_state() " . + "and fully support var_export(). You can use the FilesystemCache to save arbitrary object " . + "graphs using serialize()/deserialize()." + ); + } + + $filename = $this->getFilename($id); + $filepath = pathinfo($filename, PATHINFO_DIRNAME); + + if ( ! is_dir($filepath)) { + mkdir($filepath, 0777, true); + } + + $value = array( + 'lifetime' => $lifeTime, + 'data' => $data + ); + + $value = var_export($value, true); + $code = sprintf('. + */ + +namespace Doctrine\Common\Cache; + +use Redis; + +/** + * Redis cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Osman Ungur + */ +class RedisCache extends CacheProvider +{ + /** + * @var Redis + */ + private $redis; + + /** + * Sets the redis instance to use. + * + * @param Redis $redis + */ + public function setRedis(Redis $redis) + { + $redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY); + $this->redis = $redis; + } + + /** + * Gets the redis instance used by the cache. + * + * @return Redis + */ + public function getRedis() + { + return $this->redis; + } + + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->redis->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return $this->redis->exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + $result = $this->redis->set($id, $data); + if ($lifeTime > 0) { + $this->redis->expire($id, $lifeTime); + } + return $result; + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return $this->redis->delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return $this->redis->flushDB(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = $this->redis->info(); + return array( + Cache::STATS_HITS => false, + Cache::STATS_MISSES => false, + Cache::STATS_UPTIME => $info['uptime_in_seconds'], + Cache::STATS_MEMORY_USAGE => $info['used_memory'], + Cache::STATS_MEMORY_AVAILIABLE => false + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php new file mode 100644 index 0000000..777d0fd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/WinCacheCache.php @@ -0,0 +1,93 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * WinCache cache provider. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class WinCacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return wincache_ucache_get($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return wincache_ucache_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return wincache_ucache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $info = wincache_ucache_info(); + $meminfo = wincache_ucache_meminfo(); + + return array( + Cache::STATS_HITS => $info['total_hit_count'], + Cache::STATS_MISSES => $info['total_miss_count'], + Cache::STATS_UPTIME => $info['total_cache_uptime'], + Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], + Cache::STATS_MEMORY_AVAILIABLE => $meminfo['memory_free'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php new file mode 100644 index 0000000..8733e26 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/XcacheCache.php @@ -0,0 +1,110 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Xcache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author David Abdemoulaie + */ +class XcacheCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return $this->doContains($id) ? unserialize(xcache_get($id)) : false; + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return xcache_isset($id); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return xcache_set($id, serialize($data), (int) $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return xcache_unset($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $this->checkAuthorization(); + + xcache_clear_cache(XC_TYPE_VAR, 0); + + return true; + } + + /** + * Checks that xcache.admin.enable_auth is Off + * + * @throws \BadMethodCallException When xcache.admin.enable_auth is On + * @return void + */ + protected function checkAuthorization() + { + if (ini_get('xcache.admin.enable_auth')) { + throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); + } + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + $this->checkAuthorization(); + + $info = xcache_info(XC_TYPE_VAR, 0); + return array( + Cache::STATS_HITS => $info['hits'], + Cache::STATS_MISSES => $info['misses'], + Cache::STATS_UPTIME => null, + Cache::STATS_MEMORY_USAGE => $info['size'], + Cache::STATS_MEMORY_AVAILIABLE => $info['avail'], + ); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php new file mode 100644 index 0000000..fc90bc6 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Cache/ZendDataCache.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Cache; + +/** + * Zend Data Cache cache driver. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Ralph Schindler + * @author Guilherme Blanco + */ +class ZendDataCache extends CacheProvider +{ + /** + * {@inheritdoc} + */ + protected function doFetch($id) + { + return zend_shm_cache_fetch($id); + } + + /** + * {@inheritdoc} + */ + protected function doContains($id) + { + return (false !== zend_shm_cache_fetch($id)); + } + + /** + * {@inheritdoc} + */ + protected function doSave($id, $data, $lifeTime = 0) + { + return zend_shm_cache_store($id, $data, $lifeTime); + } + + /** + * {@inheritdoc} + */ + protected function doDelete($id) + { + return zend_shm_cache_delete($id); + } + + /** + * {@inheritdoc} + */ + protected function doFlush() + { + $namespace = $this->getNamespace(); + if (empty($namespace)) { + return zend_shm_cache_clear(); + } + return zend_shm_cache_clear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doGetStats() + { + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php new file mode 100644 index 0000000..45024e1 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php @@ -0,0 +1,263 @@ +. + */ + +namespace Doctrine\Common; + +/** + * A ClassLoader is an autoloader for class files that can be + * installed on the SPL autoload stack. It is a class loader that either loads only classes + * of a specific namespace or all namespaces and it is suitable for working together + * with other autoloaders in the SPL autoload stack. + * + * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader + * relies on the PHP include_path. + * + * @author Roman Borschel + * @since 2.0 + */ +class ClassLoader +{ + /** + * @var string PHP file extension + */ + protected $fileExtension = '.php'; + + /** + * @var string Current namespace + */ + protected $namespace; + + /** + * @var string Current include path + */ + protected $includePath; + + /** + * @var string PHP namespace separator + */ + protected $namespaceSeparator = '\\'; + + /** + * Creates a new ClassLoader that loads classes of the + * specified namespace from the specified include path. + * + * If no include path is given, the ClassLoader relies on the PHP include_path. + * If neither a namespace nor an include path is given, the ClassLoader will + * be responsible for loading all classes, thereby relying on the PHP include_path. + * + * @param string $ns The namespace of the classes to load. + * @param string $includePath The base include path to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->namespace = $ns; + $this->includePath = $includePath; + } + + /** + * Sets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->namespaceSeparator = $sep; + } + + /** + * Gets the namespace separator used by classes in the namespace of this ClassLoader. + * + * @return string + */ + public function getNamespaceSeparator() + { + return $this->namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this ClassLoader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getIncludePath() + { + return $this->includePath; + } + + /** + * Sets the file extension of class files in the namespace of this ClassLoader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this ClassLoader. + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Registers this ClassLoader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Removes this ClassLoader from the SPL autoload stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $className The name of the class to load. + + * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise. + */ + public function loadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '') + . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) + . $this->fileExtension; + + return true; + } + + /** + * Asks this ClassLoader whether it can potentially load the class (file) with + * the given name. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise. + */ + public function canLoadClass($className) + { + if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) { + return false; + } + + $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension; + + if ($this->includePath !== null) { + return file_exists($this->includePath . DIRECTORY_SEPARATOR . $file); + } + + return (false !== stream_resolve_include_path($file)); + } + + /** + * Checks whether a class with a given name exists. A class "exists" if it is either + * already defined in the current request or if there is an autoloader on the SPL + * autoload stack that is a) responsible for the class in question and b) is able to + * load a class file in which the class definition resides. + * + * If the class is not already defined, each autoloader in the SPL autoload stack + * is asked whether it is able to tell if the class exists. If the autoloader is + * a ClassLoader, {@link canLoadClass} is used, otherwise the autoload + * function of the autoloader is invoked and expected to return a value that + * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports + * that the class exists, TRUE is returned. + * + * Note that, depending on what kinds of autoloaders are installed on the SPL + * autoload stack, the class (file) might already be loaded as a result of checking + * for its existence. This is not the case with a ClassLoader, who separates + * these responsibilities. + * + * @param string $className The fully-qualified name of the class. + * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise. + */ + public static function classExists($className) + { + if (class_exists($className, false) || interface_exists($className, false)) { + return true; + } + + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader)) { // array(???, ???) + if (is_object($loader[0])) { + if ($loader[0] instanceof ClassLoader) { // array($obj, 'methodName') + if ($loader[0]->canLoadClass($className)) { + return true; + } + } else if ($loader[0]->{$loader[1]}($className)) { + return true; + } + } else if ($loader[0]::$loader[1]($className)) { // array('ClassName', 'methodName') + return true; + } + } else if ($loader instanceof \Closure) { // function($className) {..} + if ($loader($className)) { + return true; + } + } else if (is_string($loader) && $loader($className)) { // "MyClass::loadClass" + return true; + } + } + + return class_exists($className, false) || interface_exists($className, false); + } + + /** + * Gets the ClassLoader from the SPL autoload stack that is responsible + * for (and is able to load) the class with the given name. + * + * @param string $className The name of the class. + * @return ClassLoader The ClassLoader for the class or NULL if no such ClassLoader exists. + */ + public static function getClassLoader($className) + { + foreach (spl_autoload_functions() as $loader) { + if (is_array($loader) + && $loader[0] instanceof ClassLoader + && $loader[0]->canLoadClass($className) + ) { + return $loader[0]; + } + } + + return null; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php new file mode 100644 index 0000000..7c2b13e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php @@ -0,0 +1,500 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, ArrayIterator; +use Doctrine\Common\Collections\Expr\Expression; +use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor; + +/** + * An ArrayCollection is a Collection implementation that wraps a regular PHP array. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class ArrayCollection implements Collection, Selectable +{ + /** + * An array containing the entries of this collection. + * + * @var array + */ + private $_elements; + + /** + * Initializes a new ArrayCollection. + * + * @param array $elements + */ + public function __construct(array $elements = array()) + { + $this->_elements = $elements; + } + + /** + * Gets the PHP array representation of this collection. + * + * @return array The PHP array representation of this collection. + */ + public function toArray() + { + return $this->_elements; + } + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + public function first() + { + return reset($this->_elements); + } + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + public function last() + { + return end($this->_elements); + } + + /** + * Gets the current key/index at the current internal iterator position. + * + * @return mixed + */ + public function key() + { + return key($this->_elements); + } + + /** + * Moves the internal iterator position to the next element. + * + * @return mixed + */ + public function next() + { + return next($this->_elements); + } + + /** + * Gets the element of the collection at the current internal iterator position. + * + * @return mixed + */ + public function current() + { + return current($this->_elements); + } + + /** + * Removes an element with a specific key/index from the collection. + * + * @param mixed $key + * @return mixed The removed element or NULL, if no element exists for the given key. + */ + public function remove($key) + { + if (isset($this->_elements[$key])) { + $removed = $this->_elements[$key]; + unset($this->_elements[$key]); + + return $removed; + } + + return null; + } + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + public function removeElement($element) + { + $key = array_search($element, $this->_elements, true); + + if ($key !== false) { + unset($this->_elements[$key]); + + return true; + } + + return false; + } + + /** + * ArrayAccess implementation of offsetExists() + * + * @see containsKey() + * + * @param mixed $offset + * @return bool + */ + public function offsetExists($offset) + { + return $this->containsKey($offset); + } + + /** + * ArrayAccess implementation of offsetGet() + * + * @see get() + * + * @param mixed $offset + * @return mixed + */ + public function offsetGet($offset) + { + return $this->get($offset); + } + + /** + * ArrayAccess implementation of offsetSet() + * + * @see add() + * @see set() + * + * @param mixed $offset + * @param mixed $value + * @return bool + */ + public function offsetSet($offset, $value) + { + if ( ! isset($offset)) { + return $this->add($value); + } + return $this->set($offset, $value); + } + + /** + * ArrayAccess implementation of offsetUnset() + * + * @see remove() + * + * @param mixed $offset + * @return mixed + */ + public function offsetUnset($offset) + { + return $this->remove($offset); + } + + /** + * Checks whether the collection contains a specific key/index. + * + * @param mixed $key The key to check for. + * @return boolean TRUE if the given key/index exists, FALSE otherwise. + */ + public function containsKey($key) + { + return isset($this->_elements[$key]); + } + + /** + * Checks whether the given element is contained in the collection. + * Only element values are compared, not keys. The comparison of two elements + * is strict, that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element + * @return boolean TRUE if the given element is contained in the collection, + * FALSE otherwise. + */ + public function contains($element) + { + foreach ($this->_elements as $collectionElement) { + if ($element === $collectionElement) { + return true; + } + } + + return false; + } + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + public function exists(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + return true; + } + } + return false; + } + + /** + * Searches for a given element and, if found, returns the corresponding key/index + * of that element. The comparison of two elements is strict, that means not + * only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + public function indexOf($element) + { + return array_search($element, $this->_elements, true); + } + + /** + * Gets the element with the given key/index. + * + * @param mixed $key The key. + * @return mixed The element or NULL, if no element exists for the given key. + */ + public function get($key) + { + if (isset($this->_elements[$key])) { + return $this->_elements[$key]; + } + return null; + } + + /** + * Gets all keys/indexes of the collection elements. + * + * @return array + */ + public function getKeys() + { + return array_keys($this->_elements); + } + + /** + * Gets all elements. + * + * @return array + */ + public function getValues() + { + return array_values($this->_elements); + } + + /** + * Returns the number of elements in the collection. + * + * Implementation of the Countable interface. + * + * @return integer The number of elements in the collection. + */ + public function count() + { + return count($this->_elements); + } + + /** + * Adds/sets an element in the collection at the index / with the specified key. + * + * When the collection is a Map this is like put(key,value)/add(key,value). + * When the collection is a List this is like add(position,value). + * + * @param mixed $key + * @param mixed $value + */ + public function set($key, $value) + { + $this->_elements[$key] = $value; + } + + /** + * Adds an element to the collection. + * + * @param mixed $value + * @return boolean Always TRUE. + */ + public function add($value) + { + $this->_elements[] = $value; + return true; + } + + /** + * Checks whether the collection is empty. + * + * Note: This is preferable over count() == 0. + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + public function isEmpty() + { + return ! $this->_elements; + } + + /** + * Gets an iterator for iterating over the elements in the collection. + * + * @return ArrayIterator + */ + public function getIterator() + { + return new ArrayIterator($this->_elements); + } + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + public function map(Closure $func) + { + return new static(array_map($func, $this->_elements)); + } + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + public function filter(Closure $p) + { + return new static(array_filter($this->_elements, $p)); + } + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + public function forAll(Closure $p) + { + foreach ($this->_elements as $key => $element) { + if ( ! $p($key, $element)) { + return false; + } + } + + return true; + } + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + public function partition(Closure $p) + { + $coll1 = $coll2 = array(); + foreach ($this->_elements as $key => $element) { + if ($p($key, $element)) { + $coll1[$key] = $element; + } else { + $coll2[$key] = $element; + } + } + return array(new static($coll1), new static($coll2)); + } + + /** + * Returns a string representation of this object. + * + * @return string + */ + public function __toString() + { + return __CLASS__ . '@' . spl_object_hash($this); + } + + /** + * Clears the collection. + */ + public function clear() + { + $this->_elements = array(); + } + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + public function slice($offset, $length = null) + { + return array_slice($this->_elements, $offset, $length, true); + } + + /** + * Select all elements from a selectable that match the criteria and + * return a new collection containing these elements. + * + * @param Criteria $criteria + * @return Collection + */ + public function matching(Criteria $criteria) + { + $expr = $criteria->getWhereExpression(); + $filtered = $this->_elements; + + if ($expr) { + $visitor = new ClosureExpressionVisitor(); + $filter = $visitor->dispatch($expr); + $filtered = array_filter($filtered, $filter); + } + + if ($orderings = $criteria->getOrderings()) { + $next = null; + foreach (array_reverse($orderings) as $field => $ordering) { + $next = ClosureExpressionVisitor::sortByField($field, $ordering == 'DESC' ? -1 : 1, $next); + } + + usort($filtered, $next); + } + + $offset = $criteria->getFirstResult(); + $length = $criteria->getMaxResults(); + + if ($offset || $length) { + $filtered = array_slice($filtered, (int)$offset, $length); + } + + return new static($filtered); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php new file mode 100644 index 0000000..51eb9e7 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Collection.php @@ -0,0 +1,243 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Closure, Countable, IteratorAggregate, ArrayAccess; + +/** + * The missing (SPL) Collection/Array/OrderedMap interface. + * + * A Collection resembles the nature of a regular PHP array. That is, + * it is essentially an ordered map that can also be used + * like a list. + * + * A Collection has an internal iterator just like a PHP array. In addition, + * a Collection can be iterated with external iterators, which is preferrable. + * To use an external iterator simply use the foreach language construct to + * iterate over the collection (which calls {@link getIterator()} internally) or + * explicitly retrieve an iterator though {@link getIterator()} which can then be + * used to iterate over the collection. + * You can not rely on the internal iterator of the collection being at a certain + * position unless you explicitly positioned it before. Prefer iteration with + * external iterators. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface Collection extends Countable, IteratorAggregate, ArrayAccess +{ + /** + * Adds an element at the end of the collection. + * + * @param mixed $element The element to add. + * @return boolean Always TRUE. + */ + function add($element); + + /** + * Clears the collection, removing all elements. + */ + function clear(); + + /** + * Checks whether an element is contained in the collection. + * This is an O(n) operation, where n is the size of the collection. + * + * @param mixed $element The element to search for. + * @return boolean TRUE if the collection contains the element, FALSE otherwise. + */ + function contains($element); + + /** + * Checks whether the collection is empty (contains no elements). + * + * @return boolean TRUE if the collection is empty, FALSE otherwise. + */ + function isEmpty(); + + /** + * Removes the element at the specified index from the collection. + * + * @param string|integer $key The kex/index of the element to remove. + * @return mixed The removed element or NULL, if the collection did not contain the element. + */ + function remove($key); + + /** + * Removes the specified element from the collection, if it is found. + * + * @param mixed $element The element to remove. + * @return boolean TRUE if this collection contained the specified element, FALSE otherwise. + */ + function removeElement($element); + + /** + * Checks whether the collection contains an element with the specified key/index. + * + * @param string|integer $key The key/index to check for. + * @return boolean TRUE if the collection contains an element with the specified key/index, + * FALSE otherwise. + */ + function containsKey($key); + + /** + * Gets the element at the specified key/index. + * + * @param string|integer $key The key/index of the element to retrieve. + * @return mixed + */ + function get($key); + + /** + * Gets all keys/indices of the collection. + * + * @return array The keys/indices of the collection, in the order of the corresponding + * elements in the collection. + */ + function getKeys(); + + /** + * Gets all values of the collection. + * + * @return array The values of all elements in the collection, in the order they + * appear in the collection. + */ + function getValues(); + + /** + * Sets an element in the collection at the specified key/index. + * + * @param string|integer $key The key/index of the element to set. + * @param mixed $value The element to set. + */ + function set($key, $value); + + /** + * Gets a native PHP array representation of the collection. + * + * @return array + */ + function toArray(); + + /** + * Sets the internal iterator to the first element in the collection and + * returns this element. + * + * @return mixed + */ + function first(); + + /** + * Sets the internal iterator to the last element in the collection and + * returns this element. + * + * @return mixed + */ + function last(); + + /** + * Gets the key/index of the element at the current iterator position. + * + */ + function key(); + + /** + * Gets the element of the collection at the current iterator position. + * + */ + function current(); + + /** + * Moves the internal iterator position to the next element. + * + */ + function next(); + + /** + * Tests for the existence of an element that satisfies the given predicate. + * + * @param Closure $p The predicate. + * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise. + */ + function exists(Closure $p); + + /** + * Returns all the elements of this collection that satisfy the predicate p. + * The order of the elements is preserved. + * + * @param Closure $p The predicate used for filtering. + * @return Collection A collection with the results of the filter operation. + */ + function filter(Closure $p); + + /** + * Applies the given predicate p to all elements of this collection, + * returning true, if the predicate yields true for all elements. + * + * @param Closure $p The predicate. + * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise. + */ + function forAll(Closure $p); + + /** + * Applies the given function to each element in the collection and returns + * a new collection with the elements returned by the function. + * + * @param Closure $func + * @return Collection + */ + function map(Closure $func); + + /** + * Partitions this collection in two collections according to a predicate. + * Keys are preserved in the resulting collections. + * + * @param Closure $p The predicate on which to partition. + * @return array An array with two elements. The first element contains the collection + * of elements where the predicate returned TRUE, the second element + * contains the collection of elements where the predicate returned FALSE. + */ + function partition(Closure $p); + + /** + * Gets the index/key of a given element. The comparison of two elements is strict, + * that means not only the value but also the type must match. + * For objects this means reference equality. + * + * @param mixed $element The element to search for. + * @return mixed The key/index of the element or FALSE if the element was not found. + */ + function indexOf($element); + + /** + * Extract a slice of $length elements starting at position $offset from the Collection. + * + * If $length is null it returns all elements from $offset to the end of the Collection. + * Keys have to be preserved by this method. Calling this method will only return the + * selected slice and NOT change the elements contained in the collection slice is called on. + * + * @param int $offset + * @param int $length + * @return array + */ + function slice($offset, $length = null); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Criteria.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Criteria.php new file mode 100644 index 0000000..3b05549 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Criteria.php @@ -0,0 +1,240 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Doctrine\Common\Collections\Expr\Expression; +use Doctrine\Common\Collections\Expr\CompositeExpression; + +/** + * Criteria for filtering Selectable collections. + * + * @author Benjamin Eberlei + * @since 2.3 + */ +class Criteria +{ + /** + * @var string + */ + const ASC = 'ASC'; + + /** + * @var string + */ + const DESC = 'DESC'; + + /** + * @var \Doctrine\Common\Collections\ExpressionBuilder + */ + private static $expressionBuilder; + + /** + * @var \Doctrine\Common\Collections\Expr\Expression + */ + private $expression; + + /** + * @var array|null + */ + private $orderings; + + /** + * @var int + */ + private $firstResult; + + /** + * @var int + */ + private $maxResults; + + /** + * Creates an instance of the class. + * + * @return Criteria + */ + public static function create() + { + return new static(); + } + + /** + * Return the expression builder. + * + * @return \Doctrine\Common\Collections\ExpressionBuilder + */ + public static function expr() + { + if (self::$expressionBuilder === null) { + self::$expressionBuilder = new ExpressionBuilder(); + } + return self::$expressionBuilder; + } + + /** + * Construct new criteria + * + * @param Expression $expression + * @param array $orderings + * @param int $firstResult + * @param int $maxResults + */ + public function __construct(Expression $expression = null, array $orderings = null, $firstResult = null, $maxResults = null) + { + $this->expression = $expression; + $this->orderings = $orderings; + $this->firstResult = $firstResult; + $this->maxResults = $maxResults; + } + + /** + * Set the where expression to evaluate when this criteria is searched for. + * + * @param Expression + * @return Criteria + */ + public function where(Expression $expression) + { + $this->expression = $expression; + return $this; + } + + /** + * Append the where expression to evaluate when this criteria is searched for + * using an AND with previous expression. + * + * @param Expression + * @return Criteria + */ + public function andWhere(Expression $expression) + { + if ($this->expression === null) { + return $this->where($expression); + } + + $this->expression = new CompositeExpression(CompositeExpression::TYPE_AND, array( + $this->expression, $expression + )); + + return $this; + } + + /** + * Append the where expression to evaluate when this criteria is searched for + * using an OR with previous expression. + * + * @param Expression + * @return Criteria + */ + public function orWhere(Expression $expression) + { + if ($this->expression === null) { + return $this->where($expression); + } + + $this->expression = new CompositeExpression(CompositeExpression::TYPE_OR, array( + $this->expression, $expression + )); + + return $this; + } + + /** + * Get the expression attached to this criteria. + * + * @return Expression|null + */ + public function getWhereExpression() + { + return $this->expression; + } + + /** + * Get current orderings of this Criteria + * + * @return array + */ + public function getOrderings() + { + return $this->orderings; + } + + /** + * Set the ordering of the result of this criteria. + * + * Keys are field and values are the order, being either ASC or DESC. + * + * @see Criteria::ASC + * @see Criteria::DESC + * + * @param array + * @return Criteria + */ + public function orderBy(array $orderings) + { + $this->orderings = $orderings; + return $this; + } + + /** + * Get current first result option of the critera. + * + * @return firstResult. + */ + public function getFirstResult() + { + return $this->firstResult; + } + + /** + * Set number of first result that this criteria should return. + * + * @param firstResult the value to set. + * @return Criteria + */ + public function setFirstResult($firstResult) + { + $this->firstResult = $firstResult; + return $this; + } + + /** + * Get maxResults. + * + * @return maxResults. + */ + public function getMaxResults() + { + return $this->maxResults; + } + + /** + * Set maxResults. + * + * @param maxResults the value to set. + * @return Criteria + */ + public function setMaxResults($maxResults) + { + $this->maxResults = $maxResults; + return $this; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php new file mode 100644 index 0000000..06ccb04 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php @@ -0,0 +1,195 @@ +. + */ + +namespace Doctrine\Common\Collections\Expr; + +/** + * Walks an expression graph and turns it into a PHP closure. + * + * This closure can be used with {@Collection#filter()} and is used internally + * by {@ArrayCollection#select()}. + * + * @author Benjamin Eberlei + * @since 2.3 + */ +class ClosureExpressionVisitor extends ExpressionVisitor +{ + /** + * Access the field of a given object. This field has to be public directly + * or indirectly (through an accessor get* or a magic method, __get, __call). + * + * is*() is not supported. + * + * @return mixed + */ + static public function getObjectFieldValue($object, $field) + { + $accessor = "get" . $field; + + if (method_exists($object, $accessor) || method_exists($object, '__call')) { + return $object->$accessor(); + } + + if ($object instanceof \ArrayAccess) { + return $object[$field]; + } + + return $object->$field; + } + + /** + * Helper for sorting arrays of objects based on multiple fields + + * orientations. + * + * @param string $name + * @param int $orientation + * @param Closure $next + * @return Closure + */ + static public function sortByField($name, $orientation = 1, \Closure $next = null) + { + if (!$next) { + $next = function() { + return 0; + }; + } + + return function ($a, $b) use ($name, $next, $orientation) { + $aValue = ClosureExpressionVisitor::getObjectFieldValue($a, $name); + $bValue = ClosureExpressionVisitor::getObjectFieldValue($b, $name); + + if ($aValue === $bValue) { + return $next($a, $b); + } + + return (($aValue > $bValue) ? 1 : -1) * $orientation; + }; + } + + /** + * {@inheritDoc} + */ + public function walkComparison(Comparison $comparison) + { + $field = $comparison->getField(); + $value = $comparison->getValue()->getValue(); // shortcut for walkValue() + + switch ($comparison->getOperator()) { + case Comparison::EQ: + case Comparison::IS: + return function ($object) use ($field, $value) { + return ClosureExpressionVisitor::getObjectFieldValue($object, $field) === $value; + }; + + case Comparison::NEQ: + return function ($object) use ($field, $value) { + return ClosureExpressionVisitor::getObjectFieldValue($object, $field) !== $value; + }; + + case Comparison::LT: + return function ($object) use ($field, $value) { + return ClosureExpressionVisitor::getObjectFieldValue($object, $field) < $value; + }; + + case Comparison::LTE: + return function ($object) use ($field, $value) { + return ClosureExpressionVisitor::getObjectFieldValue($object, $field) <= $value; + }; + + case Comparison::GT: + return function ($object) use ($field, $value) { + return ClosureExpressionVisitor::getObjectFieldValue($object, $field) > $value; + }; + + case Comparison::GTE: + return function ($object) use ($field, $value) { + return ClosureExpressionVisitor::getObjectFieldValue($object, $field) >= $value; + }; + + case Comparison::IN: + return function ($object) use ($field, $value) { + return in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); + }; + + case Comparison::NIN: + return function ($object) use ($field, $value) { + return ! in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value); + }; + + default: + throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator()); + } + } + + /** + * {@inheritDoc} + */ + public function walkValue(Value $value) + { + return $value->getValue(); + } + + /** + * {@inheritDoc} + */ + public function walkCompositeExpression(CompositeExpression $expr) + { + $expressionList = array(); + + foreach ($expr->getExpressionList() as $child) { + $expressionList[] = $this->dispatch($child); + } + + switch($expr->getType()) { + case CompositeExpression::TYPE_AND: + return $this->andExpressions($expressionList); + + case CompositeExpression::TYPE_OR: + return $this->orExpressions($expressionList); + + default: + throw new \RuntimeException("Unknown composite " . $expr->getType()); + } + } + + private function andExpressions($expressions) + { + return function ($object) use ($expressions) { + foreach ($expressions as $expression) { + if ( ! $expression($object)) { + return false; + } + } + return true; + }; + } + + private function orExpressions($expressions) + { + return function ($object) use ($expressions) { + foreach ($expressions as $expression) { + if ($expression($object)) { + return true; + } + } + return false; + }; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Comparison.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Comparison.php new file mode 100644 index 0000000..29cfcff --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Comparison.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\Common\Collections\Expr; + +/** + * Comparison of a field with a value by the given operator. + * + * @author Benjamin Eberlei + * @since 2.3 + */ +class Comparison implements Expression +{ + const EQ = '='; + const NEQ = '<>'; + const LT = '<'; + const LTE = '<='; + const GT = '>'; + const GTE = '>='; + const IS = 'IS'; + const IN = 'IN'; + const NIN = 'NIN'; + + private $field; + private $op; + private $value; + + public function __construct($field, $operator, $value) + { + if ( ! ($value instanceof Value)) { + $value = new Value($value); + } + + $this->field = $field; + $this->op = $operator; + $this->value = $value; + } + + public function getField() + { + return $this->field; + } + + public function getValue() + { + return $this->value; + } + + public function getOperator() + { + return $this->op; + } + + public function visit(ExpressionVisitor $visitor) + { + return $visitor->walkComparison($this); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php new file mode 100644 index 0000000..fe917cf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Collections\Expr; + +/** + * Expression of Expressions combined by AND or OR operation. + * + * @author Benjamin Eberlei + * @since 2.3 + */ +class CompositeExpression implements Expression +{ + const TYPE_AND = 'AND'; + const TYPE_OR = 'OR'; + + private $type; + private $expressions = array(); + + public function __construct($type, array $expressions) + { + $this->type = $type; + + foreach ($expressions as $expr) { + if ($expr instanceof Value) { + throw new \RuntimeException("Values are not supported expressions as children of and/or expressions."); + } + if ( ! ($expr instanceof Expression)) { + throw new \RuntimeException("No expression given to CompositeExpression."); + } + + $this->expressions[] = $expr; + } + } + + /** + * Return the list of expressions nested in this composite. + * + * @return Expression[] + */ + public function getExpressionList() + { + return $this->expressions; + } + + public function getType() + { + return $this->type; + } + + public function visit(ExpressionVisitor $visitor) + { + return $visitor->walkCompositeExpression($this); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Expression.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Expression.php new file mode 100644 index 0000000..b0762ad --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Expression.php @@ -0,0 +1,31 @@ +. + */ + +namespace Doctrine\Common\Collections\Expr; + +/** + * Expression for the {@link Selectable} interface. + * + * @author Benjamin Eberlei + */ +interface Expression +{ + public function visit(ExpressionVisitor $visitor); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php new file mode 100644 index 0000000..5e69b98 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php @@ -0,0 +1,81 @@ +. + */ + +namespace Doctrine\Common\Collections\Expr; + +/** + * An Expression visitor walks a graph of expressions and turns them into a + * query for the underlying implementation. + * + * @author Benjamin Eberlei + */ +abstract class ExpressionVisitor +{ + /** + * Convert a comparison expression into the target query language output + * + * @param Comparison $comparison + * + * @return mixed + */ + abstract public function walkComparison(Comparison $comparison); + + /** + * Convert a value expression into the target query language part. + * + * @param Value $value + * + * @return mixed + */ + abstract public function walkValue(Value $value); + + /** + * Convert a composite expression into the target query language output + * + * @param CompositeExpression $expr + * + * @return mixed + */ + abstract public function walkCompositeExpression(CompositeExpression $expr); + + /** + * Dispatch walking an expression to the appropriate handler. + * + * @param Expression + * + * @return mixed + */ + public function dispatch(Expression $expr) + { + switch (true) { + case ($expr instanceof Comparison): + return $this->walkComparison($expr); + + case ($expr instanceof Value): + return $this->walkValue($expr); + + case ($expr instanceof CompositeExpression): + return $this->walkCompositeExpression($expr); + + default: + throw new \RuntimeException("Unknown Expression " . get_class($expr)); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Value.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Value.php new file mode 100644 index 0000000..f0df11a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Expr/Value.php @@ -0,0 +1,41 @@ +. + */ + +namespace Doctrine\Common\Collections\Expr; + +class Value implements Expression +{ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function visit(ExpressionVisitor $visitor) + { + return $visitor->walkValue($this); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/ExpressionBuilder.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ExpressionBuilder.php new file mode 100644 index 0000000..b53f0cd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/ExpressionBuilder.php @@ -0,0 +1,149 @@ +. + */ + +namespace Doctrine\Common\Collections; + +use Doctrine\Common\Collections\Expr\Comparison; +use Doctrine\Common\Collections\Expr\CompositeExpression; +use Doctrine\Common\Collections\Expr\Value; + +/** + * Builder for Expressions in the {@link Selectable} interface. + * + * @author Benjamin Eberlei + * @since 2.3 + */ +class ExpressionBuilder +{ + /** + * @return CompositeExpression + */ + public function andX($x = null) + { + return new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args()); + } + + /** + * @return CompositeExpression + */ + public function orX($x = null) + { + return new CompositeExpression(CompositeExpression::TYPE_OR, func_get_args()); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function eq($field, $value) + { + return new Comparison($field, Comparison::EQ, new Value($value)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function gt($field, $value) + { + return new Comparison($field, Comparison::GT, new Value($value)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function lt($field, $value) + { + return new Comparison($field, Comparison::LT, new Value($value)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function gte($field, $value) + { + return new Comparison($field, Comparison::GTE, new Value($value)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function lte($field, $value) + { + return new Comparison($field, Comparison::LTE, new Value($value)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function neq($field, $value) + { + return new Comparison($field, Comparison::NEQ, new Value($value)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function isNull($field) + { + return new Comparison($field, Comparison::IS, new Value(null)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function in($field, array $values) + { + return new Comparison($field, Comparison::IN, new Value($values)); + } + + /** + * @param string $field + * @param mixed $value + * + * @return Comparison + */ + public function notIn($field, array $values) + { + return new Comparison($field, Comparison::NIN, new Value($values)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Collections/Selectable.php b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Selectable.php new file mode 100644 index 0000000..675d6ea --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Collections/Selectable.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common\Collections; + +/** + * Interface for collections that allow efficient filtering with an expression API. + * + * Goal of this interface is a backend independent method to fetch elements + * from a collections. {@link Expression} is crafted in a way that you can + * implement queries from both in-memory and database-backed collections. + * + * For database backed collections this allows very efficient access by + * utilizing the query APIs, for example SQL in the ORM. Applications using + * this API can implement efficient database access without having to ask the + * EntityManager or Repositories. + * + * @author Benjamin Eberlei + * @since 2.3 + */ +interface Selectable +{ + /** + * Select all elements from a selectable that match the expression and + * return a new collection containing these elements. + * + * @param Criteria $criteria + * @return Collection + */ + function matching(Criteria $criteria); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php new file mode 100644 index 0000000..6db7675 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php @@ -0,0 +1,28 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base exception class for package Doctrine\Common + * @author heinrich + * + */ +class CommonException extends \Exception { +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php new file mode 100644 index 0000000..20d065e --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php @@ -0,0 +1,49 @@ +. + */ + + +namespace Doctrine\Common; + +/** + * Comparable interface that allows to compare two value objects to each other for similarity. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + */ +interface Comparable +{ + /** + * Compare the current object to the passed $other. + * + * Returns 0 if they are semantically equal, 1 if the other object + * is less than the current one, or -1 if its more than the current one. + * + * This method should not check for identity using ===, only for semantical equality for example + * when two different DateTime instances point to the exact same Date + TZ. + * + * @param mixed $other + * + * @return int + */ + public function compareTo($other); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php new file mode 100644 index 0000000..a87eee8 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php @@ -0,0 +1,67 @@ +. + */ + +namespace Doctrine\Common; + +/** + * EventArgs is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass state + * information to an event handler when an event is raised. The single empty EventArgs + * instance can be obtained through {@link getEmptyInstance}. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventArgs +{ + /** + * @var EventArgs Single instance of EventArgs + */ + private static $_emptyEventArgsInstance; + + /** + * Gets the single, empty and immutable EventArgs instance. + * + * This instance will be used when events are dispatched without any parameter, + * like this: EventManager::dispatchEvent('eventname'); + * + * The benefit from this is that only one empty instance is instantiated and shared + * (otherwise there would be instances for every dispatched in the abovementioned form) + * + * @see EventManager::dispatchEvent + * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx + * @return EventArgs + */ + public static function getEmptyInstance() + { + if ( ! self::$_emptyEventArgsInstance) { + self::$_emptyEventArgsInstance = new EventArgs; + } + + return self::$_emptyEventArgsInstance; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php new file mode 100644 index 0000000..25aac44 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php @@ -0,0 +1,147 @@ +. + */ + +namespace Doctrine\Common; + +/** + * The EventManager is the central point of Doctrine's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class EventManager +{ + /** + * Map of registered listeners. + * => + * + * @var array + */ + private $_listeners = array(); + + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of the event is + * the name of the method that is invoked on listeners. + * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners. + * If not supplied, the single empty EventArgs instance is used. + * @return boolean + */ + public function dispatchEvent($eventName, EventArgs $eventArgs = null) + { + if (isset($this->_listeners[$eventName])) { + $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs; + + foreach ($this->_listeners[$eventName] as $listener) { + $listener->$eventName($eventArgs); + } + } + } + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $event The name of the event. + * @return array The event listeners for the specified event, or all event listeners. + */ + public function getListeners($event = null) + { + return $event ? $this->_listeners[$event] : $this->_listeners; + } + + /** + * Checks whether an event has any registered listeners. + * + * @param string $event + * @return boolean TRUE if the specified event has any listeners, FALSE otherwise. + */ + public function hasListeners($event) + { + return isset($this->_listeners[$event]) && $this->_listeners[$event]; + } + + /** + * Adds an event listener that listens on the specified events. + * + * @param string|array $events The event(s) to listen on. + * @param object $listener The listener object. + */ + public function addEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Overrides listener if a previous one was associated already + // Prevents duplicate listeners on same event (same instance only) + $this->_listeners[$event][$hash] = $listener; + } + } + + /** + * Removes an event listener from the specified events. + * + * @param string|array $events + * @param object $listener + */ + public function removeEventListener($events, $listener) + { + // Picks the hash code related to that listener + $hash = spl_object_hash($listener); + + foreach ((array) $events as $event) { + // Check if actually have this listener associated + if (isset($this->_listeners[$event][$hash])) { + unset($this->_listeners[$event][$hash]); + } + } + } + + /** + * Adds an EventSubscriber. The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param \Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function addEventSubscriber(EventSubscriber $subscriber) + { + $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); + } + + /** + * Removes an EventSubscriber. The subscriber is asked for all the events it is + * interested in and removed as a listener for these events. + * + * @param \Doctrine\Common\EventSubscriber $subscriber The subscriber. + */ + public function removeEventSubscriber(EventSubscriber $subscriber) + { + $this->removeEventListener($subscriber->getSubscribedEvents(), $subscriber); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php new file mode 100644 index 0000000..1458791 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventManager, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface EventSubscriber +{ + /** + * Returns an array of events this subscriber wants to listen to. + * + * @return array + */ + function getSubscribedEvents(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php new file mode 100644 index 0000000..8e2554c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php @@ -0,0 +1,266 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Base class for writing simple lexers, i.e. for creating small DSLs. + * + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @todo Rename: AbstractLexer + */ +abstract class Lexer +{ + /** + * @var array Array of scanned tokens + */ + private $tokens = array(); + + /** + * @var integer Current lexer position in input string + */ + private $position = 0; + + /** + * @var integer Current peek of current lexer position + */ + private $peek = 0; + + /** + * @var array The next token in the input. + */ + public $lookahead; + + /** + * @var array The last matched/seen token. + */ + public $token; + + /** + * Sets the input data to be tokenized. + * + * The Lexer is immediately reset and the new input tokenized. + * Any unprocessed tokens from any previous input are lost. + * + * @param string $input The input to be tokenized. + */ + public function setInput($input) + { + $this->tokens = array(); + $this->reset(); + $this->scan($input); + } + + /** + * Resets the lexer. + */ + public function reset() + { + $this->lookahead = null; + $this->token = null; + $this->peek = 0; + $this->position = 0; + } + + /** + * Resets the peek pointer to 0. + */ + public function resetPeek() + { + $this->peek = 0; + } + + /** + * Resets the lexer position on the input to the given position. + * + * @param integer $position Position to place the lexical scanner + */ + public function resetPosition($position = 0) + { + $this->position = $position; + } + + /** + * Checks whether a given token matches the current lookahead. + * + * @param integer|string $token + * @return boolean + */ + public function isNextToken($token) + { + return null !== $this->lookahead && $this->lookahead['type'] === $token; + } + + /** + * Checks whether any of the given tokens matches the current lookahead + * + * @param array $tokens + * @return boolean + */ + public function isNextTokenAny(array $tokens) + { + return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true); + } + + /** + * Moves to the next token in the input string. + * + * A token is an associative array containing three items: + * - 'value' : the string value of the token in the input string + * - 'type' : the type of the token (identifier, numeric, string, input + * parameter, none) + * - 'position' : the position of the token in the input string + * + * @return array|null the next token; null if there is no more tokens left + */ + public function moveNext() + { + $this->peek = 0; + $this->token = $this->lookahead; + $this->lookahead = (isset($this->tokens[$this->position])) + ? $this->tokens[$this->position++] : null; + + return $this->lookahead !== null; + } + + /** + * Tells the lexer to skip input tokens until it sees a token with the given value. + * + * @param string $type The token type to skip until. + */ + public function skipUntil($type) + { + while ($this->lookahead !== null && $this->lookahead['type'] !== $type) { + $this->moveNext(); + } + } + + /** + * Checks if given value is identical to the given token + * + * @param mixed $value + * @param integer $token + * @return boolean + */ + public function isA($value, $token) + { + return $this->getType($value) === $token; + } + + /** + * Moves the lookahead token forward. + * + * @return array | null The next token or NULL if there are no more tokens ahead. + */ + public function peek() + { + if (isset($this->tokens[$this->position + $this->peek])) { + return $this->tokens[$this->position + $this->peek++]; + } else { + return null; + } + } + + /** + * Peeks at the next token, returns it and immediately resets the peek. + * + * @return array|null The next token or NULL if there are no more tokens ahead. + */ + public function glimpse() + { + $peek = $this->peek(); + $this->peek = 0; + return $peek; + } + + /** + * Scans the input string for tokens. + * + * @param string $input a query string + */ + protected function scan($input) + { + static $regex; + + if ( ! isset($regex)) { + $regex = '/(' . implode(')|(', $this->getCatchablePatterns()) . ')|' + . implode('|', $this->getNonCatchablePatterns()) . '/i'; + } + + $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE; + $matches = preg_split($regex, $input, -1, $flags); + + foreach ($matches as $match) { + // Must remain before 'value' assignment since it can change content + $type = $this->getType($match[0]); + + $this->tokens[] = array( + 'value' => $match[0], + 'type' => $type, + 'position' => $match[1], + ); + } + } + + /** + * Gets the literal for a given token. + * + * @param integer $token + * @return string + */ + public function getLiteral($token) + { + $className = get_class($this); + $reflClass = new \ReflectionClass($className); + $constants = $reflClass->getConstants(); + + foreach ($constants as $name => $value) { + if ($value === $token) { + return $className . '::' . $name; + } + } + + return $token; + } + + /** + * Lexical catchable patterns. + * + * @return array + */ + abstract protected function getCatchablePatterns(); + + /** + * Lexical non-catchable patterns. + * + * @return array + */ + abstract protected function getNonCatchablePatterns(); + + /** + * Retrieve token type. Also processes the token value if necessary. + * + * @param string $value + * @return integer + */ + abstract protected function getType(&$value); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php new file mode 100644 index 0000000..e32c0b9 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that provide the service of notifying listeners of + * changes to their properties. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface NotifyPropertyChanged +{ + /** + * Adds a listener that wants to be notified about property changes. + * + * @param PropertyChangedListener $listener + */ + function addPropertyChangedListener(PropertyChangedListener $listener); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php new file mode 100644 index 0000000..94fcd05 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php @@ -0,0 +1,259 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\ManagerRegistry; + +/** + * Abstract implementation of the ManagerRegistry contract. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +abstract class AbstractManagerRegistry implements ManagerRegistry +{ + /** + * @var string + */ + private $name; + + /** + * @var array + */ + private $connections; + + /** + * @var array + */ + private $managers; + + /** + * @var string + */ + private $defaultConnection; + + /** + * @var string + */ + private $defaultManager; + + /** + * @var string + */ + private $proxyInterfaceName; + + /** + * Constructor + * + * @param string $name + * @param array $connections + * @param array $managers + * @param string $defaultConnection + * @param string $defaultManager + * @param string $proxyInterfaceName + */ + public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName) + { + $this->name = $name; + $this->connections = $connections; + $this->managers = $managers; + $this->defaultConnection = $defaultConnection; + $this->defaultManager = $defaultManager; + $this->proxyInterfaceName = $proxyInterfaceName; + } + + /** + * Fetches/creates the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return object instance of the given service + */ + abstract protected function getService($name); + + /** + * Resets the given services + * + * A service in this context is connection or a manager instance + * + * @param string $name name of the service + * @return void + */ + abstract protected function resetService($name); + + /** + * Get the name of the registry + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * {@inheritdoc} + */ + public function getConnection($name = null) + { + if (null === $name) { + $name = $this->defaultConnection; + } + + if (!isset($this->connections[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->connections[$name]); + } + + /** + * {@inheritdoc} + */ + public function getConnectionNames() + { + return $this->connections; + } + + /** + * {@inheritdoc} + */ + public function getConnections() + { + $connections = array(); + foreach ($this->connections as $name => $id) { + $connections[$name] = $this->getService($id); + } + + return $connections; + } + + /** + * {@inheritdoc} + */ + public function getDefaultConnectionName() + { + return $this->defaultConnection; + } + + /** + * {@inheritdoc} + */ + public function getDefaultManagerName() + { + return $this->defaultManager; + } + + /** + * {@inheritdoc} + * + * @throws \InvalidArgumentException + */ + public function getManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + return $this->getService($this->managers[$name]); + } + + /** + * {@inheritdoc} + */ + public function getManagerForClass($class) + { + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName; + } + + $proxyClass = new \ReflectionClass($class); + if ($proxyClass->implementsInterface($this->proxyInterfaceName)) { + $class = $proxyClass->getParentClass()->getName(); + } + + foreach ($this->managers as $id) { + $manager = $this->getService($id); + + if (!$manager->getMetadataFactory()->isTransient($class)) { + return $manager; + } + } + } + + /** + * {@inheritdoc} + */ + public function getManagerNames() + { + return $this->managers; + } + + /** + * {@inheritdoc} + */ + public function getManagers() + { + $dms = array(); + foreach ($this->managers as $name => $id) { + $dms[$name] = $this->getService($id); + } + + return $dms; + } + + /** + * {@inheritdoc} + */ + public function getRepository($persistentObjectName, $persistentManagerName = null) + { + return $this->getManager($persistentManagerName)->getRepository($persistentObjectName); + } + + /** + * {@inheritdoc} + */ + public function resetManager($name = null) + { + if (null === $name) { + $name = $this->defaultManager; + } + + if (!isset($this->managers[$name])) { + throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name)); + } + + // force the creation of a new document manager + // if the current one is closed + $this->resetService($this->managers[$name]); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php new file mode 100644 index 0000000..7d6f0cf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php @@ -0,0 +1,63 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ConnectionRegistry +{ + /** + * Gets the default connection name. + * + * @return string The default connection name + */ + function getDefaultConnectionName(); + + /** + * Gets the named connection. + * + * @param string $name The connection name (null for the default one) + * + * @return object + */ + function getConnection($name = null); + + /** + * Gets an array of all registered connections + * + * @return array An array of Connection instances + */ + function getConnections(); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getConnectionNames(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php new file mode 100644 index 0000000..2fb7c47 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php @@ -0,0 +1,77 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions + * of entities. + * + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class LifecycleEventArgs extends EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * @var object + */ + private $entity; + + /** + * Constructor + * + * @param object $entity + * @param ObjectManager $objectManager + */ + public function __construct($entity, ObjectManager $objectManager) + { + $this->entity = $entity; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated Entity. + * + * @return object + */ + public function getEntity() + { + return $this->entity; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php new file mode 100644 index 0000000..c014d73 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php @@ -0,0 +1,76 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.2 + */ +class LoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var ClassMetadata + */ + private $classMetadata; + + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ClassMetadata $classMetadata + * @param ObjectManager $objectManager + */ + public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager) + { + $this->classMetadata = $classMetadata; + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return ClassMetadata + */ + public function getClassMetadata() + { + return $this->classMetadata; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php new file mode 100644 index 0000000..f139365 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php @@ -0,0 +1,59 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\Persistence\ObjectManager; + +/** + * Provides event arguments for the preFlush event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class ManagerEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var ObjectManager + */ + private $objectManager; + + /** + * Constructor. + * + * @param ObjectManager $objectManager + */ + public function __construct(ObjectManager $objectManager) + { + $this->objectManager = $objectManager; + } + + /** + * Retrieve associated ObjectManager. + * + * @return ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php new file mode 100644 index 0000000..18b6554 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php @@ -0,0 +1,84 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +/** + * Provides event arguments for the onClear event. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Roman Borschel + * @author Benjamin Eberlei + */ +class OnClearEventArgs extends \Doctrine\Common\EventArgs +{ + /** + * @var \Doctrine\Common\Persistence\ObjectManager + */ + private $objectManager; + + /** + * @var string + */ + private $entityClass; + + /** + * Constructor. + * + * @param \Doctrine\Common\Persistence\ObjectManager $objectManager + * @param string $entityClass Optional entity class + */ + public function __construct($objectManager, $entityClass = null) + { + $this->objectManager = $objectManager; + $this->entityClass = $entityClass; + } + + /** + * Retrieve associated ObjectManager. + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + public function getObjectManager() + { + return $this->objectManager; + } + + /** + * Name of the entity class that is cleared, or empty if all are cleared. + * + * @return string + */ + public function getEntityClass() + { + return $this->entityClass; + } + + /** + * Check if event clears all entities. + * + * @return bool + */ + public function clearsAllEntities() + { + return ($this->entityClass === null); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php new file mode 100644 index 0000000..86ac819 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php @@ -0,0 +1,133 @@ +. + */ + +namespace Doctrine\Common\Persistence\Event; + +use Doctrine\Common\EventArgs, + Doctrine\Common\Persistence\ObjectManager; + +/** + * Class that holds event arguments for a preUpdate event. + * + * @author Guilherme Blanco + * @author Roman Borschel + * @author Benjamin Eberlei + * @since 2.2 + */ +class PreUpdateEventArgs extends LifecycleEventArgs +{ + /** + * @var array + */ + private $entityChangeSet; + + /** + * Constructor. + * + * @param object $entity + * @param ObjectManager $objectManager + * @param array $changeSet + */ + public function __construct($entity, ObjectManager $objectManager, array &$changeSet) + { + parent::__construct($entity, $objectManager); + + $this->entityChangeSet = &$changeSet; + } + + /** + * Retrieve entity changeset. + * + * @return array + */ + public function getEntityChangeSet() + { + return $this->entityChangeSet; + } + + /** + * Check if field has a changeset. + * + * @param string $field + * + * @return boolean + */ + public function hasChangedField($field) + { + return isset($this->entityChangeSet[$field]); + } + + /** + * Get the old value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getOldValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][0]; + } + + /** + * Get the new value of the changeset of the changed field. + * + * @param string $field + * @return mixed + */ + public function getNewValue($field) + { + $this->assertValidField($field); + + return $this->entityChangeSet[$field][1]; + } + + /** + * Set the new value of this field. + * + * @param string $field + * @param mixed $value + */ + public function setNewValue($field, $value) + { + $this->assertValidField($field); + + $this->entityChangeSet[$field][1] = $value; + } + + /** + * Assert the field exists in changeset. + * + * @param string $field + * + * @throws \InvalidArgumentException + */ + private function assertValidField($field) + { + if ( ! isset($this->entityChangeSet[$field])) { + throw new \InvalidArgumentException(sprintf( + 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.', + $field, + get_class($this->getEntity()) + )); + } + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php new file mode 100644 index 0000000..bdb23bd --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Fabien Potencier + * @author Benjamin Eberlei + * @author Lukas Kahwe Smith + */ +interface ManagerRegistry extends ConnectionRegistry +{ + /** + * Gets the default object manager name. + * + * @return string The default object manager name + */ + function getDefaultManagerName(); + + /** + * Gets a named object manager. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function getManager($name = null); + + /** + * Gets an array of all registered object managers + * + * @return \Doctrine\Common\Persistence\ObjectManager[] An array of ObjectManager instances + */ + function getManagers(); + + /** + * Resets a named object manager. + * + * This method is useful when an object manager has been closed + * because of a rollbacked transaction AND when you think that + * it makes sense to get a new one to replace the closed one. + * + * Be warned that you will get a brand new object manager as + * the existing one is not useable anymore. This means that any + * other object with a dependency on this object manager will + * hold an obsolete reference. You can inject the registry instead + * to avoid this problem. + * + * @param string $name The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectManager + */ + function resetManager($name = null); + + /** + * Resolves a registered namespace alias to the full namespace. + * + * This method looks for the alias in all registered object managers. + * + * @param string $alias The alias + * + * @return string The full namespace + */ + function getAliasNamespace($alias); + + /** + * Gets all connection names. + * + * @return array An array of connection names + */ + function getManagerNames(); + + /** + * Gets the ObjectRepository for an persistent object. + * + * @param string $persistentObject The name of the persistent object. + * @param string $persistentManagerName The object manager name (null for the default one) + * + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($persistentObject, $persistentManagerName = null); + + /** + * Gets the object manager associated with a given class. + * + * @param string $class A persistent object class name + * + * @return \Doctrine\Common\Persistence\ObjectManager|null + */ + function getManagerForClass($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php new file mode 100644 index 0000000..1ace1cc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php @@ -0,0 +1,383 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use Doctrine\Common\Cache\Cache, + Doctrine\Common\Util\ClassUtils; + +/** + * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the + * metadata mapping informations of a class which describes how a class should be mapped + * to a relational database. + * + * This class was abstracted from the ORM ClassMetadataFactory + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +abstract class AbstractClassMetadataFactory implements ClassMetadataFactory +{ + /** + * Salt used by specific Object Manager implementation. + * + * @var string + */ + protected $cacheSalt = "\$CLASSMETADATA"; + + /** + * @var \Doctrine\Common\Cache\Cache + */ + private $cacheDriver; + + /** + * @var array + */ + private $loadedMetadata = array(); + + /** + * @var bool + */ + protected $initialized = false; + + /** + * @var ReflectionService + */ + private $reflectionService; + + /** + * Sets the cache driver used by the factory to cache ClassMetadata instances. + * + * @param Doctrine\Common\Cache\Cache $cacheDriver + */ + public function setCacheDriver(Cache $cacheDriver = null) + { + $this->cacheDriver = $cacheDriver; + } + + /** + * Gets the cache driver used by the factory to cache ClassMetadata instances. + * + * @return Doctrine\Common\Cache\Cache + */ + public function getCacheDriver() + { + return $this->cacheDriver; + } + + /** + * Return an array of all the loaded metadata currently in memory. + * + * @return array + */ + public function getLoadedMetadata() + { + return $this->loadedMetadata; + } + + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + public function getAllMetadata() + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $driver = $this->getDriver(); + $metadata = array(); + foreach ($driver->getAllClassNames() as $className) { + $metadata[] = $this->getMetadataFor($className); + } + + return $metadata; + } + + /** + * Lazy initialization of this stuff, especially the metadata driver, + * since these are not needed at all when a metadata cache is active. + * + * @return void + */ + abstract protected function initialize(); + + /** + * Get the fully qualified class-name from the namespace alias. + * + * @param string $namespaceAlias + * @param string $simpleClassName + * @return string + */ + abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName); + + /** + * Return the mapping driver implementation. + * + * @return \Doctrine\Common\Persistence\Mapping\Driver\MappingDriver + */ + abstract protected function getDriver(); + + /** + * Wakeup reflection after ClassMetadata gets unserialized from cache. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Initialize Reflection after ClassMetadata was constructed. + * + * @param ClassMetadata $class + * @param ReflectionService $reflService + * @return void + */ + abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService); + + /** + * Checks whether the class metadata is an entity. + * + * This method should false for mapped superclasses or + * embedded classes. + * + * @param ClassMetadata $class + * @return boolean + */ + abstract protected function isEntity(ClassMetadata $class); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + public function getMetadataFor($className) + { + if (isset($this->loadedMetadata[$className])) { + return $this->loadedMetadata[$className]; + } + + $realClassName = $className; + + // Check for namespace alias + if (strpos($className, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $className); + $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + } else { + $realClassName = ClassUtils::getRealClass($realClassName); + } + + if (isset($this->loadedMetadata[$realClassName])) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + + return $this->loadedMetadata[$realClassName]; + } + + if ($this->cacheDriver) { + if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) { + $this->loadedMetadata[$realClassName] = $cached; + $this->wakeupReflection($cached, $this->getReflectionService()); + } else { + foreach ($this->loadMetadata($realClassName) as $loadedClassName) { + $this->cacheDriver->save( + $loadedClassName . $this->cacheSalt, $this->loadedMetadata[$loadedClassName], null + ); + } + } + } else { + $this->loadMetadata($realClassName); + } + + if ($className != $realClassName) { + // We do not have the alias name in the map, include it + $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName]; + } + + return $this->loadedMetadata[$className]; + } + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + public function hasMetadataFor($className) + { + return isset($this->loadedMetadata[$className]); + } + + /** + * Sets the metadata descriptor for a specific class. + * + * NOTE: This is only useful in very special cases, like when generating proxy classes. + * + * @param string $className + * @param ClassMetadata $class + */ + public function setMetadataFor($className, $class) + { + $this->loadedMetadata[$className] = $class; + } + + /** + * Get array of parent classes for the given entity class + * + * @param string $name + * @return array $parentClasses + */ + protected function getParentClasses($name) + { + // Collect parent classes, ignoring transient (not-mapped) classes. + $parentClasses = array(); + foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) { + if ( ! $this->getDriver()->isTransient($parentClass)) { + $parentClasses[] = $parentClass; + } + } + return $parentClasses; + } + + /** + * Loads the metadata of the class in question and all it's ancestors whose metadata + * is still not loaded. + * + * @param string $name The name of the class for which the metadata should get loaded. + * + * @return array + */ + protected function loadMetadata($name) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + $loaded = array(); + + $parentClasses = $this->getParentClasses($name); + $parentClasses[] = $name; + + // Move down the hierarchy of parent classes, starting from the topmost class + $parent = null; + $rootEntityFound = false; + $visited = array(); + $reflService = $this->getReflectionService(); + foreach ($parentClasses as $className) { + if (isset($this->loadedMetadata[$className])) { + $parent = $this->loadedMetadata[$className]; + if ($this->isEntity($parent)) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + continue; + } + + $class = $this->newClassMetadataInstance($className); + $this->initializeReflection($class, $reflService); + + $this->doLoadMetadata($class, $parent, $rootEntityFound, $visited); + + $this->loadedMetadata[$className] = $class; + + $parent = $class; + + if ($this->isEntity($class)) { + $rootEntityFound = true; + array_unshift($visited, $className); + } + + $this->wakeupReflection($class, $reflService); + + $loaded[] = $className; + } + + return $loaded; + } + + /** + * Actually load the metadata from the underlying metadata + * + * @param ClassMetadata $class + * @param ClassMetadata|null $parent + * @param bool $rootEntityFound + * @param array $nonSuperclassParents classnames all parent classes that are not marked as mapped superclasses + * @return void + */ + abstract protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents); + + /** + * Creates a new ClassMetadata instance for the given class name. + * + * @param string $className + * @return ClassMetadata + */ + abstract protected function newClassMetadataInstance($className); + + /** + * Check if this class is mapped by this Object Manager + ClassMetadata configuration + * + * @param $class + * @return bool + */ + public function isTransient($class) + { + if ( ! $this->initialized) { + $this->initialize(); + } + + // Check for namespace alias + if (strpos($class, ':') !== false) { + list($namespaceAlias, $simpleClassName) = explode(':', $class); + $class = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName); + } + + return $this->getDriver()->isTransient($class); + } + + /** + * Set reflectionService. + * + * @param ReflectionService $reflectionService + */ + public function setReflectionService(ReflectionService $reflectionService) + { + $this->reflectionService = $reflectionService; + } + + /** + * Get the reflection service associated with this metadata factory. + * + * @return ReflectionService + */ + public function getReflectionService() + { + if ($this->reflectionService === null) { + $this->reflectionService = new RuntimeReflectionService(); + } + return $this->reflectionService; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php new file mode 100644 index 0000000..4836bf8 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php @@ -0,0 +1,165 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadata +{ + /** + * Get fully-qualified class name of this persistent class. + * + * @return string + */ + function getName(); + + /** + * Gets the mapped identifier field name. + * + * The returned structure is an array of the identifier field names. + * + * @return array + */ + function getIdentifier(); + + /** + * Gets the ReflectionClass instance for this mapped class. + * + * @return \ReflectionClass + */ + function getReflectionClass(); + + /** + * Checks if the given field name is a mapped identifier for this class. + * + * @param string $fieldName + * @return boolean + */ + function isIdentifier($fieldName); + + /** + * Checks if the given field is a mapped property for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasField($fieldName); + + /** + * Checks if the given field is a mapped association for this class. + * + * @param string $fieldName + * @return boolean + */ + function hasAssociation($fieldName); + + /** + * Checks if the given field is a mapped single valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isSingleValuedAssociation($fieldName); + + /** + * Checks if the given field is a mapped collection valued association for this class. + * + * @param string $fieldName + * @return boolean + */ + function isCollectionValuedAssociation($fieldName); + + /** + * A numerically indexed list of field names of this persistent class. + * + * This array includes identifier fields if present on this class. + * + * @return array + */ + function getFieldNames(); + + /** + * Returns an array of identifier field names numerically indexed. + * + * @return array + */ + function getIdentifierFieldNames(); + + /** + * A numerically indexed list of association names of this persistent class. + * + * This array includes identifier associations if present on this class. + * + * @return array + */ + function getAssociationNames(); + + /** + * Returns a type name of this field. + * + * This type names can be implementation specific but should at least include the php types: + * integer, string, boolean, float/double, datetime. + * + * @param string $fieldName + * @return string + */ + function getTypeOfField($fieldName); + + /** + * Returns the target class name of the given association. + * + * @param string $assocName + * @return string + */ + function getAssociationTargetClass($assocName); + + /** + * Checks if the association is the inverse side of a bidirectional association + * + * @param string $assocName + * @return boolean + */ + function isAssociationInverseSide($assocName); + + /** + * Returns the target field of the owning side of the association + * + * @param string $assocName + * @return string + */ + function getAssociationMappedByTargetField($assocName); + + /** + * Return the identifier of this object as an array with field name as key. + * + * Has to return an empty array if no identifier isset. + * + * @param object $object + * @return array + */ + function getIdentifierValues($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php new file mode 100644 index 0000000..3fa39bc --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php @@ -0,0 +1,74 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Contract for a Doctrine persistence layer ClassMetadata class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ClassMetadataFactory +{ + /** + * Forces the factory to load the metadata of all classes known to the underlying + * mapping driver. + * + * @return array The ClassMetadata instances of all mapped classes. + */ + function getAllMetadata(); + + /** + * Gets the class metadata descriptor for a class. + * + * @param string $className The name of the class. + * @return ClassMetadata + */ + function getMetadataFor($className); + + /** + * Checks whether the factory has the metadata for a class loaded already. + * + * @param string $className + * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise. + */ + function hasMetadataFor($className); + + /** + * Sets the metadata descriptor for a specific class. + * + * @param string $className + * @param ClassMetadata $class + */ + function setMetadataFor($className, $class); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped directly or as a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php new file mode 100644 index 0000000..1131add --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Cache\ArrayCache, + Doctrine\Common\Annotations\AnnotationReader, + Doctrine\Common\Annotations\AnnotationRegistry, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The AnnotationDriver reads the mapping metadata from docblock annotations. + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class AnnotationDriver implements MappingDriver +{ + /** + * The AnnotationReader. + * + * @var AnnotationReader + */ + protected $reader; + + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension = '.php'; + + /** + * Cache for AnnotationDriver#getAllClassNames() + * + * @var array + */ + protected $classNames; + + /** + * Name of the entity annotations as keys + * + * @var array + */ + protected $entityAnnotationClasses = array(); + + /** + * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading + * docblock annotations. + * + * @param AnnotationReader $reader The AnnotationReader to use, duck-typed. + * @param string|array $paths One or multiple paths where mapping classes can be found. + */ + public function __construct($reader, $paths = null) + { + $this->reader = $reader; + if ($paths) { + $this->addPaths((array) $paths); + } + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Retrieve the current annotation reader + * + * @return AnnotationReader + */ + public function getReader() + { + return $this->reader; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * Whether the class with the specified name is transient. Only non-transient + * classes, that is entities and mapped superclasses, should have their metadata loaded. + * + * A class is non-transient if it is annotated with an annotation + * from the {@see AnnotationDriver::entityAnnotationClasses}. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className)); + + foreach ($classAnnotations as $annot) { + if (isset($this->entityAnnotationClasses[get_class($annot)])) { + return false; + } + } + return true; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::LEAVES_ONLY + ), + '/^.+' . str_replace('.', '\.', $this->fileExtension) . '$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file) { + $sourceFile = realpath($file[0]); + + require_once $sourceFile; + + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php new file mode 100644 index 0000000..0d61174 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php @@ -0,0 +1,170 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is inpependent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +class DefaultFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * The file extension of mapping documents. + * + * @var string + */ + protected $fileExtension; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array $paths One or multiple paths where mapping documents can be found. + * @param string|null $fileExtension + */ + public function __construct($paths, $fileExtension = null) + { + $this->addPaths((array) $paths); + $this->fileExtension = $fileExtension; + } + + /** + * Append lookup paths to metadata driver. + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * Retrieve the defined metadata lookup paths. + * + * @return array + */ + public function getPaths() + { + return $this->paths; + } + + /** + * Get the file extension used to look for mapping files under + * + * @return string + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ($this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return $path . DIRECTORY_SEPARATOR . $fileName; + } + } + + throw MappingException::mappingFileNotFound($className, $fileName); + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename) + { + $classes = array(); + + if ($this->paths) { + foreach ($this->paths as $path) { + if ( ! is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $fileName = str_replace('\\', '.', $className) . $this->fileExtension; + + // Check whether file exists + foreach ((array) $this->paths as $path) { + if (file_exists($path . DIRECTORY_SEPARATOR . $fileName)) { + return true; + } + } + + return false; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php new file mode 100644 index 0000000..b0a7685 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php @@ -0,0 +1,214 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * Base driver for file-based metadata drivers. + * + * A file driver operates in a mode where it loads the mapping files of individual + * classes on demand. This requires the user to adhere to the convention of 1 mapping + * file per class and the file names of the mapping files must correspond to the full + * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.com + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +abstract class FileDriver implements MappingDriver +{ + /** + * @var FileLocator + */ + protected $locator; + + /** + * @var array + */ + protected $classCache; + + /** + * @var string + */ + protected $globalBasename; + + /** + * Initializes a new FileDriver that looks in the given path(s) for mapping + * documents and operates in the specified operating mode. + * + * @param string|array|FileLocator $locator A FileLocator or one/multiple paths where mapping documents can be found. + * @param string $fileExtension + */ + public function __construct($locator, $fileExtension = null) + { + if ($locator instanceof FileLocator) { + $this->locator = $locator; + } else { + $this->locator = new DefaultFileLocator((array)$locator, $fileExtension); + } + } + + /** + * Set global basename + * + * @param string $file + */ + public function setGlobalBasename($file) + { + $this->globalBasename = $file; + } + + /** + * Retrieve global basename + * + * @return string + */ + public function getGlobalBasename() + { + return $this->globalBasename; + } + + /** + * Get the element of schema meta data for the class from the mapping file. + * This will lazily load the mapping file if it is not loaded yet + * + * @param string $className + * + * @throws MappingException + * @return array The element of schema meta data + */ + public function getElement($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return $this->classCache[$className]; + } + + $result = $this->loadMappingFile($this->locator->findMappingFile($className)); + if (!isset($result[$className])) { + throw MappingException::invalidMappingFile($className, str_replace('\\', '.', $className) . $this->locator->getFileExtension()); + } + + return $result[$className]; + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + if ($this->classCache === null) { + $this->initialize(); + } + + if (isset($this->classCache[$className])) { + return false; + } + + return !$this->locator->fileExists($className); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + if ($this->classCache === null) { + $this->initialize(); + } + + $classNames = (array)$this->locator->getAllClassNames($this->globalBasename); + if ($this->classCache) { + $classNames = array_merge(array_keys($this->classCache), $classNames); + } + return $classNames; + } + + /** + * Loads a mapping file with the given name and returns a map + * from class/entity names to their corresponding file driver elements. + * + * @param string $file The mapping file to load. + * @return array + */ + abstract protected function loadMappingFile($file); + + /** + * Initialize the class cache from all the global files. + * + * Using this feature adds a substantial performance hit to file drivers as + * more metadata has to be loaded into memory than might actually be + * necessary. This may not be relevant to scenarios where caching of + * metadata is in place, however hits very hard in scenarios where no + * caching is used. + * + * @return void + */ + protected function initialize() + { + $this->classCache = array(); + if (null !== $this->globalBasename) { + foreach ($this->locator->getPaths() as $path) { + $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension(); + if (is_file($file)) { + $this->classCache = array_merge( + $this->classCache, + $this->loadMappingFile($file) + ); + } + } + } + } + + /** + * Retrieve the locator used to discover mapping files by className + * + * @return FileLocator + */ + public function getLocator() + { + return $this->locator; + } + + /** + * Set the locator used to discover mapping files by className + * + * @param FileLocator $locator + */ + public function setLocator(FileLocator $locator) + { + $this->locator = $locator; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php new file mode 100644 index 0000000..ec2b606 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php @@ -0,0 +1,71 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +/** + * Locate the file that contains the metadata information for a given class name. + * + * This behavior is independent of the actual content of the file. It just detects + * the file which is responsible for the given class name. + * + * @author Benjamin Eberlei + * @author Johannes M. Schmitt + */ +interface FileLocator +{ + /** + * Locate mapping file for the given class name. + * + * @param string $className + * @return string + */ + function findMappingFile($className); + + /** + * Get all class names that are found with this file locator. + * + * @param string $globalBasename Passed to allow excluding the basename + * @return array + */ + function getAllClassNames($globalBasename); + + /** + * Check if a file can be found for this class name. + * + * @param string $className + * + * @return bool + */ + function fileExists($className); + + /** + * Get all the paths that this file locator looks for mapping files. + * + * @return array + */ + function getPaths(); + + /** + * Get the file extension that mapping files are suffixed with. + * + * @return string + */ + function getFileExtension(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php new file mode 100644 index 0000000..955d831 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php @@ -0,0 +1,56 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Contract for metadata drivers. + * + * @since 2.2 + * @author Jonathan H. Wage + */ +interface MappingDriver +{ + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + */ + function loadMetadataForClass($className, ClassMetadata $metadata); + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + function getAllClassNames(); + + /** + * Whether the class with the specified name should have its metadata loaded. + * This is only the case if it is either mapped as an Entity or a + * MappedSuperclass. + * + * @param string $className + * @return boolean + */ + function isTransient($className); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php new file mode 100644 index 0000000..3b1049d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php @@ -0,0 +1,168 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver, + Doctrine\Common\Persistence\Mapping\ClassMetadata, + Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The DriverChain allows you to add multiple other mapping drivers for + * certain namespaces + * + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class MappingDriverChain implements MappingDriver +{ + /** + * The default driver + * + * @var MappingDriver + */ + private $defaultDriver; + + /** + * @var array + */ + private $drivers = array(); + + /** + * Get the default driver. + * + * @return MappingDriver|null + */ + public function getDefaultDriver() + { + return $this->defaultDriver; + } + + /** + * Set the default driver. + * + * @param MappingDriver $driver + */ + public function setDefaultDriver(MappingDriver $driver) + { + $this->defaultDriver = $driver; + } + + /** + * Add a nested driver. + * + * @param MappingDriver $nestedDriver + * @param string $namespace + */ + public function addDriver(MappingDriver $nestedDriver, $namespace) + { + $this->drivers[$namespace] = $nestedDriver; + } + + /** + * Get the array of nested drivers. + * + * @return array $drivers + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Loads the metadata for the specified class into the provided container. + * + * @param string $className + * @param ClassMetadata $metadata + * + * @throws MappingException + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + /* @var $driver MappingDriver */ + foreach ($this->drivers as $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + $driver->loadMetadataForClass($className, $metadata); + return; + } + } + + if (null !== $this->defaultDriver) { + $this->defaultDriver->loadMetadataForClass($className, $metadata); + return; + } + + throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers)); + } + + /** + * Gets the names of all mapped classes known to this driver. + * + * @return array The names of all mapped classes known to this driver. + */ + public function getAllClassNames() + { + $classNames = array(); + $driverClasses = array(); + + /* @var $driver MappingDriver */ + foreach ($this->drivers AS $namespace => $driver) { + $oid = spl_object_hash($driver); + + if (!isset($driverClasses[$oid])) { + $driverClasses[$oid] = $driver->getAllClassNames(); + } + + foreach ($driverClasses[$oid] AS $className) { + if (strpos($className, $namespace) === 0) { + $classNames[$className] = true; + } + } + } + + return array_keys($classNames); + } + + /** + * Whether the class with the specified name should have its metadata loaded. + * + * This is only the case for non-transient classes either mapped as an Entity or MappedSuperclass. + * + * @param string $className + * @return boolean + */ + public function isTransient($className) + { + /* @var $driver MappingDriver */ + foreach ($this->drivers AS $namespace => $driver) { + if (strpos($className, $namespace) === 0) { + return $driver->isTransient($className); + } + } + + if ($this->defaultDriver !== null) { + return $this->defaultDriver->isTransient($className); + } + + return true; + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php new file mode 100644 index 0000000..e0c8611 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * The PHPDriver includes php files which just populate ClassMetadataInfo + * instances with plain php code + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class PHPDriver extends FileDriver +{ + /** + * {@inheritdoc} + */ + protected $metadata; + + /** + * {@inheritDoc} + */ + public function __construct($locator, $fileExtension = null) + { + $fileExtension = ".php"; + parent::__construct($locator, $fileExtension); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $this->metadata = $metadata; + $this->loadMappingFile($this->locator->findMappingFile($className)); + } + + /** + * {@inheritdoc} + */ + protected function loadMappingFile($file) + { + $metadata = $this->metadata; + include $file; + + return array($metadata->getName() => $metadata); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php new file mode 100644 index 0000000..e3cea73 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php @@ -0,0 +1,141 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The StaticPHPDriver calls a static loadMetadata() method on your entity + * classes where you can manually populate the ClassMetadata instance. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.2 + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan H. Wage + * @author Roman Borschel + */ +class StaticPHPDriver implements MappingDriver +{ + /** + * Paths of entity directories. + * + * @var array + */ + private $paths = array(); + + /** + * Map of all class names. + * + * @var array + */ + private $classNames; + + /** + * Constructor + * + * @param array|string $paths + */ + public function __construct($paths) + { + $this->addPaths((array) $paths); + } + + /** + * Add paths + * + * @param array $paths + */ + public function addPaths(array $paths) + { + $this->paths = array_unique(array_merge($this->paths, $paths)); + } + + /** + * {@inheritdoc} + */ + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + $className::loadMetadata($metadata); + } + + /** + * {@inheritDoc} + * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it? + */ + public function getAllClassNames() + { + if ($this->classNames !== null) { + return $this->classNames; + } + + if (!$this->paths) { + throw MappingException::pathRequired(); + } + + $classes = array(); + $includedFiles = array(); + + foreach ($this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + if ($file->getBasename('.php') == $file->getBasename()) { + continue; + } + + $sourceFile = realpath($file->getPathName()); + require_once $sourceFile; + $includedFiles[] = $sourceFile; + } + } + + $declared = get_declared_classes(); + + foreach ($declared as $className) { + $rc = new \ReflectionClass($className); + $sourceFile = $rc->getFileName(); + if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) { + $classes[] = $className; + } + } + + $this->classNames = $classes; + + return $classes; + } + + /** + * {@inheritdoc} + */ + public function isTransient($className) + { + return ! method_exists($className, 'loadMetadata'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php new file mode 100644 index 0000000..9095187 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php @@ -0,0 +1,214 @@ +. +*/ + +namespace Doctrine\Common\Persistence\Mapping\Driver; + +use Doctrine\Common\Persistence\Mapping\MappingException; + +/** + * The Symfony File Locator makes a simplifying assumptions compared + * to the DefaultFileLocator. By assuming paths only contain entities of a certain + * namespace the mapping files consists of the short classname only. + * + * @author Fabien Potencier + * @author Benjamin Eberlei + * @license MIT + */ +class SymfonyFileLocator implements FileLocator +{ + /** + * The paths where to look for mapping files. + * + * @var array + */ + protected $paths = array(); + + /** + * A map of mapping directory path to namespace prefix used to expand class shortnames. + * + * @var array + */ + protected $prefixes = array(); + + /** + * File extension that is searched for. + * + * @var string + */ + protected $fileExtension; + + /** + * Constructor + * + * @param array $prefixes + * @param string|null $fileExtension + */ + public function __construct(array $prefixes, $fileExtension = null) + { + $this->addNamespacePrefixes($prefixes); + $this->fileExtension = $fileExtension; + } + + /** + * Add Namespace Prefixes + * + * @param array $prefixes + */ + public function addNamespacePrefixes(array $prefixes) + { + $this->prefixes = array_merge($this->prefixes, $prefixes); + $this->paths = array_merge($this->paths, array_keys($prefixes)); + } + + /** + * Get Namespace Prefixes + * + * @return array + */ + public function getNamespacePrefixes() + { + return $this->prefixes; + } + + /** + * {@inheritDoc} + */ + public function getPaths() + { + return $this->paths; + } + + /** + * {@inheritDoc} + */ + public function getFileExtension() + { + return $this->fileExtension; + } + + /** + * Set the file extension used to look for mapping files under + * + * @param string $fileExtension The file extension to set + * @return void + */ + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + /** + * {@inheritDoc} + */ + public function fileExists($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + // global namespace class + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return true; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + return is_file($filename); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function getAllClassNames($globalBasename = null) + { + $classes = array(); + + if ($this->paths) { + foreach ((array) $this->paths as $path) { + if (!is_dir($path)) { + throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + + foreach ($iterator as $file) { + $fileName = $file->getBasename($this->fileExtension); + + if ($fileName == $file->getBasename() || $fileName == $globalBasename) { + continue; + } + + // NOTE: All files found here means classes are not transient! + if (isset($this->prefixes[$path])) { + $classes[] = $this->prefixes[$path].'\\'.str_replace('.', '\\', $fileName); + } else { + $classes[] = str_replace('.', '\\', $fileName); + } + } + } + } + + return $classes; + } + + /** + * {@inheritDoc} + */ + public function findMappingFile($className) + { + $defaultFileName = str_replace('\\', '.', $className).$this->fileExtension; + foreach ($this->paths as $path) { + if (!isset($this->prefixes[$path])) { + if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) { + return $path.DIRECTORY_SEPARATOR.$defaultFileName; + } + + continue; + } + + $prefix = $this->prefixes[$path]; + + if (0 !== strpos($className, $prefix.'\\')) { + continue; + } + + $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', '.').$this->fileExtension; + if (is_file($filename)) { + return $filename; + } + + throw MappingException::mappingFileNotFound($className, $filename); + } + + throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php new file mode 100644 index 0000000..c1e7ad5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php @@ -0,0 +1,86 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * A MappingException indicates that something is wrong with the mapping setup. + * + * @since 2.2 + */ +class MappingException extends \Exception +{ + /** + * + * @param string $className + * @param array $namespaces + * + * @return MappingException + */ + public static function classNotFoundInNamespaces($className, $namespaces) + { + return new self("The class '" . $className . "' was not found in the ". + "chain configured namespaces " . implode(", ", $namespaces)); + } + + /** + * @return MappingException + */ + public static function pathRequired() + { + return new self("Specifying the paths to your entities is required ". + "in the AnnotationDriver to retrieve all class names."); + } + + /** + * @param string|null $path + * @return MappingException + */ + public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null) + { + if ( ! empty($path)) { + $path = '[' . $path . ']'; + } + + return new self( + 'File mapping drivers must have a valid directory path, ' . + 'however the given path ' . $path . ' seems to be incorrect!' + ); + } + + /** + * @param string $entityName + * @param string $fileName + * @return MappingException + */ + public static function mappingFileNotFound($entityName, $fileName) + { + return new self("No mapping file found named '$fileName' for class '$entityName'."); + } + + /** + * @param string $entityName + * @param string $fileName + * @return MappingException + */ + public static function invalidMappingFile($entityName, $fileName) + { + return new self("Invalid mapping file '$fileName' for class '$entityName'."); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php new file mode 100644 index 0000000..3db85d9 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php @@ -0,0 +1,80 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +/** + * Very simple reflection service abstraction. + * + * This is required inside metadata layers that may require either + * static or runtime reflection. + * + * @author Benjamin Eberlei + */ +interface ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + function getParentClasses($class); + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + function getClassShortName($class); + + /** + * @param string $class + * @return string + */ + function getClassNamespace($class); + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return \ReflectionClass|null + */ + function getClass($class); + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return \ReflectionProperty|null + */ + function getAccessibleProperty($class, $property); + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + function hasPublicMethod($class, $method); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php new file mode 100644 index 0000000..77b9e76 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php @@ -0,0 +1,102 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class RuntimeReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return class_parents($class); + } + + /** + * Return the shortname of a class. + * + * @param string $class + * @return string + */ + public function getClassShortName($class) + { + $r = new ReflectionClass($class); + return $r->getShortName(); + } + + /** + * @param string $class + * @return string + */ + public function getClassNamespace($class) + { + $r = new ReflectionClass($class); + return $r->getNamespaceName(); + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return new ReflectionClass($class); + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + $property = new ReflectionProperty($class, $property); + $property->setAccessible(true); + return $property; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php new file mode 100644 index 0000000..4f6d1cf --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php @@ -0,0 +1,107 @@ +. + */ + +namespace Doctrine\Common\Persistence\Mapping; + +use ReflectionClass; +use ReflectionProperty; + +/** + * PHP Runtime Reflection Service + * + * @author Benjamin Eberlei + */ +class StaticReflectionService implements ReflectionService +{ + /** + * Return an array of the parent classes (not interfaces) for the given class. + * + * @param string $class + * @return array + */ + public function getParentClasses($class) + { + return array(); + } + + /** + * Return the shortname of a class. + * + * @param string $className + * @return string + */ + public function getClassShortName($className) + { + if (strpos($className, '\\') !== false) { + $className = substr($className, strrpos($className, "\\")+1); + } + return $className; + } + + /** + * Return the namespace of a class. + * + * @param string $className + * @return string + */ + public function getClassNamespace($className) + { + $namespace = ''; + if (strpos($className, '\\') !== false) { + $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 )); + } + return $namespace; + } + + /** + * Return a reflection class instance or null + * + * @param string $class + * @return ReflectionClass|null + */ + public function getClass($class) + { + return null; + } + + /** + * Return an accessible property (setAccessible(true)) or null. + * + * @param string $class + * @param string $property + * @return ReflectionProperty|null + */ + public function getAccessibleProperty($class, $property) + { + return null; + } + + /** + * Check if the class have a public method with the given name. + * + * @param mixed $class + * @param mixed $method + * @return bool + */ + public function hasPublicMethod($class, $method) + { + return method_exists($class, $method) && is_callable(array($class, $method)); + } +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php new file mode 100644 index 0000000..2bb8722 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php @@ -0,0 +1,152 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectManager class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectManager +{ + /** + * Finds a object by its identifier. + * + * This is just a convenient shortcut for getRepository($className)->find($id). + * + * @param string + * @param mixed + * @return object + */ + function find($className, $id); + + /** + * Tells the ObjectManager to make an instance managed and persistent. + * + * The object will be entered into the database as a result of the flush operation. + * + * NOTE: The persist operation always considers objects that are not yet known to + * this ObjectManager as NEW. Do not pass detached objects to the persist operation. + * + * @param object $object The instance to make managed and persistent. + */ + function persist($object); + + /** + * Removes an object instance. + * + * A removed object will be removed from the database as a result of the flush operation. + * + * @param object $object The object instance to remove. + */ + function remove($object); + + /** + * Merges the state of a detached object into the persistence context + * of this ObjectManager and returns the managed copy of the object. + * The object passed to merge will not become associated/managed with this ObjectManager. + * + * @param object $object + * @return object + */ + function merge($object); + + /** + * Clears the ObjectManager. All objects that are currently managed + * by this ObjectManager become detached. + * + * @param string $objectName if given, only objects of this type will get detached + */ + function clear($objectName = null); + + /** + * Detaches an object from the ObjectManager, causing a managed object to + * become detached. Unflushed changes made to the object if any + * (including removal of the object), will not be synchronized to the database. + * Objects which previously referenced the detached object will continue to + * reference it. + * + * @param object $object The object to detach. + */ + function detach($object); + + /** + * Refreshes the persistent state of an object from the database, + * overriding any local changes that have not yet been persisted. + * + * @param object $object The object to refresh. + */ + function refresh($object); + + /** + * Flushes all changes to objects that have been queued up to now to the database. + * This effectively synchronizes the in-memory state of managed objects with the + * database. + */ + function flush(); + + /** + * Gets the repository for a class. + * + * @param string $className + * @return \Doctrine\Common\Persistence\ObjectRepository + */ + function getRepository($className); + + /** + * Returns the ClassMetadata descriptor for a class. + * + * The class name must be the fully-qualified class name without a leading backslash + * (as it is returned by get_class($obj)). + * + * @param string $className + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + */ + function getClassMetadata($className); + + /** + * Gets the metadata factory used to gather the metadata of classes. + * + * @return \Doctrine\Common\Persistence\Mapping\ClassMetadataFactory + */ + function getMetadataFactory(); + + /** + * Helper method to initialize a lazy loading proxy or persistent collection. + * + * This method is a no-op for other objects. + * + * @param object $obj + */ + function initializeObject($obj); + + /** + * Check if the object is part of the current UnitOfWork and therefore + * managed. + * + * @param object $object + * @return bool + */ + function contains($object); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php new file mode 100644 index 0000000..69fba78 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php @@ -0,0 +1,49 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; + +/** + * Makes a Persistent Objects aware of its own object-manager. + * + * Using this interface the managing object manager and class metadata instances + * are injected into the persistent object after construction. This allows + * you to implement ActiveRecord functionality on top of the persistance-ignorance + * that Doctrine propagates. + * + * Word of Warning: This is a very powerful hook to change how you can work with your domain models. + * Using this hook will break the Single Responsibility Principle inside your Domain Objects + * and increase the coupling of database and objects. + * + * Every ObjectManager has to implement this functionality itself. + * + * @author Benjamin Eberlei + */ +interface ObjectManagerAware +{ + /** + * Injects responsible ObjectManager and the ClassMetadata into this persistent object. + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php new file mode 100644 index 0000000..9a3e5b6 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php @@ -0,0 +1,78 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Contract for a Doctrine persistence layer ObjectRepository class to implement. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.1 + * @author Benjamin Eberlei + * @author Jonathan Wage + */ +interface ObjectRepository +{ + /** + * Finds an object by its primary key / identifier. + * + * @param int $id The identifier. + * @return object The object. + */ + function find($id); + + /** + * Finds all objects in the repository. + * + * @return mixed The objects. + */ + function findAll(); + + /** + * Finds objects by a set of criteria. + * + * Optionally sorting and limiting details can be passed. An implementation may throw + * an UnexpectedValueException if certain values of the sorting or limiting details are + * not supported. + * + * @throws \UnexpectedValueException + * @param array $criteria + * @param array|null $orderBy + * @param int|null $limit + * @param int|null $offset + * @return mixed The objects. + */ + function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null); + + /** + * Finds a single object by a set of criteria. + * + * @param array $criteria + * @return object The object. + */ + function findOneBy(array $criteria); + + /** + * Returns the class name of the object managed by the repository + * + * @return string + */ + function getClassName(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php new file mode 100644 index 0000000..9fcc4cb --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php @@ -0,0 +1,244 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; + +/** + * PersistentObject base class that implements getter/setter methods for all mapped fields and associations + * by overriding __call. + * + * This class is a forward compatible implementation of the PersistentObject trait. + * + * + * Limitations: + * + * 1. All persistent objects have to be associated with a single ObjectManager, multiple + * ObjectManagers are not supported. You can set the ObjectManager with `PersistentObject#setObjectManager()`. + * 2. Setters and getters only work if a ClassMetadata instance was injected into the PersistentObject. + * This is either done on `postLoad` of an object or by accessing the global object manager. + * 3. There are no hooks for setters/getters. Just implement the method yourself instead of relying on __call(). + * 4. Slower than handcoded implementations: An average of 7 method calls per access to a field and 11 for an association. + * 5. Only the inverse side associations get autoset on the owning side aswell. Setting objects on the owning side + * will not set the inverse side associations. + * + * @example + * + * PersistentObject::setObjectManager($em); + * + * class Foo extends PersistentObject + * { + * private $id; + * } + * + * $foo = new Foo(); + * $foo->getId(); // method exists through __call + * + * @author Benjamin Eberlei + */ +abstract class PersistentObject implements ObjectManagerAware +{ + /** + * @var ObjectManager + */ + private static $objectManager; + + /** + * @var ClassMetadata + */ + private $cm; + + /** + * Set the object manager responsible for all persistent object base classes. + * + * @param ObjectManager $objectManager + */ + static public function setObjectManager(ObjectManager $objectManager = null) + { + self::$objectManager = $objectManager; + } + + /** + * @return ObjectManager + */ + static public function getObjectManager() + { + return self::$objectManager; + } + + /** + * Inject Doctrine Object Manager + * + * @param ObjectManager $objectManager + * @param ClassMetadata $classMetadata + * + * @throws \RuntimeException + */ + public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) + { + if ($objectManager !== self::$objectManager) { + throw new \RuntimeException("Trying to use PersistentObject with different ObjectManager instances. " . + "Was PersistentObject::setObjectManager() called?"); + } + + $this->cm = $classMetadata; + } + + /** + * Sets a persistent fields value. + * + * @param string $field + * @param array $args + * + * @throws \BadMethodCallException - When no persistent field exists by that name. + * @throws \InvalidArgumentException - When the wrong target object type is passed to an association + * @return void + */ + private function set($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasField($field) && !$this->cm->isIdentifier($field)) { + $this->$field = $args[0]; + } else if ($this->cm->hasAssociation($field) && $this->cm->isSingleValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass) && $args[0] !== null) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + $this->$field = $args[0]; + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * Get persistent field value. + * + * + * @param string $field + * + * @throws \BadMethodCallException - When no persistent field exists by that name. + * @return mixed + */ + private function get($field) + { + $this->initializeDoctrine(); + + if ( $this->cm->hasField($field) || $this->cm->hasAssociation($field) ) { + return $this->$field; + } else { + throw new \BadMethodCallException("no field with name '".$field."' exists on '".$this->cm->getName()."'"); + } + } + + /** + * If this is an inverse side association complete the owning side. + * + * @param string $field + * @param ClassMetadata $targetClass + * @param object $targetObject + */ + private function completeOwningSide($field, $targetClass, $targetObject) + { + // add this object on the owning side aswell, for obvious infinite recursion + // reasons this is only done when called on the inverse side. + if ($this->cm->isAssociationInverseSide($field)) { + $mappedByField = $this->cm->getAssociationMappedByTargetField($field); + $targetMetadata = self::$objectManager->getClassMetadata($targetClass); + + $setter = ($targetMetadata->isCollectionValuedAssociation($mappedByField) ? "add" : "set").$mappedByField; + $targetObject->$setter($this); + } + } + + /** + * Add an object to a collection + * + * @param string $field + * @param array $args + * + * @throws \BadMethodCallException + * @throws \InvalidArgumentException + */ + private function add($field, $args) + { + $this->initializeDoctrine(); + + if ($this->cm->hasAssociation($field) && $this->cm->isCollectionValuedAssociation($field)) { + $targetClass = $this->cm->getAssociationTargetClass($field); + if (!($args[0] instanceof $targetClass)) { + throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'"); + } + if (!($this->$field instanceof Collection)) { + $this->$field = new ArrayCollection($this->$field ?: array()); + } + $this->$field->add($args[0]); + $this->completeOwningSide($field, $targetClass, $args[0]); + } else { + throw new \BadMethodCallException("There is no method add".$field."() on ".$this->cm->getName()); + } + } + + /** + * Initialize Doctrine Metadata for this class. + * + * @throws \RuntimeException + * @return void + */ + private function initializeDoctrine() + { + if ($this->cm !== null) { + return; + } + + if (!self::$objectManager) { + throw new \RuntimeException("No runtime object manager set. Call PersistentObject#setObjectManager()."); + } + + $this->cm = self::$objectManager->getClassMetadata(get_class($this)); + } + + /** + * Magic method that implements + * + * @param string $method + * @param array $args + * + * @throws \BadMethodCallException + * @return mixed + */ + public function __call($method, $args) + { + $command = substr($method, 0, 3); + $field = lcfirst(substr($method, 3)); + if ($command == "set") { + $this->set($field, $args); + } else if ($command == "get") { + return $this->get($field); + } else if ($command == "add") { + $this->add($field, $args); + } else { + throw new \BadMethodCallException("There is no method ".$method." on ".$this->cm->getName()); + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php new file mode 100644 index 0000000..e25598c --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php @@ -0,0 +1,60 @@ +. + */ + +namespace Doctrine\Common\Persistence; + +/** + * Interface for proxy classes. + * + * @author Roman Borschel + * @since 2.2 + */ +interface Proxy +{ + /** + * Marker for Proxy class names. + * + * @var string + */ + const MARKER = '__CG__'; + + /** + * Length of the proxy marker + * + * @var int + */ + const MARKER_LENGTH = 6; + + /** + * Initialize this proxy if its not yet initialized. + * + * Acts as a no-op if already initialized. + * + * @return void + */ + public function __load(); + + /** + * Is this proxy initialized or not. + * + * @return bool + */ + public function __isInitialized(); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php new file mode 100644 index 0000000..1171874 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php @@ -0,0 +1,48 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Contract for classes that are potential listeners of a NotifyPropertyChanged + * implementor. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision: 3938 $ + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +interface PropertyChangedListener +{ + /** + * Notifies the listener of a property change. + * + * @param object $sender The object on which the property changed. + * @param string $propertyName The name of the property that changed. + * @param mixed $oldValue The old value of the property that changed. + * @param mixed $newValue The new value of the property that changed. + */ + function propertyChanged($sender, $propertyName, $oldValue, $newValue); +} + diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/ClassFinderInterface.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/ClassFinderInterface.php new file mode 100644 index 0000000..ae69607 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/ClassFinderInterface.php @@ -0,0 +1,38 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +/** + * Finds a class in a PSR-0 structure. + * + * @author Karoly Negyesi + */ +interface ClassFinderInterface +{ + /** + * Finds a class. + * + * @param string $class The name of the class. + * + * @return + * The name of the class or NULL if not found. + */ + public function findFile($class); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/Psr0FindFile.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/Psr0FindFile.php new file mode 100644 index 0000000..b6a5fd1 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/Psr0FindFile.php @@ -0,0 +1,83 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +/** + * Finds a class in a PSR-0 structure. + * + * @author Karoly Negyesi + */ +class Psr0FindFile implements ClassFinderInterface +{ + /** + * The PSR-0 prefixes. + * + * @var string + */ + protected $prefixes; + + /** + * @param string $prefixes + * An array of prefixes. Each key is a PHP namespace and each value is + * a list of directories. + */ + public function __construct($prefixes) + { + $this->prefixes = $prefixes; + } + + /** + * Finds a class. + * + * @param string $class The name of the class. + * + * @return + * The name of the class or NULL if not found. + */ + public function findFile($class) + { + $lastNsPos = strrpos($class, '\\'); + if ('\\' == $class[0]) { + $class = substr($class, 1); + } + + if (false !== $lastNsPos) { + // namespaced class name + $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $lastNsPos)) . DIRECTORY_SEPARATOR; + $className = substr($class, $lastNsPos + 1); + } else { + // PEAR-like class name + $classPath = null; + $className = $class; + } + + $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; + + foreach ($this->prefixes as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) { + return $dir . DIRECTORY_SEPARATOR . $classPath; + } + } + } + } + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/ReflectionProviderInterface.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/ReflectionProviderInterface.php new file mode 100644 index 0000000..a436a2d --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/ReflectionProviderInterface.php @@ -0,0 +1,45 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +interface ReflectionProviderInterface +{ + /** + * Get the ReflectionClass equivalent for this class. + * + * @return ReflectionClass + */ + public function getReflectionClass(); + + /** + * Get the ReflectionClass equivalent for this class. + * + * @return ReflectionMethod + */ + public function getReflectionMethod($name); + + /** + * Get the ReflectionClass equivalent for this class. + * + * @return ReflectionMethod + */ + public function getReflectionProperty($name); +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionClass.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionClass.php new file mode 100644 index 0000000..12e45d5 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionClass.php @@ -0,0 +1,112 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +use ReflectionClass; +use ReflectionException; + +class StaticReflectionClass extends ReflectionClass +{ + /** + * The static reflection parser object. + * + * @var StaticReflectionParser + */ + private $staticReflectionParser; + + public function __construct(StaticReflectionParser $staticReflectionParser) + { + $this->staticReflectionParser = $staticReflectionParser; + } + + public function getName() + { + return $this->staticReflectionParser->getClassName(); + } + + public function getDocComment() + { + return $this->staticReflectionParser->getDocComment(); + } + + public function getNamespaceName() + { + return $this->staticReflectionParser->getNamespaceName(); + } + + public function getUseStatements() + { + return $this->staticReflectionParser->getUseStatements(); + } + + public function getMethod($name) + { + return $this->staticReflectionParser->getReflectionMethod($name); + } + + public function getProperty($name) + { + return $this->staticReflectionParser->getReflectionProperty($name); + } + + public static function export($argument, $return = false) { throw new ReflectionException('Method not implemented'); } + public function getConstant($name) { throw new ReflectionException('Method not implemented'); } + public function getConstants() { throw new ReflectionException('Method not implemented'); } + public function getConstructor() { throw new ReflectionException('Method not implemented'); } + public function getDefaultProperties() { throw new ReflectionException('Method not implemented'); } + public function getEndLine() { throw new ReflectionException('Method not implemented'); } + public function getExtension() { throw new ReflectionException('Method not implemented'); } + public function getExtensionName() { throw new ReflectionException('Method not implemented'); } + public function getFileName() { throw new ReflectionException('Method not implemented'); } + public function getInterfaceNames() { throw new ReflectionException('Method not implemented'); } + public function getInterfaces() { throw new ReflectionException('Method not implemented'); } + public function getMethods($filter = NULL) { throw new ReflectionException('Method not implemented'); } + public function getModifiers() { throw new ReflectionException('Method not implemented'); } + public function getParentClass() { throw new ReflectionException('Method not implemented'); } + public function getProperties($filter = NULL) { throw new ReflectionException('Method not implemented'); } + public function getShortName() { throw new ReflectionException('Method not implemented'); } + public function getStartLine() { throw new ReflectionException('Method not implemented'); } + public function getStaticProperties() { throw new ReflectionException('Method not implemented'); } + public function getStaticPropertyValue($name, $default = '') { throw new ReflectionException('Method not implemented'); } + public function getTraitAliases() { throw new ReflectionException('Method not implemented'); } + public function getTraitNames() { throw new ReflectionException('Method not implemented'); } + public function getTraits() { throw new ReflectionException('Method not implemented'); } + public function hasConstant($name) { throw new ReflectionException('Method not implemented'); } + public function hasMethod($name) { throw new ReflectionException('Method not implemented'); } + public function hasProperty($name) { throw new ReflectionException('Method not implemented'); } + public function implementsInterface($interface) { throw new ReflectionException('Method not implemented'); } + public function inNamespace() { throw new ReflectionException('Method not implemented'); } + public function isAbstract() { throw new ReflectionException('Method not implemented'); } + public function isCloneable() { throw new ReflectionException('Method not implemented'); } + public function isFinal() { throw new ReflectionException('Method not implemented'); } + public function isInstance($object) { throw new ReflectionException('Method not implemented'); } + public function isInstantiable() { throw new ReflectionException('Method not implemented'); } + public function isInterface() { throw new ReflectionException('Method not implemented'); } + public function isInternal() { throw new ReflectionException('Method not implemented'); } + public function isIterateable() { throw new ReflectionException('Method not implemented'); } + public function isSubclassOf($class) { throw new ReflectionException('Method not implemented'); } + public function isTrait() { throw new ReflectionException('Method not implemented'); } + public function isUserDefined() { throw new ReflectionException('Method not implemented'); } + public function newInstance($args) { throw new ReflectionException('Method not implemented'); } + public function newInstanceArgs(array $args = array()) { throw new ReflectionException('Method not implemented'); } + public function newInstanceWithoutConstructor() { throw new ReflectionException('Method not implemented'); } + public function setStaticPropertyValue($name, $value) { throw new ReflectionException('Method not implemented'); } + public function __toString() { throw new ReflectionException('Method not implemented'); } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionMethod.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionMethod.php new file mode 100644 index 0000000..6482036 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionMethod.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +use ReflectionMethod; +use ReflectionException; + +class StaticReflectionMethod extends ReflectionMethod +{ + /** + * The PSR-0 parser object. + * + * @var StaticReflectionParser + */ + protected $staticReflectionParser; + + /** + * The name of the method. + * + * @var string + */ + protected $methodName; + + public function __construct(StaticReflectionParser $staticReflectionParser, $methodName) + { + $this->staticReflectionParser = $staticReflectionParser; + $this->methodName = $methodName; + } + public function getName() + { + return $this->methodName; + } + protected function getStaticReflectionParser() + { + return $this->staticReflectionParser->getStaticReflectionParserForDeclaringClass('method', $this->methodName); + } + public function getDeclaringClass() + { + return $this->getStaticReflectionParser()->getReflectionClass(); + } + public function getNamespaceName() + { + return $this->getStaticReflectionParser()->getNamespaceName(); + } + public function getDocComment() + { + return $this->getStaticReflectionParser()->getDocComment('method', $this->methodName); + } + public function getUseStatements() + { + return $this->getStaticReflectionParser()->getUseStatements(); + } + public static function export($class, $name, $return = false) { throw new ReflectionException('Method not implemented'); } + public function getClosure($object) { throw new ReflectionException('Method not implemented'); } + public function getModifiers() { throw new ReflectionException('Method not implemented'); } + public function getPrototype() { throw new ReflectionException('Method not implemented'); } + public function invoke($object, $parameter = NULL) { throw new ReflectionException('Method not implemented'); } + public function invokeArgs($object, array $args) { throw new ReflectionException('Method not implemented'); } + public function isAbstract() { throw new ReflectionException('Method not implemented'); } + public function isConstructor() { throw new ReflectionException('Method not implemented'); } + public function isDestructor() { throw new ReflectionException('Method not implemented'); } + public function isFinal() { throw new ReflectionException('Method not implemented'); } + public function isPrivate() { throw new ReflectionException('Method not implemented'); } + public function isProtected() { throw new ReflectionException('Method not implemented'); } + public function isPublic() { throw new ReflectionException('Method not implemented'); } + public function isStatic() { throw new ReflectionException('Method not implemented'); } + public function setAccessible($accessible) { throw new ReflectionException('Method not implemented'); } + public function __toString() { throw new ReflectionException('Method not implemented'); } + public function getClosureThis() { throw new ReflectionException('Method not implemented'); } + public function getEndLine() { throw new ReflectionException('Method not implemented'); } + public function getExtension() { throw new ReflectionException('Method not implemented'); } + public function getExtensionName() { throw new ReflectionException('Method not implemented'); } + public function getFileName() { throw new ReflectionException('Method not implemented'); } + public function getNumberOfParameters() { throw new ReflectionException('Method not implemented'); } + public function getNumberOfRequiredParameters() { throw new ReflectionException('Method not implemented'); } + public function getParameters() { throw new ReflectionException('Method not implemented'); } + public function getShortName() { throw new ReflectionException('Method not implemented'); } + public function getStartLine() { throw new ReflectionException('Method not implemented'); } + public function getStaticVariables() { throw new ReflectionException('Method not implemented'); } + public function inNamespace() { throw new ReflectionException('Method not implemented'); } + public function isClosure() { throw new ReflectionException('Method not implemented'); } + public function isDeprecated() { throw new ReflectionException('Method not implemented'); } + public function isInternal() { throw new ReflectionException('Method not implemented'); } + public function isUserDefined() { throw new ReflectionException('Method not implemented'); } + public function returnsReference() { throw new ReflectionException('Method not implemented'); } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionParser.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionParser.php new file mode 100644 index 0000000..7f3e41f --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionParser.php @@ -0,0 +1,282 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +use ReflectionException; +use Doctrine\Common\Annotations\TokenParser; + +/** + * Parses a file for namespaces/use/class declarations. + * + * @author Karoly Negyesi + */ +class StaticReflectionParser implements ReflectionProviderInterface +{ + + /** + * The name of the class. + * + * @var string + */ + protected $className; + + /** + * TRUE if the caller only wants class annotations. + * + * @var boolean. + */ + protected $classAnnotationOptimize; + + /** + * TRUE when the parser has ran. + * + * @var boolean + */ + protected $parsed = false; + + /** + * The namespace of the class + * + * @var string + */ + protected $namespace = ''; + + /** + * The use statements of this class. + * + * @var array + */ + protected $useStatements = array(); + + /** + * The docComment of the class. + * + * @var string + */ + protected $docComment = array( + 'class' => '', + 'property' => array(), + 'method' => array(), + ); + + /** + * The name of the class this class extends, if any. + * + * @var string + */ + protected $parentClassName = ''; + + /** + * The parent PSR-0 Parser. + * + * @var \Doctrine\Common\Annotations\StaticReflectionParser + */ + protected $parentStaticReflectionParser; + + /** + * Parses a class residing in a PSR-0 hierarchy. + * + * @param string $class + * The full, namespaced class name. + * @param ClassFinder $finder + * A ClassFinder object which finds the class. + * @param boolean $classAnnotationOptimize + * Only retrieve the class docComment. Presumes there is only one + * statement per line. + */ + public function __construct($className, $finder, $classAnnotationOptimize = false) + { + $this->className = ltrim($className, '\\'); + if ($lastNsPos = strrpos($this->className, '\\')) { + $this->namespace = substr($this->className, 0, $lastNsPos); + } + $this->finder = $finder; + $this->classAnnotationOptimize = $classAnnotationOptimize; + } + + protected function parse() + { + if ($this->parsed || !$fileName = $this->finder->findFile($this->className)) { + return; + } + $this->parsed = true; + $contents = file_get_contents($fileName); + if ($this->classAnnotationOptimize) { + if (preg_match("/(\A.*)^\s+(abstract|final)?\s+class\s+$className\s+{/sm", $contents, $matches)) { + $contents = $matches[1]; + } + } + $tokenParser = new TokenParser($contents); + $docComment = ''; + while ($token = $tokenParser->next(false)) { + if (is_array($token)) { + switch ($token[0]) { + case T_USE: + $this->useStatements = array_merge($this->useStatements, $tokenParser->parseUseStatement()); + break; + case T_DOC_COMMENT: + $docComment = $token[1]; + break; + case T_CLASS: + $this->docComment['class'] = $docComment; + $docComment = ''; + break; + case T_VAR: + case T_PRIVATE: + case T_PROTECTED: + case T_PUBLIC: + $token = $tokenParser->next(); + if ($token[0] === T_VARIABLE) { + $propertyName = substr($token[1], 1); + $this->docComment['property'][$propertyName] = $docComment; + continue 2; + } + if ($token[0] !== T_FUNCTION) { + // For example, it can be T_FINAL. + continue 2; + } + // No break. + case T_FUNCTION: + // The next string after function is the name, but + // there can be & before the function name so find the + // string. + while (($token = $tokenParser->next()) && $token[0] !== T_STRING); + $methodName = $token[1]; + $this->docComment['method'][$methodName] = $docComment; + $docComment = ''; + break; + case T_EXTENDS: + $this->parentClassName = $tokenParser->parseClass(); + $nsPos = strpos($this->parentClassName, '\\'); + $fullySpecified = false; + if ($nsPos === 0) { + $fullySpecified = true; + } else { + if ($nsPos) { + $prefix = strtolower(substr($this->parentClassName, 0, $nsPos)); + $postfix = substr($this->parentClassName, $nsPos); + } else { + $prefix = strtolower($this->parentClassName); + $postfix = ''; + } + foreach ($this->useStatements as $alias => $use) { + if ($alias == $prefix) { + $this->parentClassName = '\\' . $use . $postfix; + $fullySpecified = true; + } + } + } + if (!$fullySpecified) { + $this->parentClassName = '\\' . $this->namespace . '\\' . $this->parentClassName; + } + break; + } + } + } + } + + protected function getParentStaticReflectionParser() + { + if (empty($this->parentStaticReflectionParser)) { + $this->parentStaticReflectionParser = new static($this->parentClassName, $this->finder); + } + + return $this->parentStaticReflectionParser; + } + + public function getClassName() + { + return $this->className; + } + + public function getNamespaceName() + { + return $this->namespace; + } + + /** + * Get the ReflectionClass equivalent for this file / class. + */ + public function getReflectionClass() + { + return new StaticReflectionClass($this); + } + + /** + * Get the ReflectionMethod equivalent for the method of this file / class. + */ + public function getReflectionMethod($methodName) + { + return new StaticReflectionMethod($this, $methodName); + } + + /** + * Get the ReflectionProperty equivalent for the method of this file / class. + */ + public function getReflectionProperty($propertyName) + { + return new StaticReflectionProperty($this, $propertyName); + } + + /** + * Get the use statements from this file. + */ + public function getUseStatements() + { + $this->parse(); + + return $this->useStatements; + } + + /** + * Get docComment. + * + * @param string $type class, property or method. + * @param string $name Name of the property or method, not needed for class. + * + * @return string the doc comment or empty string if none. + */ + public function getDocComment($type = 'class', $name = '') + { + $this->parse(); + + return $name ? $this->docComment[$type][$name] : $this->docComment[$type]; + } + + /** + * Get the PSR-0 parser for the declaring class. + * + * @param string $type property or method. + * @param string $name Name of the property or method. + * + * @return StaticReflectionParser A static reflection parser for the declaring class. + */ + public function getStaticReflectionParserForDeclaringClass($type, $name) + { + $this->parse(); + if (isset($this->docComment[$type][$name])) { + return $this; + } + if (!empty($this->parentClassName)) { + return $this->getParentStaticReflectionParser()->getStaticReflectionParserForDeclaringClass($type, $name); + } + throw new ReflectionException('Invalid ' . $type . ' "' . $name . '"'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionProperty.php b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionProperty.php new file mode 100644 index 0000000..7c6411a --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionProperty.php @@ -0,0 +1,77 @@ +. + */ + +namespace Doctrine\Common\Reflection; + +use ReflectionProperty; +use ReflectionException; + +class StaticReflectionProperty extends ReflectionProperty +{ + /** + * The PSR-0 parser object. + * + * @var StaticReflectionParser + */ + protected $staticReflectionParser; + + /** + * The name of the property. + * + * @var string + */ + protected $propertyName; + + public function __construct(StaticReflectionParser $staticReflectionParser, $propertyName) + { + $this->staticReflectionParser = $staticReflectionParser; + $this->propertyName = $propertyName; + } + public function getName() + { + return $this->propertyName; + } + protected function getStaticReflectionParser() + { + return $this->staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', $this->propertyName); + } + public function getDeclaringClass() + { + return $this->getStaticReflectionParser()->getReflectionClass(); + } + public function getDocComment() + { + return $this->getStaticReflectionParser()->getDocComment('property', $this->propertyName); + } + public function getUseStatements() + { + return $this->getStaticReflectionParser()->getUseStatements(); + } + public static function export ($class, $name, $return = false) { throw new ReflectionException('Method not implemented'); } + public function getModifiers() { throw new ReflectionException('Method not implemented'); } + public function getValue($object = NULL) { throw new ReflectionException('Method not implemented'); } + public function isDefault() { throw new ReflectionException('Method not implemented'); } + public function isPrivate() { throw new ReflectionException('Method not implemented'); } + public function isProtected() { throw new ReflectionException('Method not implemented'); } + public function isPublic() { throw new ReflectionException('Method not implemented'); } + public function isStatic() { throw new ReflectionException('Method not implemented'); } + public function setAccessible ($accessible) { throw new ReflectionException('Method not implemented'); } + public function setValue ($object, $value = NULL) { throw new ReflectionException('Method not implemented'); } + public function __toString() { throw new ReflectionException('Method not implemented'); } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php new file mode 100644 index 0000000..078a8db --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php @@ -0,0 +1,103 @@ +. + */ + +namespace Doctrine\Common\Util; + +use Doctrine\Common\Persistence\Proxy; + +/** + * Class and reflection related functionality for objects that + * might or not be proxy objects at the moment. + * + * @author Benjamin Eberlei + * @author Johannes Schmitt + */ +class ClassUtils +{ + /** + * Get the real class name of a class name that could be a proxy. + * + * @param string + * @return string + */ + public static function getRealClass($class) + { + if (false === $pos = strrpos($class, '\\'.Proxy::MARKER.'\\')) { + return $class; + } + + return substr($class, $pos + Proxy::MARKER_LENGTH + 2); + } + + /** + * Get the real class name of an object (even if its a proxy) + * + * @param object + * @return string + */ + public static function getClass($object) + { + return self::getRealClass(get_class($object)); + } + + /** + * Get the real parent class name of a class or object + * + * @param string + * @return string + */ + public static function getParentClass($className) + { + return get_parent_class( self::getRealClass( $className ) ); + } + + /** + * Create a new reflection class + * + * @param string + * @return \ReflectionClass + */ + public static function newReflectionClass($class) + { + return new \ReflectionClass( self::getRealClass( $class ) ); + } + + /** + * Create a new reflection object + * + * @param object + * @return \ReflectionObject + */ + public static function newReflectionObject($object) + { + return self::newReflectionClass( self::getClass( $object ) ); + } + + /** + * Given a class name and a proxy namespace return the proxy name. + * + * @param string $className + * @param string $proxyNamespace + * @return string + */ + public static function generateProxyClassName($className, $proxyNamespace) + { + return rtrim($proxyNamespace, '\\') . '\\'.Proxy::MARKER.'\\' . ltrim($className, '\\'); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php new file mode 100644 index 0000000..458e5c8 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php @@ -0,0 +1,135 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Static class containing most used debug methods. + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Giorgio Sironi + */ +final class Debug +{ + /** + * Private constructor (prevents from instantiation) + * + */ + private function __construct() {} + + /** + * Prints a dump of the public, protected and private properties of $var. + * + * @link http://xdebug.org/ + * @param mixed $var + * @param integer $maxDepth Maximum nesting level for object properties + * @param boolean $stripTags Flag that indicate if output should strip HTML tags + */ + public static function dump($var, $maxDepth = 2, $stripTags = true) + { + ini_set('html_errors', 'On'); + + if (extension_loaded('xdebug')) { + ini_set('xdebug.var_display_max_depth', $maxDepth); + } + + $var = self::export($var, $maxDepth++); + + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + + echo ($stripTags ? strip_tags(html_entity_decode($dump)) : $dump); + + ini_set('html_errors', 'Off'); + } + + /** + * Export + * + * @param mixed $var + * @param int $maxDepth + * @return mixed + */ + public static function export($var, $maxDepth) + { + $return = null; + $isObj = is_object($var); + + if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { + $var = $var->toArray(); + } + + if ($maxDepth) { + if (is_array($var)) { + $return = array(); + + foreach ($var as $k => $v) { + $return[$k] = self::export($v, $maxDepth - 1); + } + } else if ($isObj) { + $return = new \stdclass(); + if ($var instanceof \DateTime) { + $return->__CLASS__ = "DateTime"; + $return->date = $var->format('c'); + $return->timezone = $var->getTimeZone()->getName(); + } else { + $reflClass = ClassUtils::newReflectionObject($var); + $return->__CLASS__ = ClassUtils::getClass($var); + + if ($var instanceof \Doctrine\Common\Persistence\Proxy) { + $return->__IS_PROXY__ = true; + $return->__PROXY_INITIALIZED__ = $var->__isInitialized(); + } + + foreach ($reflClass->getProperties() as $reflProperty) { + $name = $reflProperty->getName(); + + $reflProperty->setAccessible(true); + $return->$name = self::export($reflProperty->getValue($var), $maxDepth - 1); + } + } + } else { + $return = $var; + } + } else { + $return = is_object($var) ? get_class($var) + : (is_array($var) ? 'Array(' . count($var) . ')' : $var); + } + + return $return; + } + + /** + * Convert to string + * + * @param object $obj + * @return string + */ + public static function toString($obj) + { + return method_exists('__toString', $obj) ? (string) $obj : get_class($obj) . '@' . spl_object_hash($obj); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php new file mode 100644 index 0000000..214ed57 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php @@ -0,0 +1,72 @@ +. + */ + +namespace Doctrine\Common\Util; + +/** + * Doctrine inflector has static methods for inflecting text + * + * The methods in these classes are from several different sources collected + * across several different php projects and several different authors. The + * original author names and emails are not known + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 1.0 + * @version $Revision: 3189 $ + * @author Konsta Vesterinen + * @author Jonathan H. Wage + */ +class Inflector +{ + /** + * Convert word in to the format for a Doctrine table name. Converts 'ModelName' to 'model_name' + * + * @param string $word Word to tableize + * @return string $word Tableized word + */ + public static function tableize($word) + { + return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $word)); + } + + /** + * Convert a word in to the format for a Doctrine class name. Converts 'table_name' to 'TableName' + * + * @param string $word Word to classify + * @return string $word Classified word + */ + public static function classify($word) + { + return str_replace(" ", "", ucwords(strtr($word, "_-", " "))); + } + + /** + * Camelize a word. This uses the classify() method and turns the first character to lowercase + * + * @param string $word + * @return string $word + */ + public static function camelize($word) + { + return lcfirst(self::classify($word)); + } +} diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Version.php b/vendor/doctrine/common/lib/Doctrine/Common/Version.php new file mode 100644 index 0000000..cca4894 --- /dev/null +++ b/vendor/doctrine/common/lib/Doctrine/Common/Version.php @@ -0,0 +1,55 @@ +. + */ + +namespace Doctrine\Common; + +/** + * Class to store and retrieve the version of Doctrine + * + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.doctrine-project.org + * @since 2.0 + * @version $Revision$ + * @author Benjamin Eberlei + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + */ +class Version +{ + /** + * Current Doctrine Version + */ + const VERSION = '2.3.0'; + + /** + * Compares a Doctrine version with the current one. + * + * @param string $version Doctrine version to compare. + * @return int Returns -1 if older, 0 if it is the same, 1 if version + * passed as argument is newer. + */ + public static function compare($version) + { + $currentVersion = str_replace(' ', '', strtolower(self::VERSION)); + $version = str_replace(' ', '', $version); + + return version_compare($version, $currentVersion); + } +} diff --git a/vendor/doctrine/common/phpunit.xml.dist b/vendor/doctrine/common/phpunit.xml.dist new file mode 100644 index 0000000..b9d3b34 --- /dev/null +++ b/vendor/doctrine/common/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/Doctrine/ + + + + + + ./lib/Doctrine/ + + + + + + performance + + + diff --git a/vendor/doctrine/common/tests/.gitignore b/vendor/doctrine/common/tests/.gitignore new file mode 100644 index 0000000..7210405 --- /dev/null +++ b/vendor/doctrine/common/tests/.gitignore @@ -0,0 +1,3 @@ +Doctrine/Tests/Proxies/ +Doctrine/Tests/ORM/Proxy/generated/ +Doctrine/Tests/ORM/Tools/Export/export diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php new file mode 100644 index 0000000..4261e6b --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AbstractReaderTest.php @@ -0,0 +1,517 @@ + array($testsRoot), + ); + $staticReflectionParser = new StaticReflectionParser($className, new Psr0FindFile($paths)); + return array( + 'native' => array(new ReflectionClass($className)), + 'static' => array($staticReflectionParser->getReflectionClass()), + ); + } + + /** + * @dataProvider getReflectionClass + */ + public function testAnnotations($class) + { + $reader = $this->getReader(); + $this->assertEquals(1, count($reader->getClassAnnotations($class))); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyAnnotation', $annot = $reader->getClassAnnotation($class, $annotName)); + $this->assertEquals("hello", $annot->dummyValue); + + $field1Prop = $class->getProperty('field1'); + $propAnnots = $reader->getPropertyAnnotations($field1Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getPropertyAnnotation($field1Prop, $annotName)); + $this->assertEquals("fieldHello", $annot->dummyValue); + + $getField1Method = $class->getMethod('getField1'); + $methodAnnots = $reader->getMethodAnnotations($getField1Method); + $this->assertEquals(1, count($methodAnnots)); + $this->assertInstanceOf($annotName, $annot = $reader->getMethodAnnotation($getField1Method, $annotName)); + $this->assertEquals(array(1, 2, "three"), $annot->value); + + $field2Prop = $class->getProperty('field2'); + $propAnnots = $reader->getPropertyAnnotations($field2Prop); + $this->assertEquals(1, count($propAnnots)); + $this->assertInstanceOf($annotName = 'Doctrine\Tests\Common\Annotations\DummyJoinTable', $joinTableAnnot = $reader->getPropertyAnnotation($field2Prop, $annotName)); + $this->assertEquals(1, count($joinTableAnnot->joinColumns)); + $this->assertEquals(1, count($joinTableAnnot->inverseJoinColumns)); + $this->assertTrue($joinTableAnnot->joinColumns[0] instanceof DummyJoinColumn); + $this->assertTrue($joinTableAnnot->inverseJoinColumns[0] instanceof DummyJoinColumn); + $this->assertEquals('col1', $joinTableAnnot->joinColumns[0]->name); + $this->assertEquals('col2', $joinTableAnnot->joinColumns[0]->referencedColumnName); + $this->assertEquals('col3', $joinTableAnnot->inverseJoinColumns[0]->name); + $this->assertEquals('col4', $joinTableAnnot->inverseJoinColumns[0]->referencedColumnName); + + $dummyAnnot = $reader->getMethodAnnotation($class->getMethod('getField1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('', $dummyAnnot->dummyValue); + $this->assertEquals(array(1, 2, 'three'), $dummyAnnot->value); + + $dummyAnnot = $reader->getPropertyAnnotation($class->getProperty('field1'), 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('fieldHello', $dummyAnnot->dummyValue); + + $classAnnot = $reader->getClassAnnotation($class, 'Doctrine\Tests\Common\Annotations\DummyAnnotation'); + $this->assertEquals('hello', $classAnnot->dummyValue); + } + + public function testAnnotationsWithValidTargets() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + $this->assertEquals(1,count($reader->getClassAnnotations($class))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($reader->getMethodAnnotations($class->getMethod('someFunction')))); + $this->assertEquals(1,count($reader->getPropertyAnnotations($class->getProperty('nested')))); + } + + public function testAnnotationsWithVarType() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $this->assertEquals(1,count($fooAnnot = $reader->getPropertyAnnotations($class->getProperty('foo')))); + $this->assertEquals(1,count($barAnnot = $reader->getMethodAnnotations($class->getMethod('bar')))); + + $this->assertInternalType('string', $fooAnnot[0]->string); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', $barAnnot[0]->annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetPropertyMethod is not allowed to be declared on class Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass. You may only use this annotation on these code elements: METHOD, PROPERTY + */ + public function testClassWithInvalidAnnotationTargetAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$foo. You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetAnnotation is not allowed to be declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty::$bar. You may only use this annotation on these code elements: ANNOTATION + */ + public function testClassWithInvalidNestedAnnotationTargetAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty', 'bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Annotation @AnnotationTargetClass is not allowed to be declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod::functionName(). You may only use this annotation on these code elements: CLASS + */ + public function testClassWithInvalidAnnotationTargetAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod', 'functionName')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtClassDocBlock() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtPropertyDocBlock() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testClassWithAnnotationWithTargetSyntaxErrorAtMethodDocBlock() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithTargetSyntaxError','bar')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "string" of @AnnotationWithVarType declared on property Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::$invalidProperty expects a(n) string, but got integer. + */ + public function testClassWithPropertyInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getPropertyAnnotations($class->getProperty('invalidProperty')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Type Error] Attribute "annotation" of @AnnotationWithVarType declared on method Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType::invalidMethod() expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll, but got an instance of Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. + */ + public function testClassWithMethodInvalidVarTypeError() + { + $reader = $this->getReader(); + $class = new ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithAnnotationWithVarType'); + + $reader->getMethodAnnotations($class->getMethod('invalidMethod')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in class Doctrine\Tests\Common\Annotations\DummyClassSyntaxError. + */ + public function testClassSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getClassAnnotations(new \ReflectionClass('Doctrine\Tests\Common\Annotations\DummyClassSyntaxError')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in method Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError::foo(). + */ + public function testMethodSyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getMethodAnnotations(new \ReflectionMethod('Doctrine\Tests\Common\Annotations\DummyClassMethodSyntaxError', 'foo')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 18 in property Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError::$foo. + */ + public function testPropertySyntaxErrorContext() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassPropertySyntaxError', 'foo')); + } + + /** + * @group regression + */ + public function testMultipleAnnotationsOnSameLine() + { + $reader = $this->getReader(); + $annots = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClass2', 'id')); + $this->assertEquals(3, count($annots)); + } + + public function testNonAnnotationProblem() + { + $reader = $this->getReader(); + + $this->assertNotNull($annot = $reader->getPropertyAnnotation(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\DummyClassNonAnnotationProblem', 'foo'), $name = 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + $this->assertInstanceOf($name, $annot); + } + + public function testImportWithConcreteAnnotation() + { + $reader = $this->getReader(); + $property = new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestImportWithConcreteAnnotation', 'field'); + $annotations = $reader->getPropertyAnnotations($property); + $this->assertEquals(1, count($annotations)); + $this->assertNotNull($reader->getPropertyAnnotation($property, 'Doctrine\Tests\Common\Annotations\DummyAnnotation')); + } + + public function testImportWithInheritance() + { + $reader = $this->getReader(); + + $class = new TestParentClass(); + $ref = new \ReflectionClass($class); + + $childAnnotations = $reader->getPropertyAnnotations($ref->getProperty('child')); + $this->assertEquals(1, count($childAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Foo\Name', reset($childAnnotations)); + + $parentAnnotations = $reader->getPropertyAnnotations($ref->getProperty('parent')); + $this->assertEquals(1, count($parentAnnotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Bar\Name', reset($parentAnnotations)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@NameFoo" in property Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass::$field was never imported. + */ + public function testImportDetectsNotImportedAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestAnnotationNotImportedClass', 'field')); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation "@Foo\Bar\Name" in property Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass::$field was never imported. + */ + public function testImportDetectsNonExistentAnnotation() + { + $reader = $this->getReader(); + $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestNonExistentAnnotationClass', 'field')); + } + + public function testTopLevelAnnotation() + { + $reader = $this->getReader(); + $annotations = $reader->getPropertyAnnotations(new \ReflectionProperty('Doctrine\Tests\Common\Annotations\TestTopLevelAnnotationClass', 'field')); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('\TopLevelAnnotation', reset($annotations)); + } + + public function testIgnoresAnnotationsNotPrefixedWithWhitespace() + { + $reader = $this->getReader(); + + $annotation = $reader->getClassAnnotation(new \ReflectionClass(new TestIgnoresNonAnnotationsClass()), 'Doctrine\Tests\Common\Annotations\Name'); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Name', $annotation); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The class "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "Doctrine\Tests\Common\Annotations\Fixtures\NoAnnotation". If it is indeed no annotation, then you need to add @IgnoreAnnotation("NoAnnotation") to the _class_ doc comment of class Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass. + */ + public function testErrorWhenInvalidAnnotationIsUsed() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageClass'); + $reader->getClassAnnotations($ref); + } + + public function testInvalidAnnotationUsageButIgnoredClass() + { + $reader = $this->getReader(); + $ref = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\InvalidAnnotationUsageButIgnoredClass'); + $annots = $reader->getClassAnnotations($ref); + + $this->assertEquals(2, count($annots)); + } + + /** + * @group DDC-1660 + * @group regression + */ + public function testInvalidAnnotationButIgnored() + { + $reader = $this->getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(0, $reader->getClassAnnotations($class)); + $this->assertCount(0, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(0, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + abstract protected function getReader(); +} + +/** + * @parseAnnotation("var") + * @author Johannes M. Schmitt + * + */ +class TestParseAnnotationClass +{ + /** + * @var + */ + private $field; +} + +/** + * @Name + * @author Johannes M. Schmitt + */ +class TestIgnoresNonAnnotationsClass +{ +} + +class TestTopLevelAnnotationClass +{ + /** + * @\TopLevelAnnotation + */ + private $field; +} + +class TestNonExistentAnnotationClass +{ + /** + * @Foo\Bar\Name + */ + private $field; +} + +class TestAnnotationNotImportedClass +{ + /** + * @NameFoo + */ + private $field; +} + +class TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Foo\Name(name = "foo") + */ + protected $child; +} + +class TestParentClass extends TestChildClass +{ + /** + * @\Doctrine\Tests\Common\Annotations\Bar\Name(name = "bar") + */ + private $parent; +} + +class TestImportWithConcreteAnnotation +{ + /** + * @DummyAnnotation(dummyValue = "bar") + */ + private $field; +} + +/** + * @ignoreAnnotation("var") + */ +class DummyClass2 { + /** + * @DummyId @DummyColumn(type="integer") @DummyGeneratedValue + * @var integer + */ + private $id; +} + +/** @Annotation */ +class DummyId extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyColumn extends \Doctrine\Common\Annotations\Annotation { + public $type; +} +/** @Annotation */ +class DummyGeneratedValue extends \Doctrine\Common\Annotations\Annotation {} +/** @Annotation */ +class DummyAnnotation extends \Doctrine\Common\Annotations\Annotation { + public $dummyValue; +} +/** @Annotation */ +class DummyJoinColumn extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $referencedColumnName; +} +/** @Annotation */ +class DummyJoinTable extends \Doctrine\Common\Annotations\Annotation { + public $name; + public $joinColumns; + public $inverseJoinColumns; +} + +/** + * @DummyAnnotation(@) + */ +class DummyClassSyntaxError +{ + +} + +class DummyClassMethodSyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public function foo() + { + + } +} + +class DummyClassPropertySyntaxError +{ + /** + * @DummyAnnotation(@) + */ + public $foo; +} + +/** + * @ignoreAnnotation({"since", "var"}) + */ +class DummyClassNonAnnotationProblem +{ + /** + * @DummyAnnotation + * + * @var \Test + * @since 0.1 + */ + public $foo; +} + + +/** +* @DummyAnnotation Foo bar +*/ +class DummyClassWithEmail +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Foo; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} + +namespace Doctrine\Tests\Common\Annotations\Bar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation +{ + public $name; +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php new file mode 100644 index 0000000..d2cc667 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/AnnotationReaderTest.php @@ -0,0 +1,13 @@ +getMock('Doctrine\Common\Cache\Cache'); + $cache + ->expects($this->at(0)) + ->method('fetch') + ->with($this->equalTo($cacheKey)) + ->will($this->returnValue(array())) + ; + $cache + ->expects($this->at(1)) + ->method('fetch') + ->with($this->equalTo('[C]'.$cacheKey)) + ->will($this->returnValue(time() - 10)) + ; + $cache + ->expects($this->at(2)) + ->method('save') + ->with($this->equalTo($cacheKey)) + ; + $cache + ->expects($this->at(3)) + ->method('save') + ->with($this->equalTo('[C]'.$cacheKey)) + ; + + $reader = new CachedReader(new AnnotationReader(), $cache, true); + $route = new Route(); + $route->pattern = '/someprefix'; + $this->assertEquals(array($route), $reader->getClassAnnotations(new \ReflectionClass($name))); + } + + protected function getReader() + { + $this->cache = new ArrayCache(); + return new CachedReader(new AnnotationReader(), $this->cache); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php new file mode 100644 index 0000000..03a55c8 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocLexerTest.php @@ -0,0 +1,137 @@ +setInput("@Name"); + $this->assertNull($lexer->token); + $this->assertNull($lexer->lookahead); + + $this->assertTrue($lexer->moveNext()); + $this->assertNull($lexer->token); + $this->assertEquals('@', $lexer->lookahead['value']); + + $this->assertTrue($lexer->moveNext()); + $this->assertEquals('@', $lexer->token['value']); + $this->assertEquals('Name', $lexer->lookahead['value']); + + $this->assertFalse($lexer->moveNext()); + } + + public function testScannerTokenizesDocBlockWhitConstants() + { + $lexer = new DocLexer(); + $docblock = '@AnnotationWithConstants(PHP_EOL, ClassWithConstants::SOME_VALUE, \Doctrine\Tests\Common\Annotations\Fixtures\IntefaceWithConstants::SOME_VALUE)'; + + $tokens = array ( + array( + 'value' => '@', + 'position' => 0, + 'type' => DocLexer::T_AT, + ), + array( + 'value' => 'AnnotationWithConstants', + 'position' => 1, + 'type' => DocLexer::T_IDENTIFIER, + ), + array( + 'value' => '(', + 'position' => 24, + 'type' => DocLexer::T_OPEN_PARENTHESIS, + ), + array( + 'value' => 'PHP_EOL', + 'position' => 25, + 'type' => DocLexer::T_IDENTIFIER, + ), + array( + 'value' => ',', + 'position' => 32, + 'type' => DocLexer::T_COMMA, + ), + array( + 'value' => 'ClassWithConstants::SOME_VALUE', + 'position' => 34, + 'type' => DocLexer::T_IDENTIFIER, + ), + array( + 'value' => ',', + 'position' => 64, + 'type' => DocLexer::T_COMMA, + ), + array( + 'value' => '\\Doctrine\\Tests\\Common\\Annotations\\Fixtures\\IntefaceWithConstants::SOME_VALUE', + 'position' => 66, + 'type' => DocLexer::T_IDENTIFIER, + ), + array( + 'value' => ')', + 'position' => 143, + 'type' => DocLexer::T_CLOSE_PARENTHESIS, + ) + + ); + + $lexer->setInput($docblock); + + foreach ($tokens as $expected) { + $lexer->moveNext(); + $lookahead = $lexer->lookahead; + $this->assertEquals($expected['value'], $lookahead['value']); + $this->assertEquals($expected['type'], $lookahead['type']); + $this->assertEquals($expected['position'], $lookahead['position']); + } + + $this->assertFalse($lexer->moveNext()); + } + + + public function testScannerTokenizesDocBlockWhitInvalidIdentifier() + { + $lexer = new DocLexer(); + $docblock = '@Foo\3.42'; + + $tokens = array ( + array( + 'value' => '@', + 'position' => 0, + 'type' => DocLexer::T_AT, + ), + array( + 'value' => 'Foo', + 'position' => 1, + 'type' => DocLexer::T_IDENTIFIER, + ), + array( + 'value' => '\\', + 'position' => 4, + 'type' => DocLexer::T_NAMESPACE_SEPARATOR, + ), + array( + 'value' => 3.42, + 'position' => 5, + 'type' => DocLexer::T_FLOAT, + ) + ); + + $lexer->setInput($docblock); + + foreach ($tokens as $expected) { + $lexer->moveNext(); + $lookahead = $lexer->lookahead; + $this->assertEquals($expected['value'], $lookahead['value']); + $this->assertEquals($expected['type'], $lookahead['type']); + $this->assertEquals($expected['position'], $lookahead['position']); + } + + $this->assertFalse($lexer->moveNext()); + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php new file mode 100644 index 0000000..b14698f --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DocParserTest.php @@ -0,0 +1,1208 @@ +createTestParser(); + + // Nested arrays with nested annotations + $result = $parser->parse('@Name(foo={1,2, {"key"=@Name}})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertEquals(3, count($annot->foo)); + $this->assertEquals(1, $annot->foo[0]); + $this->assertEquals(2, $annot->foo[1]); + $this->assertTrue(is_array($annot->foo[2])); + + $nestedArray = $annot->foo[2]; + $this->assertTrue(isset($nestedArray['key'])); + $this->assertTrue($nestedArray['key'] instanceof Name); + } + + public function testBasicAnnotations() + { + $parser = $this->createTestParser(); + + // Marker annotation + $result = $parser->parse("@Name"); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertNull($annot->value); + $this->assertNull($annot->foo); + + // Associative arrays + $result = $parser->parse('@Name(foo={"key1" = "value1"})'); + $annot = $result[0]; + $this->assertNull($annot->value); + $this->assertTrue(is_array($annot->foo)); + $this->assertTrue(isset($annot->foo['key1'])); + + // Numerical arrays + $result = $parser->parse('@Name({2="foo", 4="bar"})'); + $annot = $result[0]; + $this->assertTrue(is_array($annot->value)); + $this->assertEquals('foo', $annot->value[2]); + $this->assertEquals('bar', $annot->value[4]); + $this->assertFalse(isset($annot->value[0])); + $this->assertFalse(isset($annot->value[1])); + $this->assertFalse(isset($annot->value[3])); + + // Multiple values + $result = $parser->parse('@Name(@Name, @Name)'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue($annot->value[1] instanceof Name); + + // Multiple types as values + $result = $parser->parse('@Name(foo="Bar", @Name, {"key1"="value1", "key2"="value2"})'); + $annot = $result[0]; + + $this->assertTrue($annot instanceof Name); + $this->assertTrue(is_array($annot->value)); + $this->assertTrue($annot->value[0] instanceof Name); + $this->assertTrue(is_array($annot->value[1])); + $this->assertEquals('value1', $annot->value[1]['key1']); + $this->assertEquals('value2', $annot->value[1]['key2']); + + // Complete docblock + $docblock = <<parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $this->assertNull($annot->value); + } + + public function testNamespacedAnnotations() + { + $parser = new DocParser; + $parser->setIgnoreNotImportedAnnotations(true); + + $docblock = << + * @Doctrine\Tests\Common\Annotations\Name(foo="bar") + * @ignore + */ +DOCBLOCK; + + $result = $parser->parse($docblock); + $this->assertEquals(1, count($result)); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + } + + /** + * @group debug + */ + public function testTypicalMethodDocBlock() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + $this->assertEquals(2, count($result)); + $this->assertTrue(isset($result[0])); + $this->assertTrue(isset($result[1])); + $annot = $result[0]; + $this->assertTrue($annot instanceof Name); + $this->assertEquals("bar", $annot->foo); + $marker = $result[1]; + $this->assertTrue($marker instanceof Marker); + } + + + public function testAnnotationWithoutConstructor() + { + $parser = $this->createTestParser(); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertNull($annot->name); + $this->assertNotNull($annot->data); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertNotNull($annot); + $this->assertTrue($annot instanceof SomeAnnotationClassNameWithoutConstructor); + + $this->assertEquals($annot->name, "Some Name"); + $this->assertEquals($annot->data, "Some data"); + + + + +$docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertNull($annot->data); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->data, "Some data"); + $this->assertNull($annot->name); + + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $annot = $result[0]; + + $this->assertEquals($annot->name, "Some name"); + $this->assertEquals($annot->data, "Some data"); + + $docblock = <<parse($docblock); + $this->assertEquals(count($result), 1); + $this->assertTrue($result[0] instanceof SomeAnnotationClassNameWithoutConstructorAndProperties); + } + + public function testAnnotationTarget() + { + + $parser = new DocParser; + $parser->setImports(array( + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + )); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithValidAnnotationTarget'); + + + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $this->assertNotNull($parser->parse($docComment,$context)); + + + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $this->assertNotNull($parser->parse($docComment,$context)); + + + + $method = $class->getMethod('someFunction'); + $docComment = $property->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $this->assertNotNull($parser->parse($docComment,$context)); + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtClass'); + $context = 'class ' . $class->getName(); + $docComment = $class->getDocComment(); + + $parser->setTarget(Target::TARGET_CLASS); + $parser->parse($class->getDocComment(),$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtMethod'); + $method = $class->getMethod('functionName'); + $docComment = $method->getDocComment(); + $context = 'method ' . $class->getName() . '::' . $method->getName() . '()'; + + $parser->setTarget(Target::TARGET_METHOD); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + + try { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassWithInvalidAnnotationTargetAtProperty'); + $property = $class->getProperty('foo'); + $docComment = $property->getDocComment(); + $context = 'property ' . $class->getName() . "::\$" . $property->getName(); + + $parser->setTarget(Target::TARGET_PROPERTY); + $parser->parse($docComment,$context); + + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertNotNull($exc->getMessage()); + } + + } + + public function getAnnotationVarTypeProviderValid() + { + //({attribute name}, {attribute value}) + return array( + // mixed type + array('mixed', '"String Value"'), + array('mixed', 'true'), + array('mixed', 'false'), + array('mixed', '1'), + array('mixed', '1.2'), + array('mixed', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + + // boolean type + array('boolean', 'true'), + array('boolean', 'false'), + + // alias for internal type boolean + array('bool', 'true'), + array('bool', 'false'), + + // integer type + array('integer', '0'), + array('integer', '1'), + array('integer', '123456789'), + array('integer', '9223372036854775807'), + + // alias for internal type double + array('float', '0.1'), + array('float', '1.2'), + array('float', '123.456'), + + // string type + array('string', '"String Value"'), + array('string', '"true"'), + array('string', '"123"'), + + // array type + array('array', '{@AnnotationExtendsAnnotationTargetAll}'), + array('array', '{@AnnotationExtendsAnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll}'), + + array('arrayOfIntegers', '1'), + array('arrayOfIntegers', '{1}'), + array('arrayOfIntegers', '{1,2,3,4}'), + array('arrayOfAnnotations', '@AnnotationExtendsAnnotationTargetAll'), + array('arrayOfAnnotations', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + array('arrayOfAnnotations', '{@AnnotationExtendsAnnotationTargetAll, @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll}'), + + // annotation instance + array('annotation', '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll'), + array('annotation', '@AnnotationExtendsAnnotationTargetAll'), + ); + } + + public function getAnnotationVarTypeProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + // boolean type + array('boolean','boolean','1','integer'), + array('boolean','boolean','1.2','double'), + array('boolean','boolean','"str"','string'), + array('boolean','boolean','{1,2,3}','array'), + array('boolean','boolean','@Name', 'an instance of Doctrine\Tests\Common\Annotations\Name'), + + // alias for internal type boolean + array('bool','bool', '1','integer'), + array('bool','bool', '1.2','double'), + array('bool','bool', '"str"','string'), + array('bool','bool', '{"str"}','array'), + + // integer type + array('integer','integer', 'true','boolean'), + array('integer','integer', 'false','boolean'), + array('integer','integer', '1.2','double'), + array('integer','integer', '"str"','string'), + array('integer','integer', '{"str"}','array'), + array('integer','integer', '{1,2,3,4}','array'), + + // alias for internal type double + array('float','float', 'true','boolean'), + array('float','float', 'false','boolean'), + array('float','float', '123','integer'), + array('float','float', '"str"','string'), + array('float','float', '{"str"}','array'), + array('float','float', '{12.34}','array'), + array('float','float', '{1,2,3}','array'), + + // string type + array('string','string', 'true','boolean'), + array('string','string', 'false','boolean'), + array('string','string', '12','integer'), + array('string','string', '1.2','double'), + array('string','string', '{"str"}','array'), + array('string','string', '{1,2,3,4}','array'), + + // annotation instance + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '12','integer'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '1.2','double'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{"str"}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{1,2,3,4}','array'), + array('annotation','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '@Name','an instance of Doctrine\Tests\Common\Annotations\Name'), + ); + } + + public function getAnnotationVarTypeArrayProviderInvalid() + { + //({attribute name}, {type declared type}, {attribute value} , {given type or class}) + return array( + array('arrayOfIntegers','integer', 'true','boolean'), + array('arrayOfIntegers','integer', 'false','boolean'), + array('arrayOfIntegers','integer', '{true,true}','boolean'), + array('arrayOfIntegers','integer', '{1,true}','boolean'), + array('arrayOfIntegers','integer', '{1,2,1.2}','double'), + array('arrayOfIntegers','integer', '{1,2,"str"}','string'), + + + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'true','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', 'false','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,true}','boolean'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,1.2}','double'), + array('arrayOfAnnotations','Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll', '{@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll,@AnnotationExtendsAnnotationTargetAll,"str"}','string'), + ); + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithVarType($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType', $result[0]); + $this->assertNotNull($result[0]->$attribute); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithVarTypeError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithVarType declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + /** + * @dataProvider getAnnotationVarTypeProviderValid + */ + public function testAnnotationWithAttributes($attribute, $value) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::$invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + $result = $parser->parse($docblock, $context); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes', $result[0]); + $getter = "get".ucfirst($attribute); + $this->assertNotNull($result[0]->$getter()); + } + + /** + * @dataProvider getAnnotationVarTypeProviderInvalid + */ + public function testAnnotationWithAttributesError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects a(n) $type, but got $given.", $exc->getMessage()); + } + } + + + /** + * @dataProvider getAnnotationVarTypeArrayProviderInvalid + */ + public function testAnnotationWithAttributesWithVarTypeArrayError($attribute,$type,$value,$given) + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $docblock = sprintf('@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes(%s = %s)',$attribute, $value); + $parser->setTarget(Target::TARGET_PROPERTY); + + try { + $parser->parse($docblock, $context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains("[Type Error] Attribute \"$attribute\" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithAttributes declared on property SomeClassName::invalidProperty. expects either a(n) $type, or an array of {$type}s, but got $given.", $exc->getMessage()); + } + } + + public function testAnnotationWithRequiredAttributes() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes', $result[0]); + $this->assertEquals("Some Value",$result[0]->getValue()); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->getAnnot()); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributes declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function testAnnotationWithRequiredAttributesWithoutContructor() + { + $parser = $this->createTestParser(); + $context = 'property SomeClassName::invalidProperty.'; + $parser->setTarget(Target::TARGET_PROPERTY); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value", annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + $result = $parser->parse($docblock); + + $this->assertTrue(sizeof($result) === 1); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor', $result[0]); + $this->assertEquals("Some Value", $result[0]->value); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation', $result[0]->annot); + + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor("Some Value")'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "annot" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation. This value should not be null.', $exc->getMessage()); + } + + $docblock = '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor(annot = @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation)'; + try { + $result = $parser->parse($docblock,$context); + $this->fail(); + } catch (\Doctrine\Common\Annotations\AnnotationException $exc) { + $this->assertContains('Attribute "value" of @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithRequiredAttributesWithoutContructor declared on property SomeClassName::invalidProperty. expects a(n) string. This value should not be null.', $exc->getMessage()); + } + + } + + public function getConstantsProvider() + { + $provider[] = array( + '@AnnotationWithConstants(PHP_EOL)', + PHP_EOL + ); + $provider[] = array( + '@AnnotationWithConstants(AnnotationWithConstants::INTEGER)', + AnnotationWithConstants::INTEGER + ); + $provider[] = array( + '@Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithConstants(AnnotationWithConstants::STRING)', + AnnotationWithConstants::STRING + ); + $provider[] = array( + '@AnnotationWithConstants(Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithConstants::FLOAT)', + AnnotationWithConstants::FLOAT + ); + $provider[] = array( + '@AnnotationWithConstants(ClassWithConstants::SOME_VALUE)', + ClassWithConstants::SOME_VALUE + ); + $provider[] = array( + '@AnnotationWithConstants(Doctrine\Tests\Common\Annotations\Fixtures\ClassWithConstants::SOME_VALUE)', + ClassWithConstants::SOME_VALUE + ); + $provider[] = array( + '@AnnotationWithConstants(IntefaceWithConstants::SOME_VALUE)', + IntefaceWithConstants::SOME_VALUE + ); + $provider[] = array( + '@AnnotationWithConstants(\Doctrine\Tests\Common\Annotations\Fixtures\IntefaceWithConstants::SOME_VALUE)', + IntefaceWithConstants::SOME_VALUE + ); + $provider[] = array( + '@AnnotationWithConstants({AnnotationWithConstants::STRING, AnnotationWithConstants::INTEGER, AnnotationWithConstants::FLOAT})', + array(AnnotationWithConstants::STRING, AnnotationWithConstants::INTEGER, AnnotationWithConstants::FLOAT) + ); + $provider[] = array( + '@AnnotationWithConstants({ + AnnotationWithConstants::STRING = AnnotationWithConstants::INTEGER + })', + array(AnnotationWithConstants::STRING => AnnotationWithConstants::INTEGER) + ); + $provider[] = array( + '@AnnotationWithConstants({ + Doctrine\Tests\Common\Annotations\Fixtures\IntefaceWithConstants::SOME_KEY = AnnotationWithConstants::INTEGER + })', + array(IntefaceWithConstants::SOME_KEY => AnnotationWithConstants::INTEGER) + ); + $provider[] = array( + '@AnnotationWithConstants({ + \Doctrine\Tests\Common\Annotations\Fixtures\IntefaceWithConstants::SOME_KEY = AnnotationWithConstants::INTEGER + })', + array(IntefaceWithConstants::SOME_KEY => AnnotationWithConstants::INTEGER) + ); + $provider[] = array( + '@AnnotationWithConstants({ + AnnotationWithConstants::STRING = AnnotationWithConstants::INTEGER, + ClassWithConstants::SOME_KEY = ClassWithConstants::SOME_VALUE, + Doctrine\Tests\Common\Annotations\Fixtures\ClassWithConstants::SOME_KEY = IntefaceWithConstants::SOME_VALUE + })', + array( + AnnotationWithConstants::STRING => AnnotationWithConstants::INTEGER, + ClassWithConstants::SOME_KEY => ClassWithConstants::SOME_VALUE, + ClassWithConstants::SOME_KEY => IntefaceWithConstants::SOME_VALUE + ) + ); + return $provider; + } + + /** + * @dataProvider getConstantsProvider + */ + public function testSupportClassConstants($docblock, $expected) + { + $parser = $this->createTestParser(); + $parser->setImports(array( + 'classwithconstants' => 'Doctrine\Tests\Common\Annotations\Fixtures\ClassWithConstants', + 'intefacewithconstants' => 'Doctrine\Tests\Common\Annotations\Fixtures\IntefaceWithConstants', + 'annotationwithconstants' => 'Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithConstants' + )); + + $result = $parser->parse($docblock); + $this->assertInstanceOf('\Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithConstants', $annotation = $result[0]); + $this->assertEquals($expected, $annotation->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenIsNotDefaultValue() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage The annotation @SomeAnnotationClassNameWithoutConstructorAndProperties declared on does not accept any values, but got {"value":"Foo"}. + */ + public function testWithoutConstructorWhenHasNoProperties() + { + $parser = $this->createTestParser(); + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected namespace separator or identifier, got ')' at position 24 in class @Doctrine\Tests\Common\Annotations\Fixtures\AnnotationWithTargetSyntaxError. + */ + public function testAnnotationTargetSyntaxError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid Target "Foo". Available targets: [ALL, CLASS, METHOD, PROPERTY, ANNOTATION] + */ + public function testAnnotationWithInvalidTargetDeclarationError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage @Target expects either a string value, or an array of strings, "NULL" given. + */ + public function testAnnotationWithTargetEmptyError() + { + $parser = $this->createTestParser(); + $context = 'class ' . 'SomeClassName'; + $docblock = <<setTarget(Target::TARGET_CLASS); + $parser->parse($docblock,$context); + } + + /** + * @group DDC-575 + */ + public function testRegressionDDC575() + { + $parser = $this->createTestParser(); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + + $docblock = <<parse($docblock); + + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Name", $result[0]); + } + + /** + * @group DDC-77 + */ + public function testAnnotationWithoutClassIsIgnoredWithoutWarning() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $result = $parser->parse("@param"); + + $this->assertEquals(0, count($result)); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10. + */ + public function testAnnotationDontAcceptSingleQuotes() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')"); + } + + /** + * @group DCOM-41 + */ + public function testAnnotationDoesntThrowExceptionWhenAtSignIsNotFollowedByIdentifier() + { + $parser = new DocParser(); + $result = $parser->parse("'@'"); + + $this->assertEquals(0, count($result)); + } + + /** + * @group DCOM-41 + * @expectedException Doctrine\Common\Annotations\AnnotationException + */ + public function testAnnotationThrowsExceptionWhenAtSignIsNotFollowedByIdentifierInNestedAnnotation() + { + $parser = new DocParser(); + $result = $parser->parse("@Doctrine\Tests\Common\Annotations\Name(@')"); + } + + /** + * @group DCOM-56 + */ + public function testAutoloadAnnotation() + { + $this->assertFalse(class_exists('Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload', false), 'Pre-condition: Doctrine\Tests\Common\Annotations\Fixture\Annotation\Autoload not allowed to be loaded.'); + + $parser = new DocParser(); + + AnnotationRegistry::registerAutoloadNamespace('Doctrine\Tests\Common\Annotations\Fixtures\Annotation', __DIR__ . '/../../../../'); + + $parser->setImports(array( + 'autoload' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', + )); + $annotations = $parser->parse('@Autoload'); + + $this->assertEquals(1, count($annotations)); + $this->assertInstanceOf('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Autoload', $annotations[0]); + } + + public function createTestParser() + { + $parser = new DocParser(); + $parser->setIgnoreNotImportedAnnotations(true); + $parser->setImports(array( + 'name' => 'Doctrine\Tests\Common\Annotations\Name', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations', + )); + + return $parser; + } + + /** + * @group DDC-78 + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage Expected PlainValue, got ''' at position 10 in class \Doctrine\Tests\Common\Annotations\Name + */ + public function testSyntaxErrorWithContextDescription() + { + $parser = $this->createTestParser(); + $parser->parse("@Name(foo='bar')", "class \Doctrine\Tests\Common\Annotations\Name"); + } + + /** + * @group DDC-183 + */ + public function testSyntaxErrorWithUnknownCharacters() + { + $docblock = <<setInput(trim($docblock, '/ *')); + //var_dump($lexer); + + try { + $parser = $this->createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-14 + */ + public function testIgnorePHPDocThrowTag() + { + $docblock = <<createTestParser(); + $result = $parser->parse($docblock); + } catch (Exception $e) { + $this->fail($e->getMessage()); + } + } + + /** + * @group DCOM-38 + */ + public function testCastInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeInt() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234)"); + $annot = $result[0]; + $this->assertInternalType('int', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + } + + /** + * @group DCOM-38 + */ + public function testCastNegativeFloat() + { + $parser = $this->createTestParser(); + + $result = $parser->parse("@Name(foo=-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->foo); + + $result = $parser->parse("@Marker(-1234.345)"); + $annot = $result[0]; + $this->assertInternalType('float', $annot->value); + } + + public function testReservedKeywordsInAnnotations() + { + $parser = $this->createTestParser(); + + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Doctrine\Tests\Common\Annotations\Null'); + $this->assertTrue($result[0] instanceof Null); + + $result = $parser->parse('@True'); + $this->assertTrue($result[0] instanceof True); + $result = $parser->parse('@False'); + $this->assertTrue($result[0] instanceof False); + $result = $parser->parse('@Null'); + $this->assertTrue($result[0] instanceof Null); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Creation Error] The annotation @SomeAnnotationClassNameWithoutConstructor declared on some class does not have a property named "invalidaProperty". Available properties: data, name + */ + public function testSetValuesExeption() + { + $docblock = <<createTestParser()->parse($docblock, 'some class'); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Syntax Error] Expected Doctrine\Common\Annotations\DocLexer::T_IDENTIFIER or Doctrine\Common\Annotations\DocLexer::T_TRUE or Doctrine\Common\Annotations\DocLexer::T_FALSE or Doctrine\Common\Annotations\DocLexer::T_NULL, got '3.42' at position 5. + */ + public function testInvalidIdentifierInAnnotation() + { + $parser = $this->createTestParser(); + $parser->parse('@Foo\3.42'); + } + + public function testTrailingCommaIsAllowed() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({ + "Foo", + "Bar", + })'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('Foo', 'Bar'), $annots[0]->value); + } + + public function testDefaultAnnotationValueIsNotOverwritten() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Doctrine\Tests\Common\Annotations\Fixtures\Annotation\AnnotWithDefaultValue'); + $this->assertEquals(1, count($annots)); + $this->assertEquals('bar', $annots[0]->foo); + } + + public function testArrayWithColon() + { + $parser = $this->createTestParser(); + + $annots = $parser->parse('@Name({"foo": "bar"})'); + $this->assertEquals(1, count($annots)); + $this->assertEquals(array('foo' => 'bar'), $annots[0]->value); + } + + /** + * @expectedException Doctrine\Common\Annotations\AnnotationException + * @expectedExceptionMessage [Semantical Error] Couldn't find constant foo. + */ + public function testInvalidContantName() + { + $parser = $this->createTestParser(); + $parser->parse('@Name(foo: "bar")'); + } +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructor +{ + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationWithConstructorWithoutParams +{ + function __construct() + { + $this->data = "Some data"; + } + public $data; + public $name; +} + +/** @Annotation */ +class SomeAnnotationClassNameWithoutConstructorAndProperties{} + +/** + * @Annotation + * @Target("Foo") + */ +class AnnotationWithInvalidTargetDeclaration{} + +/** + * @Annotation + * @Target + */ +class AnnotationWithTargetEmpty{} + +/** @Annotation */ +class AnnotationExtendsAnnotationTargetAll extends \Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll +{ +} + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { + public $foo; +} + +/** @Annotation */ +class Marker { + public $value; +} + +/** @Annotation */ +class True {} + +/** @Annotation */ +class False {} + +/** @Annotation */ +class Null {} + +namespace Doctrine\Tests\Common\Annotations\FooBar; + +/** @Annotation */ +class Name extends \Doctrine\Common\Annotations\Annotation { +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DummyClass.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DummyClass.php new file mode 100644 index 0000000..17223f6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/DummyClass.php @@ -0,0 +1,48 @@ +cacheDir = sys_get_temp_dir() . "/annotations_". uniqid(); + @mkdir($this->cacheDir); + return new FileCacheReader(new AnnotationReader(), $this->cacheDir); + } + + public function tearDown() + { + foreach (glob($this->cacheDir.'/*.php') AS $file) { + unlink($file); + } + rmdir($this->cacheDir); + } + + /** + * @group DCOM-81 + */ + public function testAttemptToCreateAnnotationCacheDir() + { + $this->cacheDir = sys_get_temp_dir() . "/not_existed_dir_". uniqid(); + + $this->assertFalse(is_dir($this->cacheDir)); + + $cache = new FileCacheReader(new AnnotationReader(), $this->cacheDir); + + $this->assertTrue(is_dir($this->cacheDir)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php new file mode 100644 index 0000000..44108e1 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/AnnotWithDefaultValue.php @@ -0,0 +1,10 @@ +roles = $values['value']; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php new file mode 100644 index 0000000..b507e60 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Template.php @@ -0,0 +1,14 @@ +name = isset($values['value']) ? $values['value'] : null; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php new file mode 100644 index 0000000..09ef031 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/Annotation/Version.php @@ -0,0 +1,11 @@ +"), + @Attribute("annotation", type = "Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll"), + @Attribute("arrayOfAnnotations", type = "array"), + }) + */ +final class AnnotationWithAttributes +{ + + public final function __construct(array $data) + { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + private $mixed; + private $boolean; + private $bool; + private $float; + private $string; + private $integer; + private $array; + private $annotation; + private $arrayOfIntegers; + private $arrayOfAnnotations; + + /** + * @return mixed + */ + public function getMixed() + { + return $this->mixed; + } + + /** + * @return boolean + */ + public function getBoolean() + { + return $this->boolean; + } + + /** + * @return bool + */ + public function getBool() + { + return $this->bool; + } + + /** + * @return float + */ + public function getFloat() + { + return $this->float; + } + + /** + * @return string + */ + public function getString() + { + return $this->string; + } + + public function getInteger() + { + return $this->integer; + } + + /** + * @return array + */ + public function getArray() + { + return $this->array; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAll + */ + public function getAnnotation() + { + return $this->annotation; + } + + /** + * @return array + */ + public function getArrayOfIntegers() + { + return $this->arrayOfIntegers; + } + + /** + * @return array + */ + public function getArrayOfAnnotations() + { + return $this->arrayOfAnnotations; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithConstants.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithConstants.php new file mode 100644 index 0000000..9c94558 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithConstants.php @@ -0,0 +1,20 @@ + $value) { + $this->$key = $value; + } + } + + /** + * @var string + */ + private $value; + + /** + * + * @var Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + private $annot; + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return Doctrine\Tests\Common\Annotations\Fixtures\AnnotationTargetAnnotation + */ + public function getAnnot() + { + return $this->annot; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php new file mode 100644 index 0000000..bf458ee --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/AnnotationWithRequiredAttributesWithoutContructor.php @@ -0,0 +1,24 @@ + + */ + public $arrayOfIntegers; + + /** + * @var array + */ + public $arrayOfAnnotations; + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php new file mode 100644 index 0000000..4e652e1 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassDDC1660.php @@ -0,0 +1,30 @@ +events->filter(function ($item) use ($year, $month, $day) { + $leftDate = new \DateTime($year.'-'.$month.'-'.$day.' 00:00'); + $rigthDate = new \DateTime($year.'-'.$month.'-'.$day.' +1 day 00:00'); + return ( ( $leftDate <= $item->getDateStart() ) && ( $item->getDateStart() < $rigthDate ) ); + + } + ); + return $extractEvents; + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithConstants.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithConstants.php new file mode 100644 index 0000000..055e245 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/ClassWithConstants.php @@ -0,0 +1,10 @@ + + */ +class Controller +{ + /** + * @Route("/", name="_demo") + * @Template() + */ + public function indexAction() + { + return array(); + } + + /** + * @Route("/hello/{name}", name="_demo_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = ContactForm::create($this->get('form.context'), 'contact'); + + $form->bind($this->container->get('request'), $form); + if ($form->isValid()) { + $form->send($this->get('mailer')); + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form); + } + + /** + * Creates the ACL for the passed object identity + * + * @param ObjectIdentityInterface $oid + * @return void + */ + private function createObjectIdentity(ObjectIdentityInterface $oid) + { + $classId = $this->createOrRetrieveClassId($oid->getType()); + + $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true)); + } + + /** + * Returns the primary key for the passed class type. + * + * If the type does not yet exist in the database, it will be created. + * + * @param string $classType + * @return integer + */ + private function createOrRetrieveClassId($classType) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertClassSql($classType)); + + return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn(); + } + + /** + * Returns the primary key for the passed security identity. + * + * If the security identity does not yet exist in the database, it will be + * created. + * + * @param SecurityIdentityInterface $sid + * @return integer + */ + private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid) + { + if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) { + return $id; + } + + $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid)); + + return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn(); + } + + /** + * Deletes all ACEs for the given object identity primary key. + * + * @param integer $oidPK + * @return void + */ + private function deleteAccessControlEntries($oidPK) + { + $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK)); + } + + /** + * Deletes the object identity from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentity($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk)); + } + + /** + * Deletes all entries from the relations table from the database. + * + * @param integer $pk + * @return void + */ + private function deleteObjectIdentityRelations($pk) + { + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + } + + /** + * This regenerates the ancestor table which is used for fast read access. + * + * @param AclInterface $acl + * @return void + */ + private function regenerateAncestorRelations(AclInterface $acl) + { + $pk = $acl->getId(); + $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk)); + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk)); + + $parentAcl = $acl->getParentAcl(); + while (null !== $parentAcl) { + $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId())); + + $parentAcl = $parentAcl->getParentAcl(); + } + } + + /** + * This processes changes on an ACE related property (classFieldAces, or objectFieldAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateFieldAceProperty($name, array $changes) + { + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + foreach ($changes[1] as $field => $new) { + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + } + + foreach ($changes[0] as $old) { + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + } + + /** + * This processes changes on an ACE related property (classAces, or objectAces). + * + * @param string $name + * @param array $changes + * @return void + */ + private function updateAceProperty($name, array $changes) + { + list($old, $new) = $changes; + + $sids = new \SplObjectStorage(); + $classIds = new \SplObjectStorage(); + $currentIds = array(); + for ($i=0,$c=count($new); $i<$c; $i++) { + $ace = $new[$i]; + + if (null === $ace->getId()) { + if ($sids->contains($ace->getSecurityIdentity())) { + $sid = $sids->offsetGet($ace->getSecurityIdentity()); + } else { + $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity()); + } + + $oid = $ace->getAcl()->getObjectIdentity(); + if ($classIds->contains($oid)) { + $classId = $classIds->offsetGet($oid); + } else { + $classId = $this->createOrRetrieveClassId($oid->getType()); + } + + $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId(); + + $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure())); + $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn(); + $this->loadedAces[$aceId] = $ace; + + $aceIdProperty = new \ReflectionProperty($ace, 'id'); + $aceIdProperty->setAccessible(true); + $aceIdProperty->setValue($ace, intval($aceId)); + } else { + $currentIds[$ace->getId()] = true; + } + } + + for ($i=0,$c=count($old); $i<$c; $i++) { + $ace = $old[$i]; + + if (!isset($currentIds[$ace->getId()])) { + $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId())); + unset($this->loadedAces[$ace->getId()]); + } + } + } + + /** + * Persists the changes which were made to ACEs to the database. + * + * @param \SplObjectStorage $aces + * @return void + */ + private function updateAces(\SplObjectStorage $aces) + { + foreach ($aces as $ace) { + $propertyChanges = $aces->offsetGet($ace); + $sets = array(); + + if (isset($propertyChanges['mask'])) { + $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]); + } + if (isset($propertyChanges['strategy'])) { + $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy'])); + } + if (isset($propertyChanges['aceOrder'])) { + $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]); + } + if (isset($propertyChanges['auditSuccess'])) { + $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1])); + } + if (isset($propertyChanges['auditFailure'])) { + $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1])); + } + + $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets)); + } + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php new file mode 100644 index 0000000..bda2cc2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/DifferentNamespacesPerFileWithClassAsFirst.php @@ -0,0 +1,15 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php new file mode 100644 index 0000000..1dae104 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/NoAnnotation.php @@ -0,0 +1,5 @@ +test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test2() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test3() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test4() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test5() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test6() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test7() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test8() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test9() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test10() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test11() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test12() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test13() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test14() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test15() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test16() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test17() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test18() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test19() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test20() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test21() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test22() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test23() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test24() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test25() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test26() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test27() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test28() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test29() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test30() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test31() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test32() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test33() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test34() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test35() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test36() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test37() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + + } + + public function test38() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } + + public function test39() + { + echo $this->test1; + echo $this->test2; + echo $this->test3; + $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + foreach ($array as $key => $value) { + echo $key . ' => ' . $value; + } + + $val = (string)self::TEST1; + $val .= (string)self::TEST2; + $val .= (string)self::TEST3; + $val .= (string)self::TEST4; + $val .= (string)self::TEST5; + $val .= (string)self::TEST6; + $val .= (string)self::TEST7; + $val .= (string)self::TEST8; + $val .= (string)self::TEST9; + + strtolower($val); + + return $val; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php new file mode 100644 index 0000000..58c5e6a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Fixtures/TestInterface.php @@ -0,0 +1,13 @@ +getMethod(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (in-memory)', $time, $c); + } + + /** + * @group performance + */ + public function testCachedReadPerformanceWithFileCache() + { + $method = $this->getMethod(); + + // prime cache + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $reader = new FileCacheReader(new AnnotationReader(), sys_get_temp_dir()); + $reader->getMethodAnnotations($method); + clearstatcache(); + } + $time = microtime(true) - $time; + + $this->printResults('cached reader (file)', $time, $c); + } + + /** + * @group performance + */ + public function testReadPerformance() + { + $method = $this->getMethod(); + + $time = microtime(true); + for ($i=0,$c=150; $i<$c; $i++) { + $reader = new AnnotationReader(); + $reader->getMethodAnnotations($method); + } + $time = microtime(true) - $time; + + $this->printResults('reader', $time, $c); + } + + /** + * @group performance + */ + public function testDocParsePerformance() + { + $imports = array( + 'ignorephpdoc' => 'Annotations\Annotation\IgnorePhpDoc', + 'ignoreannotation' => 'Annotations\Annotation\IgnoreAnnotation', + 'route' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Route', + 'template' => 'Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Template', + '__NAMESPACE__' => 'Doctrine\Tests\Common\Annotations\Fixtures', + ); + $ignored = array( + 'access', 'author', 'copyright', 'deprecated', 'example', 'ignore', + 'internal', 'link', 'see', 'since', 'tutorial', 'version', 'package', + 'subpackage', 'name', 'global', 'param', 'return', 'staticvar', + 'static', 'var', 'throws', 'inheritdoc', + ); + + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=200; $i<$c; $i++) { + $parser = new DocParser(); + $parser->setImports($imports); + $parser->setIgnoredAnnotationNames($ignored); + $parser->setIgnoreNotImportedAnnotations(true); + + $parser->parse($methodComment); + $parser->parse($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser', $time, $c); + } + + /** + * @group performance + */ + public function testDocLexerPerformance() + { + $method = $this->getMethod(); + $methodComment = $method->getDocComment(); + $classComment = $method->getDeclaringClass()->getDocComment(); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $lexer = new DocLexer(); + $lexer->setInput($methodComment); + $lexer->setInput($classComment); + } + $time = microtime(true) - $time; + + $this->printResults('doc-lexer', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithShortCut() + { + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\NamespacedSingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-with-short-cut', $time, $c); + } + + /** + * @group performance + */ + public function testPhpParserPerformanceWithoutShortCut() + { + $class = new \ReflectionClass('SingleClassLOC1000'); + + $time = microtime(true); + for ($i=0,$c=500; $i<$c; $i++) { + $parser = new PhpParser(); + $parser->parseClass($class); + } + $time = microtime(true) - $time; + + $this->printResults('doc-parser-without-short-cut', $time, $c); + } + + private function getMethod() + { + return new \ReflectionMethod('Doctrine\Tests\Common\Annotations\Fixtures\Controller', 'helloAction'); + } + + private function printResults($test, $time, $iterations) + { + if (0 == $iterations) { + throw new \InvalidArgumentException('$iterations cannot be zero.'); + } + + $title = $test." results:\n"; + $iterationsText = sprintf("Iterations: %d\n", $iterations); + $totalTime = sprintf("Total Time: %.3f s\n", $time); + $iterationTime = sprintf("Time per iteration: %.3f ms\n", $time/$iterations * 1000); + + $max = max(strlen($title), strlen($iterationTime)) - 1; + + echo "\n".str_repeat('-', $max)."\n"; + echo $title; + echo str_repeat('=', $max)."\n"; + echo $iterationsText; + echo $totalTime; + echo $iterationTime; + echo str_repeat('-', $max)."\n"; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php new file mode 100644 index 0000000..cf81116 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/PhpParserTest.php @@ -0,0 +1,194 @@ +assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWithMultipleImportsInUseStatement() + { + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\MultipleImportsInUseStatement'); + $parser = new PhpParser(); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenNotUserDefined() + { + $parser = new PhpParser(); + $this->assertEquals(array(), $parser->parseClass(new \ReflectionClass('\stdClass'))); + } + + public function testParseClassWhenClassIsNotNamespaced() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\AnnotationsTestsFixturesNonNamespacedClass'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testParseClassWhenClassIsInterface() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\TestInterface'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testClassWithFullyQualifiedUseStatements() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithFullyQualifiedUseStatements'); + + $this->assertEquals(array( + 'secure' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => '\\' . __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceAndClassCommentedOut() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceAndClassCommentedOut'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testEqualNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\EqualNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + ), $parser->parseClass($class)); + } + + public function testDifferentNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\DifferentNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsFirst() + { + $parser = new PhpParser(); + $class = new \ReflectionClass('\GlobalNamespacesPerFileWithClassAsFirst'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + ), $parser->parseClass($class)); + } + + public function testGlobalNamespacesPerFileWithClassAsLast() + { + $parser = new PhpParser(); + $class = new ReflectionClass('\GlobalNamespacesPerFileWithClassAsLast'); + + $this->assertEquals(array( + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testNamespaceWithClosureDeclaration() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + public function testIfPointerResetsOnMultipleParsingTries() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\NamespaceWithClosureDeclaration'); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + + $this->assertEquals(array( + 'secure' => __NAMESPACE__ . '\Fixtures\Annotation\Secure', + 'route' => __NAMESPACE__ . '\Fixtures\Annotation\Route', + 'template' => __NAMESPACE__ . '\Fixtures\Annotation\Template', + ), $parser->parseClass($class)); + } + + /** + * @group DCOM-97 + * @group regression + */ + public function testClassWithClosure() + { + $parser = new PhpParser(); + $class = new ReflectionClass(__NAMESPACE__ . '\Fixtures\ClassWithClosure'); + + $this->assertEquals(array( + 'annotationtargetall' => __NAMESPACE__ . '\Fixtures\AnnotationTargetAll', + 'annotationtargetannotation' => __NAMESPACE__ . '\Fixtures\AnnotationTargetAnnotation', + ), $parser->parseClass($class)); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php new file mode 100644 index 0000000..376539f --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/SimpleAnnotationReaderTest.php @@ -0,0 +1,97 @@ +getReader(); + $class = new \ReflectionClass('Doctrine\Tests\Common\Annotations\Fixtures\ClassDDC1660'); + + $this->assertTrue(class_exists('Doctrine\Tests\Common\Annotations\Fixtures\Annotation\Version')); + $this->assertCount(1, $reader->getClassAnnotations($class)); + $this->assertCount(1, $reader->getMethodAnnotations($class->getMethod('bar'))); + $this->assertCount(1, $reader->getPropertyAnnotations($class->getProperty('foo'))); + } + + protected function getReader() + { + $reader = new SimpleAnnotationReader(); + $reader->addNamespace(__NAMESPACE__); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures'); + $reader->addNamespace(__NAMESPACE__ . '\Fixtures\Annotation'); + + return $reader; + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php new file mode 100644 index 0000000..a7b9e2f --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM55Test.php @@ -0,0 +1,65 @@ +getClassAnnotations($class); + } + + public function testAnnotation() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Consumer'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf(__NAMESPACE__.'\\DCOM55Annotation', $annots[0]); + } + + public function testParseAnnotationDocblocks() + { + $class = new \ReflectionClass(__NAMESPACE__ . '\\DCOM55Annotation'); + $reader = new \Doctrine\Common\Annotations\AnnotationReader(); + $annots = $reader->getClassAnnotations($class); + + $this->assertEquals(0, count($annots)); + } +} + +/** + * @Controller + */ +class Dummy +{ + +} + +/** + * @Annotation + */ +class DCOM55Annotation +{ + +} + +/** + * @DCOM55Annotation + */ +class DCOM55Consumer +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php new file mode 100644 index 0000000..708bcc9 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/Ticket/DCOM58Entity.php @@ -0,0 +1,8 @@ +getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + foreach ($result as $annot) { + $classAnnotations[get_class($annot)] = $annot; + } + + $this->assertTrue(!isset($classAnnotations['']), 'Class "xxx" is not a valid entity or mapped super class.'); + } + + public function testIssueGlobalNamespace() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->setImports(array( + "__NAMESPACE__" =>"Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping" + )); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Entity", $annots[0]); + } + + public function testIssueMultipleNamespaces() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping"); + $parser->addNamespace("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM"); + + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + + public function testIssueWithNamespacesOrImports() + { + $docblock = "@Entity"; + $parser = new \Doctrine\Common\Annotations\DocParser(); + $annots = $parser->parse($docblock); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Entity", $annots[0]); + $this->assertEquals(1, count($annots)); + } + + + public function testIssueSimpleAnnotationReader() + { + $reader = new \Doctrine\Common\Annotations\SimpleAnnotationReader(); + $reader->addNamespace('Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping'); + $annots = $reader->getClassAnnotations(new \ReflectionClass(__NAMESPACE__."\MappedClass")); + + $this->assertEquals(1, count($annots)); + $this->assertInstanceOf("Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping\Entity", $annots[0]); + } + +} + +/** + * @Entity + */ +class MappedClass +{ + +} + + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM\Mapping; +/** +* @Annotation +*/ +class Entity +{ + +} + +namespace Doctrine\Tests\Common\Annotations\Ticket\Doctrine\ORM; +/** +* @Annotation +*/ +class Entity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php new file mode 100644 index 0000000..ff3ca37 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Annotations/TopLevelAnnotation.php @@ -0,0 +1,8 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of APC'); + } + } + + protected function _getCacheDriver() + { + return new ApcCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php new file mode 100644 index 0000000..6cad891 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ArrayCacheTest.php @@ -0,0 +1,21 @@ +_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php new file mode 100644 index 0000000..1bbc165 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/CacheTest.php @@ -0,0 +1,91 @@ +_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out'); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // Test delete + $cache->save('test_key2', 'test2'); + $cache->delete('test_key2'); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testObjects() + { + $cache = $this->_getCacheDriver(); + + // Fetch/save test with objects (Is cache driver serializes/unserializes objects correctly ?) + $cache->save('test_object_key', new \ArrayObject()); + $this->assertTrue($cache->fetch('test_object_key') instanceof \ArrayObject); + } + + public function testDeleteAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->deleteAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testFlushAll() + { + $cache = $this->_getCacheDriver(); + $cache->save('test_key1', '1'); + $cache->save('test_key2', '2'); + $cache->flushAll(); + + $this->assertFalse($cache->contains('test_key1')); + $this->assertFalse($cache->contains('test_key2')); + } + + public function testNamespace() + { + $cache = $this->_getCacheDriver(); + $cache->setNamespace('test_'); + $cache->save('key1', 'test'); + + $this->assertTrue($cache->contains('key1')); + + $cache->setNamespace('test2_'); + + $this->assertFalse($cache->contains('key1')); + } + + /** + * @group DCOM-43 + */ + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertArrayHasKey(Cache::STATS_HITS, $stats); + $this->assertArrayHasKey(Cache::STATS_MISSES, $stats); + $this->assertArrayHasKey(Cache::STATS_UPTIME, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_USAGE, $stats); + $this->assertArrayHasKey(Cache::STATS_MEMORY_AVAILIABLE, $stats); + } + + /** + * @return \Doctrine\Common\Cache\CacheProvider + */ + abstract protected function _getCacheDriver(); +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php new file mode 100644 index 0000000..f782e3c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/FilesystemCacheTest.php @@ -0,0 +1,97 @@ +assertFalse(is_dir($dir)); + + $this->driver = new FilesystemCache($dir); + $this->assertTrue(is_dir($dir)); + + return $this->driver; + } + + public function testLifetime() + { + $cache = $this->_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out', 10); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // access private methods + $getFilename = new \ReflectionMethod($cache, 'getFilename'); + $getNamespacedId = new \ReflectionMethod($cache, 'getNamespacedId'); + + $getFilename->setAccessible(true); + $getNamespacedId->setAccessible(true); + + $id = $getNamespacedId->invoke($cache, 'test_key'); + $filename = $getFilename->invoke($cache, $id); + + $data = ''; + $lifetime = 0; + $resource = fopen($filename, "r"); + + if (false !== ($line = fgets($resource))) { + $lifetime = (integer) $line; + } + + while (false !== ($line = fgets($resource))) { + $data .= $line; + } + + $this->assertNotEquals(0, $lifetime, "previous lifetime could not be loaded"); + + // update lifetime + $lifetime = $lifetime - 20; + file_put_contents($filename, $lifetime . PHP_EOL . $data); + + // test expired data + $this->assertFalse($cache->contains('test_key')); + $this->assertFalse($cache->fetch('test_key')); + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats); + } + + public function tearDown() + { + $dir = $this->driver->getDirectory(); + $ext = $this->driver->getExtension(); + $iterator = new \RecursiveDirectoryIterator($dir); + + foreach (new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST) as $file) { + if ($file->isFile()) { + @unlink($file->getRealPath()); + } else { + @rmdir($file->getRealPath()); + } + } + } + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php new file mode 100644 index 0000000..36c180c --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcacheCacheTest.php @@ -0,0 +1,45 @@ +_memcache = new \Memcache; + $ok = @$this->_memcache->connect('localhost', 11211); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + public function testLongLifetime() + { + $cache = $this->_getCacheDriver(); + $cache->save('key', 'value', 30 * 24 * 3600 + 1); + $this->assertTrue($cache->contains('key'), 'Memcache provider should support TTL > 30 days'); + } + + protected function _getCacheDriver() + { + $driver = new MemcacheCache(); + $driver->setMemcache($this->_memcache); + return $driver; + } + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php new file mode 100644 index 0000000..ecbe5a6 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/MemcachedCacheTest.php @@ -0,0 +1,48 @@ +memcached = new \Memcached(); + $this->memcached->setOption(\Memcached::OPT_COMPRESSION, false); + $this->memcached->addServer('127.0.0.1', 11211); + + $fh = @fsockopen('127.0.0.1', 11211); + if (!$fh) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of memcache'); + } + } + + public function testNoExpire() { + $cache = $this->_getCacheDriver(); + $cache->save('noexpire', 'value', 0); + sleep(1); + $this->assertTrue($cache->contains('noexpire'), 'Memcache provider should support no-expire'); + } + + public function testLongLifetime() + { + $cache = $this->_getCacheDriver(); + $cache->save('key', 'value', 30 * 24 * 3600 + 1); + + $this->assertTrue($cache->contains('key'), 'Memcached provider should support TTL > 30 days'); + } + + protected function _getCacheDriver() + { + $driver = new MemcachedCache(); + $driver->setMemcached($this->memcached); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php new file mode 100644 index 0000000..5085f46 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/PhpFileCacheTest.php @@ -0,0 +1,149 @@ +assertFalse(is_dir($dir)); + + $this->driver = new PhpFileCache($dir); + $this->assertTrue(is_dir($dir)); + + return $this->driver; + } + + public function testObjects() + { + $this->markTestSkipped('PhpFileCache does not support saving objects that dont implement __set_state()'); + } + + public function testLifetime() + { + $cache = $this->_getCacheDriver(); + + // Test save + $cache->save('test_key', 'testing this out', 10); + + // Test contains to test that save() worked + $this->assertTrue($cache->contains('test_key')); + + // Test fetch + $this->assertEquals('testing this out', $cache->fetch('test_key')); + + // access private methods + $getFilename = new \ReflectionMethod($cache, 'getFilename'); + $getNamespacedId = new \ReflectionMethod($cache, 'getNamespacedId'); + + $getFilename->setAccessible(true); + $getNamespacedId->setAccessible(true); + + $id = $getNamespacedId->invoke($cache, 'test_key'); + $path = $getFilename->invoke($cache, $id); + $value = include $path; + + // update lifetime + $value['lifetime'] = $value['lifetime'] - 20; + file_put_contents($path, 'assertFalse($cache->contains('test_key')); + $this->assertFalse($cache->fetch('test_key')); + } + + public function testImplementsSetState() + { + $cache = $this->_getCacheDriver(); + + // Test save + $cache->save('test_set_state', new SetStateClass(array(1,2,3))); + + //Test __set_state call + $this->assertCount(0, SetStateClass::$values); + + // Test fetch + $value = $cache->fetch('test_set_state'); + $this->assertInstanceOf('Doctrine\Tests\Common\Cache\SetStateClass', $value); + $this->assertEquals(array(1,2,3), $value->getValue()); + + //Test __set_state call + $this->assertCount(1, SetStateClass::$values); + + // Test contains + $this->assertTrue($cache->contains('test_set_state')); + } + + public function testNotImplementsSetState() + { + $cache = $this->_getCacheDriver(); + + $this->setExpectedException('InvalidArgumentException'); + $cache->save('test_not_set_state', new NotSetStateClass(array(1,2,3))); + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats); + } + + public function tearDown() + { + if (!$this->driver) { + return; + } + + $dir = $this->driver->getDirectory(); + $ext = $this->driver->getExtension(); + $iterator = new \RecursiveDirectoryIterator($dir); + + foreach (new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST) as $file) { + if ($file->isFile()) { + @unlink($file->getRealPath()); + } else { + @rmdir($file->getRealPath()); + } + } + } + +} + +class NotSetStateClass +{ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + public function getValue() + { + return $this->value; + } +} + +class SetStateClass extends NotSetStateClass +{ + public static $values = array(); + + public static function __set_state($data) + { + self::$values = $data; + return new self($data['value']); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php new file mode 100644 index 0000000..45bbc75 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/RedisCacheTest.php @@ -0,0 +1,30 @@ +_redis = new \Redis(); + $ok = @$this->_redis->connect('127.0.0.1'); + if (!$ok) { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of redis'); + } + } else { + $this->markTestSkipped('The ' . __CLASS__ .' requires the use of redis'); + } + } + + protected function _getCacheDriver() + { + $driver = new RedisCache(); + $driver->setRedis($this->_redis); + return $driver; + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php new file mode 100644 index 0000000..cb363df --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/WinCacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Wincache'); + } + } + + protected function _getCacheDriver() + { + return new WincacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php new file mode 100644 index 0000000..6259848 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/XcacheCacheTest.php @@ -0,0 +1,20 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of xcache'); + } + } + + protected function _getCacheDriver() + { + return new XcacheCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php new file mode 100644 index 0000000..cd66e15 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Cache/ZendDataCacheTest.php @@ -0,0 +1,28 @@ +markTestSkipped('The ' . __CLASS__ .' requires the use of Zend Data Cache which only works in apache2handler SAPI'); + } + } + + public function testGetStats() + { + $cache = $this->_getCacheDriver(); + $stats = $cache->getStats(); + + $this->assertNull($stats); + } + + protected function _getCacheDriver() + { + return new ZendDataCache(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php new file mode 100644 index 0000000..567cf91 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php @@ -0,0 +1,45 @@ +setIncludePath(__DIR__); + $classLoader->setFileExtension('.class.php'); + $classLoader->setNamespaceSeparator('_'); + + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB')); + $this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC')); + $this->assertFalse($classLoader->canLoadClass('OtherClass')); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true); + $this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true); + } + + public function testClassExists() + { + $this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD')); + $badLoader = function($className) { + require __DIR__ . '/ClassLoaderTest/ClassD.php'; + return true; + }; + spl_autoload_register($badLoader); + $this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD')); + spl_autoload_unregister($badLoader); + } + + public function testGetClassLoader() + { + $cl = new ClassLoader('ClassLoaderTest', __DIR__); + $cl->register(); + $this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader); + $this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist')); + $cl->unregister(); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php new file mode 100644 index 0000000..8554654 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php @@ -0,0 +1,6 @@ +. + */ + +namespace Doctrine\Tests\Common\Collections; + +use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor; +use Doctrine\Common\Collections\ExpressionBuilder; + +/** + * @group DDC-1637 + */ +class ClosureExpressionVisitorTest extends \PHPUnit_Framework_TestCase +{ + private $visitor; + private $builder; + + public function setUp() + { + $this->visitor = new ClosureExpressionVisitor(); + $this->builder = new ExpressionBuilder(); + } + + public function testWalkEqualsComparison() + { + $closure = $this->visitor->walkComparison($this->builder->eq("foo", 1)); + + $this->assertTrue($closure(new TestObject(1))); + $this->assertFalse($closure(new TestObject(2))); + } + + public function testWalkNotEqualsComparison() + { + $closure = $this->visitor->walkComparison($this->builder->neq("foo", 1)); + + $this->assertFalse($closure(new TestObject(1))); + $this->assertTrue($closure(new TestObject(2))); + } + + public function testWalkLessThanComparison() + { + $closure = $this->visitor->walkComparison($this->builder->lt("foo", 1)); + + $this->assertFalse($closure(new TestObject(1))); + $this->assertTrue($closure(new TestObject(0))); + } + + public function testWalkLessThanEqualsComparison() + { + $closure = $this->visitor->walkComparison($this->builder->lte("foo", 1)); + + $this->assertFalse($closure(new TestObject(2))); + $this->assertTrue($closure(new TestObject(1))); + $this->assertTrue($closure(new TestObject(0))); + } + + public function testWalkGreaterThanEqualsComparison() + { + $closure = $this->visitor->walkComparison($this->builder->gte("foo", 1)); + + $this->assertTrue($closure(new TestObject(2))); + $this->assertTrue($closure(new TestObject(1))); + $this->assertFalse($closure(new TestObject(0))); + } + + public function testWalkGreaterThanComparison() + { + $closure = $this->visitor->walkComparison($this->builder->gt("foo", 1)); + + $this->assertTrue($closure(new TestObject(2))); + $this->assertFalse($closure(new TestObject(1))); + $this->assertFalse($closure(new TestObject(0))); + } + + public function testWalkInComparison() + { + $closure = $this->visitor->walkComparison($this->builder->in("foo", array(1, 2, 3))); + + $this->assertTrue($closure(new TestObject(2))); + $this->assertTrue($closure(new TestObject(1))); + $this->assertFalse($closure(new TestObject(0))); + } + + public function testWalkNotInComparison() + { + $closure = $this->visitor->walkComparison($this->builder->notIn("foo", array(1, 2, 3))); + + $this->assertFalse($closure(new TestObject(1))); + $this->assertFalse($closure(new TestObject(2))); + $this->assertTrue($closure(new TestObject(0))); + $this->assertTrue($closure(new TestObject(4))); + } + + public function testWalkAndCompositeExpression() + { + $closure = $this->visitor->walkCompositeExpression( + $this->builder->andX( + $this->builder->eq("foo", 1), + $this->builder->eq("bar", 1) + ) + ); + + $this->assertTrue($closure(new TestObject(1, 1))); + $this->assertFalse($closure(new TestObject(1, 0))); + $this->assertFalse($closure(new TestObject(0, 1))); + $this->assertFalse($closure(new TestObject(0, 0))); + } + + public function testWalkOrCompositeExpression() + { + $closure = $this->visitor->walkCompositeExpression( + $this->builder->orX( + $this->builder->eq("foo", 1), + $this->builder->eq("bar", 1) + ) + ); + + $this->assertTrue($closure(new TestObject(1, 1))); + $this->assertTrue($closure(new TestObject(1, 0))); + $this->assertTrue($closure(new TestObject(0, 1))); + $this->assertFalse($closure(new TestObject(0, 0))); + } + + public function testSortByFieldAscending() + { + $objects = array(new TestObject("b"), new TestObject("a"), new TestObject("c")); + $sort = ClosureExpressionVisitor::sortByField("foo"); + + usort($objects, $sort); + + $this->assertEquals("a", $objects[0]->getFoo()); + $this->assertEquals("b", $objects[1]->getFoo()); + $this->assertEquals("c", $objects[2]->getFoo()); + } + + public function testSortByFieldDescending() + { + $objects = array(new TestObject("b"), new TestObject("a"), new TestObject("c")); + $sort = ClosureExpressionVisitor::sortByField("foo", -1); + + usort($objects, $sort); + + $this->assertEquals("c", $objects[0]->getFoo()); + $this->assertEquals("b", $objects[1]->getFoo()); + $this->assertEquals("a", $objects[2]->getFoo()); + } + + public function testSortDelegate() + { + $objects = array(new TestObject("a", "c"), new TestObject("a", "b"), new TestObject("a", "a")); + $sort = ClosureExpressionVisitor::sortByField("bar", 1); + $sort = ClosureExpressionVisitor::sortByField("foo", 1, $sort); + + usort($objects, $sort); + + $this->assertEquals("a", $objects[0]->getBar()); + $this->assertEquals("b", $objects[1]->getBar()); + $this->assertEquals("c", $objects[2]->getBar()); + } +} + +class TestObject +{ + private $foo; + private $bar; + + public function __construct($foo = null, $bar = null) + { + $this->foo = $foo; + $this->bar = $bar; + } + + public function getFoo() + { + return $this->foo; + } + + public function getBar() + { + return $this->bar; + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php new file mode 100644 index 0000000..280efa3 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CollectionTest.php @@ -0,0 +1,251 @@ +_coll = new \Doctrine\Common\Collections\ArrayCollection; + } + + public function testIssetAndUnset() + { + $this->assertFalse(isset($this->_coll[0])); + $this->_coll->add('testing'); + $this->assertTrue(isset($this->_coll[0])); + unset($this->_coll[0]); + $this->assertFalse(isset($this->_coll[0])); + } + + public function testToString() + { + $this->_coll->add('testing'); + $this->assertTrue(is_string((string) $this->_coll)); + } + + public function testRemovingNonExistentEntryReturnsNull() + { + $this->assertEquals(null, $this->_coll->remove('testing_does_not_exist')); + } + + public function testExists() + { + $this->_coll->add("one"); + $this->_coll->add("two"); + $exists = $this->_coll->exists(function($k, $e) { return $e == "one"; }); + $this->assertTrue($exists); + $exists = $this->_coll->exists(function($k, $e) { return $e == "other"; }); + $this->assertFalse($exists); + } + + public function testMap() + { + $this->_coll->add(1); + $this->_coll->add(2); + $res = $this->_coll->map(function($e) { return $e * 2; }); + $this->assertEquals(array(2, 4), $res->toArray()); + } + + public function testFilter() + { + $this->_coll->add(1); + $this->_coll->add("foo"); + $this->_coll->add(3); + $res = $this->_coll->filter(function($e) { return is_numeric($e); }); + $this->assertEquals(array(0 => 1, 2 => 3), $res->toArray()); + } + + public function testFirstAndLast() + { + $this->_coll->add('one'); + $this->_coll->add('two'); + + $this->assertEquals($this->_coll->first(), 'one'); + $this->assertEquals($this->_coll->last(), 'two'); + } + + public function testArrayAccess() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertEquals($this->_coll[0], 'one'); + $this->assertEquals($this->_coll[1], 'two'); + + unset($this->_coll[0]); + $this->assertEquals($this->_coll->count(), 1); + } + + public function testContainsKey() + { + $this->_coll[5] = 'five'; + $this->assertTrue($this->_coll->containsKey(5)); + } + + public function testContains() + { + $this->_coll[0] = 'test'; + $this->assertTrue($this->_coll->contains('test')); + } + + public function testSearch() + { + $this->_coll[0] = 'test'; + $this->assertEquals(0, $this->_coll->indexOf('test')); + } + + public function testGet() + { + $this->_coll[0] = 'test'; + $this->assertEquals('test', $this->_coll->get(0)); + } + + public function testGetKeys() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array(0, 1), $this->_coll->getKeys()); + } + + public function testGetValues() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals(array('one', 'two'), $this->_coll->getValues()); + } + + public function testCount() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->count(), 2); + $this->assertEquals(count($this->_coll), 2); + } + + public function testForAll() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_string($e); }), true); + $this->assertEquals($this->_coll->forAll(function($k, $e) { return is_array($e); }), false); + } + + public function testPartition() + { + $this->_coll[] = true; + $this->_coll[] = false; + $partition = $this->_coll->partition(function($k, $e) { return $e == true; }); + $this->assertEquals($partition[0][0], true); + $this->assertEquals($partition[1][0], false); + } + + public function testClear() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll->clear(); + $this->assertEquals($this->_coll->isEmpty(), true); + } + + public function testRemove() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $el = $this->_coll->remove(0); + + $this->assertEquals('one', $el); + $this->assertEquals($this->_coll->contains('one'), false); + $this->assertNull($this->_coll->remove(0)); + } + + public function testRemoveElement() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + + $this->assertTrue($this->_coll->removeElement('two')); + $this->assertFalse($this->_coll->contains('two')); + $this->assertFalse($this->_coll->removeElement('two')); + } + + public function testSlice() + { + $this->_coll[] = 'one'; + $this->_coll[] = 'two'; + $this->_coll[] = 'three'; + + $slice = $this->_coll->slice(0, 1); + $this->assertInternalType('array', $slice); + $this->assertEquals(array('one'), $slice); + + $slice = $this->_coll->slice(1); + $this->assertEquals(array(1 => 'two', 2 => 'three'), $slice); + + $slice = $this->_coll->slice(1, 1); + $this->assertEquals(array(1 => 'two'), $slice); + } + + public function fillMatchingFixture() + { + $std1 = new \stdClass(); + $std1->foo = "bar"; + $this->_coll[] = $std1; + + $std2 = new \stdClass(); + $std2->foo = "baz"; + $this->_coll[] = $std2; + } + + /** + * @group DDC-1637 + */ + public function testMatching() + { + $this->fillMatchingFixture(); + + $col = $this->_coll->matching(new Criteria(Criteria::expr()->eq("foo", "bar"))); + $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $col); + $this->assertNotSame($col, $this->_coll); + $this->assertEquals(1, count($col)); + } + + /** + * @group DDC-1637 + */ + public function testMatchingOrdering() + { + $this->fillMatchingFixture(); + + $col = $this->_coll->matching(new Criteria(null, array('foo' => 'DESC'))); + + $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $col); + $this->assertNotSame($col, $this->_coll); + $this->assertEquals(2, count($col)); + $this->assertEquals('baz', $col[0]->foo); + $this->assertEquals('bar', $col[1]->foo); + } + + /** + * @group DDC-1637 + */ + public function testMatchingSlice() + { + $this->fillMatchingFixture(); + + $col = $this->_coll->matching(new Criteria(null, null, 1, 1)); + + $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $col); + $this->assertNotSame($col, $this->_coll); + $this->assertEquals(1, count($col)); + $this->assertEquals('baz', $col[0]->foo); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CriteriaTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CriteriaTest.php new file mode 100644 index 0000000..03fb6ca --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/CriteriaTest.php @@ -0,0 +1,82 @@ +assertInstanceOf("Doctrine\Common\Collections\Criteria", $criteria); + } + + public function testConstructor() + { + $expr = new Comparison("field", "=", "value"); + $criteria = new Criteria($expr, array("foo" => "ASC"), 10, 20); + + $this->assertSame($expr, $criteria->getWhereExpression()); + $this->assertEquals(array("foo" => "ASC"), $criteria->getOrderings()); + $this->assertEquals(10, $criteria->getFirstResult()); + $this->assertEquals(20, $criteria->getMaxResults()); + } + + public function testWhere() + { + $expr = new Comparison("field", "=", "value"); + $criteria = new Criteria(); + + $criteria->where($expr); + + $this->assertSame($expr, $criteria->getWhereExpression()); + } + + public function testAndWhere() + { + $expr = new Comparison("field", "=", "value"); + $criteria = new Criteria(); + + $criteria->where($expr); + $expr = $criteria->getWhereExpression(); + $criteria->andWhere($expr); + + $where = $criteria->getWhereExpression(); + $this->assertInstanceOf('Doctrine\Common\Collections\Expr\CompositeExpression', $where); + + $this->assertEquals(CompositeExpression::TYPE_AND, $where->getType()); + $this->assertSame(array($expr, $expr), $where->getExpressionList()); + } + + public function testOrWhere() + { + $expr = new Comparison("field", "=", "value"); + $criteria = new Criteria(); + + $criteria->where($expr); + $expr = $criteria->getWhereExpression(); + $criteria->orWhere($expr); + + $where = $criteria->getWhereExpression(); + $this->assertInstanceOf('Doctrine\Common\Collections\Expr\CompositeExpression', $where); + + $this->assertEquals(CompositeExpression::TYPE_OR, $where->getType()); + $this->assertSame(array($expr, $expr), $where->getExpressionList()); + } + + public function testOrderings() + { + $criteria = Criteria::create() + ->orderBy(array("foo" => "ASC")); + + $this->assertEquals(array("foo" => "ASC"), $criteria->getOrderings()); + } + + public function testExpr() + { + $this->assertInstanceOf('Doctrine\Common\Collections\ExpressionBuilder', Criteria::expr()); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/ExpressionBuilderTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/ExpressionBuilderTest.php new file mode 100644 index 0000000..68896b3 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Collections/ExpressionBuilderTest.php @@ -0,0 +1,114 @@ +builder = new ExpressionBuilder(); + } + + public function testAndX() + { + $expr = $this->builder->andX($this->builder->eq("a", "b")); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\CompositeExpression", $expr); + $this->assertEquals(CompositeExpression::TYPE_AND, $expr->getType()); + } + + public function testOrX() + { + $expr = $this->builder->orX($this->builder->eq("a", "b")); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\CompositeExpression", $expr); + $this->assertEquals(CompositeExpression::TYPE_OR, $expr->getType()); + } + + public function testInvalidAndXArgument() + { + $this->setExpectedException("RuntimeException"); + $this->builder->andX("foo"); + } + + public function testEq() + { + $expr = $this->builder->eq("a", "b"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::EQ, $expr->getOperator()); + } + + public function testNeq() + { + $expr = $this->builder->neq("a", "b"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::NEQ, $expr->getOperator()); + } + + public function testLt() + { + $expr = $this->builder->lt("a", "b"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::LT, $expr->getOperator()); + } + + public function testGt() + { + $expr = $this->builder->gt("a", "b"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::GT, $expr->getOperator()); + } + + public function testGte() + { + $expr = $this->builder->gte("a", "b"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::GTE, $expr->getOperator()); + } + + public function testLte() + { + $expr = $this->builder->lte("a", "b"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::LTE, $expr->getOperator()); + } + + public function testIn() + { + $expr = $this->builder->in("a", array("b")); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::IN, $expr->getOperator()); + } + + public function testNotIn() + { + $expr = $this->builder->notIn("a", array("b")); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::NIN, $expr->getOperator()); + } + + public function testIsNull() + { + $expr = $this->builder->isNull("a"); + + $this->assertInstanceOf("Doctrine\Common\Collections\Expr\Comparison", $expr); + $this->assertEquals(Comparison::IS, $expr->getOperator()); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php new file mode 100644 index 0000000..e69de29 diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php new file mode 100644 index 0000000..2b11b20 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php @@ -0,0 +1,88 @@ +_eventManager = new EventManager; + $this->_preFooInvoked = false; + $this->_postFooInvoked = false; + } + + public function testInitialState() + { + $this->assertEquals(array(), $this->_eventManager->getListeners()); + $this->assertFalse($this->_eventManager->hasListeners(self::preFoo)); + $this->assertFalse($this->_eventManager->hasListeners(self::postFoo)); + } + + public function testAddEventListener() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo))); + $this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo))); + $this->assertEquals(2, count($this->_eventManager->getListeners())); + } + + public function testDispatchEvent() + { + $this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this); + $this->_eventManager->dispatchEvent(self::preFoo); + $this->assertTrue($this->_preFooInvoked); + $this->assertFalse($this->_postFooInvoked); + } + + public function testRemoveEventListener() + { + $this->_eventManager->addEventListener(array('preBar'), $this); + $this->assertTrue($this->_eventManager->hasListeners(self::preBar)); + $this->_eventManager->removeEventListener(array('preBar'), $this); + $this->assertFalse($this->_eventManager->hasListeners(self::preBar)); + } + + public function testAddEventSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->_eventManager->addEventSubscriber($eventSubscriber); + $this->assertTrue($this->_eventManager->hasListeners(self::preFoo)); + $this->assertTrue($this->_eventManager->hasListeners(self::postFoo)); + } + + /* Listener methods */ + + public function preFoo(EventArgs $e) + { + $this->_preFooInvoked = true; + } + + public function postFoo(EventArgs $e) + { + $this->_postFooInvoked = true; + } +} + +class TestEventSubscriber implements \Doctrine\Common\EventSubscriber +{ + public function getSubscribedEvents() + { + return array('preFoo', 'postFoo'); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php new file mode 100644 index 0000000..66ad762 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php @@ -0,0 +1,130 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->never()) + ->method('loadMetadataForClass'); + $driver1->expectS($this->never()) + ->method('isTransient'); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->at(0)) + ->method('loadMetadataForClass') + ->with($this->equalTo($className), $this->equalTo($classMetadata)); + $driver2->expects($this->at(1)) + ->method('isTransient') + ->with($this->equalTo($className)) + ->will($this->returnValue( true )); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping'); + + $chain->loadMetadataForClass($className, $classMetadata); + + $this->assertTrue( $chain->isTransient($className) ); + } + + public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException'); + $chain->loadMetadataForClass($className, $classMetadata); + } + + public function testGatherAllClassNames() + { + $className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity'; + $classMetadata = $this->getMock('Doctrine\Common\Peristence\ClassMetadata'); + + $chain = new MappingDriverChain(); + + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver1->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo'))); + + $driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $driver2->expects($this->once()) + ->method('getAllClassNames') + ->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz'))); + + $chain->addDriver($driver1, 'Doctrine\Tests\Models\Company'); + $chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping'); + + $this->assertEquals(array( + 'Doctrine\Tests\Models\Company\Foo', + 'Doctrine\Tests\ORM\Mapping\Bar', + 'Doctrine\Tests\ORM\Mapping\Baz' + ), $chain->getAllClassNames()); + } + + /** + * @group DDC-706 + */ + public function testIsTransient() + { + $driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $chain = new MappingDriverChain(); + $chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS'); + + $this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient"); + } + + /** + * @group DDC-1412 + */ + public function testDefaultDriver() + { + $companyDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $dafaultDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $entityClassName = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity'; + $managerClassName = 'Doctrine\Tests\Models\Company\CompanyManager'; + $chain = new MappingDriverChain(); + + $companyDriver->expects($this->never()) + ->method('loadMetadataForClass'); + $companyDriver->expects($this->once()) + ->method('isTransient') + ->with($this->equalTo($managerClassName)) + ->will($this->returnValue(false)); + + $dafaultDriver->expects($this->never()) + ->method('loadMetadataForClass'); + $dafaultDriver->expects($this->once()) + ->method('isTransient') + ->with($this->equalTo($entityClassName)) + ->will($this->returnValue(true)); + + $this->assertNull($chain->getDefaultDriver()); + + $chain->setDefaultDriver($dafaultDriver); + $chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company'); + + $this->assertSame($dafaultDriver, $chain->getDefaultDriver()); + + $this->assertTrue($chain->isTransient($entityClassName)); + $this->assertFalse($chain->isTransient($managerClassName)); + } +} + +class DriverChainEntity +{ + +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php new file mode 100644 index 0000000..bc1559a --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php @@ -0,0 +1,139 @@ +getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver'); + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $this->cmf = new TestClassMetadataFactory($driver, $metadata); + } + + public function testGetCacheDriver() + { + $this->assertNull($this->cmf->getCacheDriver()); + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + $this->assertSame($cache, $this->cmf->getCacheDriver()); + } + + public function testGetMetadataFor() + { + $metadata = $this->cmf->getMetadataFor('stdClass'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor('stdClass')); + } + + public function testGetParentMetadata() + { + $metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity')); + } + + public function testGetCachedMetadata() + { + $metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $cache = new ArrayCache(); + $cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata); + + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + $this->assertSame($loadedMetadata, $metadata); + } + + public function testCacheGetMetadataFor() + { + $cache = new ArrayCache(); + $this->cmf->setCacheDriver($cache); + + $loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity'); + + $this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA')); + } + + public function testGetAliasedMetadata() + { + $loadedMetadata = $this->cmf->getMetadataFor('prefix:ChildEntity'); + + $this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity')); + $this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity')); + } +} + +class TestClassMetadataFactory extends AbstractClassMetadataFactory +{ + public $driver; + public $metadata; + + public function __construct($driver, $metadata) + { + $this->driver = $driver; + $this->metadata = $metadata; + } + + protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents) + { + + } + + protected function getFqcnFromAlias($namespaceAlias, $simpleClassName) + { + return __NAMESPACE__ . '\\' . $simpleClassName; + } + + protected function initialize() + { + + } + + protected function newClassMetadataInstance($className) + { + return $this->metadata; + } + + protected function getDriver() + { + return $this->driver; + } + protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService) + { + } + + protected function isEntity(ClassMetadata $class) + { + return true; + } +} + +class RootEntity +{ + +} + +class ChildEntity extends RootEntity +{ + +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php new file mode 100644 index 0000000..37072de --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php @@ -0,0 +1,90 @@ +assertEquals(array($path), $locator->getPaths()); + + $locator = new DefaultFileLocator($path); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetFileExtension() + { + $locator = new DefaultFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testUniquePaths() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path, $path)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertEquals(__DIR__ . '/_files' . DIRECTORY_SEPARATOR . 'stdClass.yml', $locator->findMappingFile('stdClass')); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->setExpectedException( + 'Doctrine\Common\Persistence\Mapping\MappingException', + "No mapping file found named 'stdClass2.yml' for class 'stdClass2'" + ); + $locator->findMappingFile('stdClass2'); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array('global', 'stdClass'), $classes); + $this->assertEquals(array('stdClass'), $locator->getAllClassNames("global")); + } + + public function testGetAllClassNamesNonMatchingFileExtension() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".xml"); + $this->assertEquals(array(), $locator->getAllClassNames("global")); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + + $locator = new DefaultFileLocator(array($path), ".yml"); + + $this->assertTrue($locator->fileExists("stdClass")); + $this->assertFalse($locator->fileExists("stdClass2")); + $this->assertTrue($locator->fileExists("global")); + $this->assertFalse($locator->fileExists("global2")); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php new file mode 100644 index 0000000..020c242 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php @@ -0,0 +1,142 @@ +assertNull($driver->getGlobalBasename()); + + $driver->setGlobalBasename("global"); + $this->assertEquals("global", $driver->getGlobalBasename()); + } + + public function testGetElementFromGlobalFile() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $element = $driver->getElement('stdGlobal'); + + $this->assertEquals('stdGlobal', $element); + } + + public function testGetElementFromFile() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('findMappingFile') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue(__DIR__ . '/_files/stdClass.yml')); + + $driver = new TestFileDriver($locator); + + $this->assertEquals('stdClass', $driver->getElement('stdClass')); + } + + public function testGetAllClassNamesGlobalBasename() + { + $driver = new TestFileDriver($this->newLocator()); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames); + } + + public function testGetAllClassNamesFromMappingFile() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo(null)) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdClass'), $classNames); + } + + public function testGetAllClassNamesBothSources() + { + $locator = $this->newLocator(); + $locator->expects($this->any()) + ->method('getAllClassNames') + ->with($this->equalTo('global')) + ->will($this->returnValue(array('stdClass'))); + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $classNames = $driver->getAllClassNames(); + + $this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames); + } + + public function testIsNotTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass')) + ->will($this->returnValue( true )); + + $driver = new TestFileDriver($locator); + $driver->setGlobalBasename("global"); + + $this->assertFalse($driver->isTransient('stdClass')); + $this->assertFalse($driver->isTransient('stdGlobal')); + $this->assertFalse($driver->isTransient('stdGlobal2')); + } + + public function testIsTransient() + { + $locator = $this->newLocator(); + $locator->expects($this->once()) + ->method('fileExists') + ->with($this->equalTo('stdClass2')) + ->will($this->returnValue( false )); + + $driver = new TestFileDriver($locator); + + $this->assertTrue($driver->isTransient('stdClass2')); + } + + public function testNonLocatorFallback() + { + $driver = new TestFileDriver(__DIR__ . '/_files', '.yml'); + $this->assertTrue($driver->isTransient('stdClass2')); + $this->assertFalse($driver->isTransient('stdClass')); + } + + private function newLocator() + { + $locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator'); + $locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml')); + $locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files"))); + return $locator; + } +} + +class TestFileDriver extends FileDriver +{ + protected function loadMappingFile($file) + { + if (strpos($file, "global.yml") !== false) { + return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2'); + } + return array('stdClass' => 'stdClass'); + } + + public function loadMetadataForClass($className, ClassMetadata $metadata) + { + + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php new file mode 100644 index 0000000..8fc4d80 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php @@ -0,0 +1,18 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new PHPDriver(array(__DIR__ . "/_files")); + $driver->loadMetadataForClass('TestEntity', $metadata); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php new file mode 100644 index 0000000..5f06cad --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; + +/** + * @group DCOM-93 + */ +class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new RuntimeReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertInstanceOf("ReflectionClass", $class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertInstanceOf("ReflectionProperty", $reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php new file mode 100644 index 0000000..9f1c568 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php @@ -0,0 +1,35 @@ +getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + $metadata->expects($this->once())->method('getFieldNames'); + + $driver = new StaticPHPDriver(array(__DIR__)); + $driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata); + } + + public function testGetAllClassNames() + { + $driver = new StaticPHPDriver(array(__DIR__)); + $classNames = $driver->getAllClassNames(); + + $this->assertContains( + 'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames); + } +} + +class TestEntity +{ + static public function loadMetadata($metadata) + { + $metadata->getFieldNames(); + } +} \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php new file mode 100644 index 0000000..ffce6d4 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php @@ -0,0 +1,70 @@ +. + */ + +namespace Doctrine\Tests\Common\Persistence\Mapping; + +use Doctrine\Common\Persistence\Mapping\StaticReflectionService; + +/** + * @group DCOM-93 + */ +class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase +{ + private $reflectionService; + + public function setUp() + { + $this->reflectionService = new StaticReflectionService(); + } + + public function testShortname() + { + $this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__)); + } + + public function testClassNamespaceName() + { + $this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__)); + } + + public function testGetParentClasses() + { + $classes = $this->reflectionService->getParentClasses(__CLASS__); + $this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection."); + } + + public function testGetReflectionClass() + { + $class = $this->reflectionService->getClass(__CLASS__); + $this->assertNull($class); + } + + public function testGetMethods() + { + $this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods")); + $this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2")); + } + + public function testGetAccessibleProperty() + { + $reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService"); + $this->assertNull($reflProp); + } +} + diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php new file mode 100644 index 0000000..b51162e --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php @@ -0,0 +1,88 @@ + $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path), $locator->getPaths()); + } + + public function testGetPrefixes() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix)); + $this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes()); + } + + public function testGetFileExtension() + { + $locator = new SymfonyFileLocator(array(), ".yml"); + $this->assertEquals(".yml", $locator->getFileExtension()); + $locator->setFileExtension(".xml"); + $this->assertEquals(".xml", $locator->getFileExtension()); + } + + public function testFileExists() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertTrue($locator->fileExists("Foo\stdClass")); + $this->assertTrue($locator->fileExists("Foo\global")); + $this->assertFalse($locator->fileExists("Foo\stdClass2")); + $this->assertFalse($locator->fileExists("Foo\global2")); + } + + public function testGetAllClassNames() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + $classes = $locator->getAllClassNames(null); + sort($classes); + + $this->assertEquals(array("Foo\\global", "Foo\\stdClass"), $classes); + $this->assertEquals(array("Foo\\stdClass"), $locator->getAllClassNames("global")); + } + + public function testFindMappingFile() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass")); + } + + public function testFindMappingFileNotFound() + { + $path = __DIR__ . "/_files"; + $prefix = "Foo"; + + $locator = new SymfonyFileLocator(array($path => $prefix), ".yml"); + + $this->setExpectedException( + "Doctrine\Common\Persistence\Mapping\MappingException", + "No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'." + ); + $locator->findMappingFile("Foo\\stdClass2"); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php new file mode 100644 index 0000000..d0e9976 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php @@ -0,0 +1,3 @@ +getFieldNames(); \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml new file mode 100644 index 0000000..30d74d2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php new file mode 100644 index 0000000..a0f77b5 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php @@ -0,0 +1,247 @@ +cm = new TestObjectMetadata; + $this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->om->expects($this->any())->method('getClassMetadata') + ->will($this->returnValue($this->cm)); + $this->object = new TestObject; + PersistentObject::setObjectManager($this->om); + $this->object->injectObjectManager($this->om, $this->cm); + } + + public function testGetObjectManager() + { + $this->assertSame($this->om, PersistentObject::getObjectManager()); + } + + public function testNonMatchingObjectManager() + { + $this->setExpectedException('RuntimeException'); + $om = $this->getMock('Doctrine\Common\Persistence\ObjectManager'); + $this->object->injectObjectManager($om, $this->cm); + } + + public function testGetField() + { + $this->assertEquals('beberlei', $this->object->getName()); + } + + public function testSetField() + { + $this->object->setName("test"); + $this->assertEquals("test", $this->object->getName()); + } + + public function testGetIdentifier() + { + $this->assertEquals(1, $this->object->getId()); + } + + public function testSetIdentifier() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setId(2); + } + + public function testSetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->setUnknown("test"); + } + + public function testGetUnknownField() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->getUnknown(); + } + + public function testGetToOneAssociation() + { + $this->assertNull($this->object->getParent()); + } + + public function testSetToOneAssociation() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->assertSame($parent, $this->object->getParent($parent)); + } + + public function testSetInvalidToOneAssocation() + { + $parent = new \stdClass(); + + $this->setExpectedException('InvalidArgumentException'); + $this->object->setParent($parent); + } + + public function testSetToOneAssociationNull() + { + $parent = new TestObject(); + $this->object->setParent($parent); + $this->object->setParent(null); + $this->assertNull($this->object->getParent()); + } + + public function testAddToManyAssocation() + { + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertSame($this->object, $child->getParent()); + $this->assertEquals(1, count($this->object->getChildren())); + + $child = new TestObject(); + $this->object->addChildren($child); + + $this->assertEquals(2, count($this->object->getChildren())); + } + + public function testAddInvalidToManyAssocation() + { + $this->setExpectedException('InvalidArgumentException'); + $this->object->addChildren(new \stdClass()); + } + + public function testNoObjectManagerSet() + { + PersistentObject::setObjectManager(null); + $child = new TestObject(); + + $this->setExpectedException('RuntimeException'); + $child->setName("test"); + } + + public function testInvalidMethod() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->asdf(); + } + + public function testAddInvalidCollection() + { + $this->setExpectedException('BadMethodCallException'); + $this->object->addAsdf(new \stdClass()); + } +} + +class TestObject extends PersistentObject +{ + protected $id = 1; + protected $name = 'beberlei'; + protected $parent; + protected $children; +} + +class TestObjectMetadata implements ClassMetadata +{ + + public function getAssociationMappedByTargetField($assocName) + { + $assoc = array('children' => 'parent'); + return $assoc[$assocName]; + } + + public function getAssociationNames() + { + return array('parent', 'children'); + } + + public function getAssociationTargetClass($assocName) + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getFieldNames() + { + return array('id', 'name'); + } + + public function getIdentifier() + { + return array('id'); + } + + public function getName() + { + return __NAMESPACE__ . '\TestObject'; + } + + public function getReflectionClass() + { + return new \ReflectionClass($this->getName()); + } + + public function getTypeOfField($fieldName) + { + $types = array('id' => 'integer', 'name' => 'string'); + return $types[$fieldName]; + } + + public function hasAssociation($fieldName) + { + return in_array($fieldName, array('parent', 'children')); + } + + public function hasField($fieldName) + { + return in_array($fieldName, array('id', 'name')); + } + + public function isAssociationInverseSide($assocName) + { + return ($assocName === 'children'); + } + + public function isCollectionValuedAssociation($fieldName) + { + return ($fieldName === 'children'); + } + + public function isIdentifier($fieldName) + { + return $fieldName === 'id'; + } + + public function isSingleValuedAssociation($fieldName) + { + return $fieldName === 'parent'; + } + + public function getIdentifierValues($entity) + { + + } + + public function getIdentifierFieldNames() + { + + } + + public function initializeReflection(ReflectionService $reflService) + { + + } + + public function wakeupReflection(ReflectionService $reflService) + { + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/DeeperNamespaceParent.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/DeeperNamespaceParent.php new file mode 100644 index 0000000..72faa77 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/DeeperNamespaceParent.php @@ -0,0 +1,7 @@ + array($testsRoot), + ); + $noParentClassName = 'Doctrine\\Tests\\Common\\Reflection\\NoParent'; + $staticReflectionParser = new StaticReflectionParser($noParentClassName, new Psr0FindFile($paths)); + $declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName(); + $this->assertEquals($noParentClassName, $declaringClassName); + + $className = 'Doctrine\\Tests\\Common\\Reflection\\FullyClassifiedParent'; + $staticReflectionParser = new StaticReflectionParser($className, new Psr0FindFile($paths)); + $declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName(); + $this->assertEquals($noParentClassName, $declaringClassName); + + $className = 'Doctrine\\Tests\\Common\\Reflection\\SameNamespaceParent'; + $staticReflectionParser = new StaticReflectionParser($className, new Psr0FindFile($paths)); + $declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName(); + $this->assertEquals($noParentClassName, $declaringClassName); + + $dummyParentClassName = 'Doctrine\\Tests\\Common\\Reflection\\Dummies\\NoParent'; + + $className = 'Doctrine\\Tests\\Common\\Reflection\\DeeperNamespaceParent'; + $staticReflectionParser = new StaticReflectionParser($className, new Psr0FindFile($paths)); + $declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName(); + $this->assertEquals($dummyParentClassName, $declaringClassName); + + $className = 'Doctrine\\Tests\\Common\\Reflection\\UseParent'; + $staticReflectionParser = new StaticReflectionParser($className, new Psr0FindFile($paths)); + $declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName(); + $this->assertEquals($dummyParentClassName, $declaringClassName); + + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/UseParent.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/UseParent.php new file mode 100644 index 0000000..dd512d4 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/UseParent.php @@ -0,0 +1,9 @@ +assertEquals($expectedClassName, ClassUtils::getRealClass($className)); + } + + /** + * @dataProvider dataGetClass + */ + public function testGetClass( $className, $expectedClassName ) + { + $object = new $className(); + $this->assertEquals($expectedClassName, ClassUtils::getClass($object)); + } + + public function testGetParentClass() + { + $parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' ); + $this->assertEquals('stdClass', $parentClass); + } + + public function testGenerateProxyClassName() + { + $this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionClass( $className, $expectedClassName ) + { + $reflClass = ClassUtils::newReflectionClass( $className ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + + /** + * @dataProvider dataGetClass + */ + public function testNewReflectionObject( $className, $expectedClassName ) + { + $object = new $className; + $reflClass = ClassUtils::newReflectionObject( $object ); + $this->assertEquals( $expectedClassName, $reflClass->getName() ); + } + } + + class ChildObject extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__ +{ + class stdClass extends \stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__ +{ + class stdClass extends \MyProject\Proxies\__CG__\stdClass + { + } +} + +namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util +{ + class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject + { + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php new file mode 100644 index 0000000..b4e9eed --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/DebugTest.php @@ -0,0 +1,27 @@ +foo = "bar"; + $obj->bar = 1234; + + $var = Debug::export($obj, 2); + $this->assertEquals( "stdClass", $var->__CLASS__ ); + } + + public function testExportDateTime() + { + $obj = new \DateTime( "2010-10-10 10:10:10" ); + + $var = Debug::export( $obj, 2 ); + $this->assertEquals( "DateTime", $var->__CLASS__ ); + } +} diff --git a/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php new file mode 100644 index 0000000..e8323d2 --- /dev/null +++ b/vendor/doctrine/common/tests/Doctrine/Tests/DoctrineTestCase.php @@ -0,0 +1,10 @@ + + */ +class NativePhpunitTask extends Task +{ + private $test; + private $testfile; + private $testdirectory; + private $configuration = null; + private $coverageClover = null; + private $junitlogfile = null; + private $haltonfailure = true; + private $haltonerror = true; + + public function setTestdirectory($directory) { + $this->testdirectory = $directory; + } + + public function setTest($test) { + $this->test = $test; + } + + public function setTestfile($testfile) { + $this->testfile = $testfile; + } + + public function setJunitlogfile($junitlogfile) { + if (strlen($junitlogfile) == 0) { + $junitlogfile = NULL; + } + + $this->junitlogfile = $junitlogfile; + } + + public function setConfiguration($configuration) { + if (strlen($configuration) == 0) { + $configuration = NULL; + } + + $this->configuration = $configuration; + } + + public function setCoverageClover($coverageClover) { + if (strlen($coverageClover) == 0) { + $coverageClover = NULL; + } + + $this->coverageClover = $coverageClover; + } + + public function setHaltonfailure($haltonfailures) { + $this->haltonfailure = $haltonfailures; + } + + public function setHaltonerror($haltonerrors) { + $this->haltonerror = $haltonerrors; + } + + public function init() + { + require_once "PHPUnit/Runner/Version.php"; + $version = PHPUnit_Runner_Version::id(); + + if (version_compare($version, '3.4.0') < 0) { + throw new BuildException("NativePHPUnitTask requires PHPUnit version >= 3.2.0", $this->getLocation()); + } + + require_once 'PHPUnit/Util/Filter.php'; + + // point PHPUnit_MAIN_METHOD define to non-existing method + if (!defined('PHPUnit_MAIN_METHOD')) { + define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined'); + } + } + + public function main() + { + if (!is_dir(realpath($this->testdirectory))) { + throw new BuildException("NativePHPUnitTask requires a Test Directory path given, '".$this->testdirectory."' given."); + } + set_include_path(realpath($this->testdirectory) . PATH_SEPARATOR . get_include_path()); + + $printer = new NativePhpunitPrinter(); + + $arguments = array( + 'configuration' => $this->configuration, + 'coverageClover' => $this->coverageClover, + 'junitLogfile' => $this->junitlogfile, + 'printer' => $printer, + ); + + $runner = new PHPUnit_TextUI_TestRunner(); + $suite = $runner->getTest($this->test, $this->testfile, true); + + try { + $result = $runner->doRun($suite, $arguments); + /* @var $result PHPUnit_Framework_TestResult */ + + if ( ($this->haltonfailure && $result->failureCount() > 0) || ($this->haltonerror && $result->errorCount() > 0) ) { + throw new BuildException("PHPUnit: ".$result->failureCount()." Failures and ".$result->errorCount()." Errors, ". + "last failure message: ".$printer->getMessages()); + } + + $this->log("PHPUnit Success: ".count($result->passed())." tests passed, no ". + "failures (".$result->skippedCount()." skipped, ".$result->notImplementedCount()." not implemented)"); + + // Hudson for example doesn't like the backslash in class names + if (file_exists($this->coverageClover)) { + $this->log("Generated Clover Coverage XML to: ".$this->coverageClover); + $content = file_get_contents($this->coverageClover); + $content = str_replace("\\", ".", $content); + file_put_contents($this->coverageClover, $content); + unset($content); + } + + } catch(\Exception $e) { + throw new BuildException("NativePhpunitTask failed: ".$e->getMessage()); + } + } +} + +class NativePhpunitPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener +{ + private $_messages = array(); + + public function write($buffer) + { + // do nothing + } + + public function getMessages() + { + return $this->_messages; + } + + /** + * An error occurred. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) + { + $this->_messages[] = "Test ERROR: ".$test->getName().": ".$e->getMessage(); + } + + /** + * A failure occurred. + * + * @param PHPUnit_Framework_Test $test + * @param PHPUnit_Framework_AssertionFailedError $e + * @param float $time + */ + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) + { + $this->_messages[] = "Test FAILED: ".$test->getName().": ".$e->getMessage(); + } + + /** + * Incomplete test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + */ + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * Skipped test. + * + * @param PHPUnit_Framework_Test $test + * @param Exception $e + * @param float $time + * @since Method available since Release 3.0.0 + */ + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) + { + + } + + /** + * A test suite started. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test suite ended. + * + * @param PHPUnit_Framework_TestSuite $suite + * @since Method available since Release 2.2.0 + */ + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) + { + + } + + /** + * A test started. + * + * @param PHPUnit_Framework_Test $test + */ + public function startTest(PHPUnit_Framework_Test $test) + { + + } + + /** + * A test ended. + * + * @param PHPUnit_Framework_Test $test + * @param float $time + */ + public function endTest(PHPUnit_Framework_Test $test, $time) + { + + } +} diff --git a/vendor/doctrine/common/tests/README.markdown b/vendor/doctrine/common/tests/README.markdown new file mode 100644 index 0000000..e6f1703 --- /dev/null +++ b/vendor/doctrine/common/tests/README.markdown @@ -0,0 +1,27 @@ +# Running the Doctrine 2 Testsuite + +## Running tests + +Execute PHPUnit in the root folder of your doctrine-common clone. + + phpunit + +## Testing Lock-Support + +The Lock support in Doctrine 2 is tested using Gearman, which allows to run concurrent tasks in parallel. +Install Gearman with PHP as follows: + +1. Go to http://www.gearman.org and download the latest Gearman Server +2. Compile it and then call ldconfig +3. Start it up "gearmand -vvvv" +4. Install pecl/gearman by calling "gearman-beta" + +You can then go into tests/ and start up two workers: + + php Doctrine/Tests/ORM/Functional/Locking/LockAgentWorker.php + +Then run the locking test-suite: + + phpunit --configuration Doctrine/Tests/ORM/Functional/Locking/GearmanLockTest.php + +This can run considerable time, because it is using sleep() to test for the timing ranges of locks. \ No newline at end of file diff --git a/vendor/events-radar/radar-api-php b/vendor/events-radar/radar-api-php new file mode 160000 index 0000000..e465da5 --- /dev/null +++ b/vendor/events-radar/radar-api-php @@ -0,0 +1 @@ +Subproject commit e465da5483830c648abdf7900f5f98f417346b51 diff --git a/vendor/guzzle/cache/Guzzle/Cache/AbstractCacheAdapter.php b/vendor/guzzle/cache/Guzzle/Cache/AbstractCacheAdapter.php new file mode 100644 index 0000000..a5c5271 --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/AbstractCacheAdapter.php @@ -0,0 +1,21 @@ +cache; + } +} diff --git a/vendor/guzzle/cache/Guzzle/Cache/CacheAdapterFactory.php b/vendor/guzzle/cache/Guzzle/Cache/CacheAdapterFactory.php new file mode 100644 index 0000000..94e6234 --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/CacheAdapterFactory.php @@ -0,0 +1,117 @@ +newInstanceArgs($args); + } + } catch (\Exception $e) { + throw new RuntimeException($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/vendor/guzzle/cache/Guzzle/Cache/CacheAdapterInterface.php b/vendor/guzzle/cache/Guzzle/Cache/CacheAdapterInterface.php new file mode 100644 index 0000000..970c9e2 --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/CacheAdapterInterface.php @@ -0,0 +1,55 @@ +callables = $callables; + } + + public function contains($id, array $options = null) + { + return call_user_func($this->callables['contains'], $id, $options); + } + + public function delete($id, array $options = null) + { + return call_user_func($this->callables['delete'], $id, $options); + } + + public function fetch($id, array $options = null) + { + return call_user_func($this->callables['fetch'], $id, $options); + } + + public function save($id, $data, $lifeTime = false, array $options = null) + { + return call_user_func($this->callables['save'], $id, $data, $lifeTime, $options); + } +} diff --git a/vendor/guzzle/cache/Guzzle/Cache/DoctrineCacheAdapter.php b/vendor/guzzle/cache/Guzzle/Cache/DoctrineCacheAdapter.php new file mode 100644 index 0000000..321dd6b --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/DoctrineCacheAdapter.php @@ -0,0 +1,41 @@ +cache = $cache; + } + + public function contains($id, array $options = null) + { + return $this->cache->contains($id); + } + + public function delete($id, array $options = null) + { + return $this->cache->delete($id); + } + + public function fetch($id, array $options = null) + { + return $this->cache->fetch($id); + } + + public function save($id, $data, $lifeTime = false, array $options = null) + { + return $this->cache->save($id, $data, $lifeTime); + } +} diff --git a/vendor/guzzle/cache/Guzzle/Cache/NullCacheAdapter.php b/vendor/guzzle/cache/Guzzle/Cache/NullCacheAdapter.php new file mode 100644 index 0000000..68bd4af --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/NullCacheAdapter.php @@ -0,0 +1,31 @@ +cache = $cache; + } + + public function contains($id, array $options = null) + { + return $this->cache->test($id); + } + + public function delete($id, array $options = null) + { + return $this->cache->remove($id); + } + + public function fetch($id, array $options = null) + { + return $this->cache->load($id); + } + + public function save($id, $data, $lifeTime = false, array $options = null) + { + return $this->cache->save($data, $id, array(), $lifeTime); + } +} diff --git a/vendor/guzzle/cache/Guzzle/Cache/Zf2CacheAdapter.php b/vendor/guzzle/cache/Guzzle/Cache/Zf2CacheAdapter.php new file mode 100644 index 0000000..1fc18a5 --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/Zf2CacheAdapter.php @@ -0,0 +1,41 @@ +cache = $cache; + } + + public function contains($id, array $options = null) + { + return $this->cache->hasItem($id); + } + + public function delete($id, array $options = null) + { + return $this->cache->removeItem($id); + } + + public function fetch($id, array $options = null) + { + return $this->cache->getItem($id); + } + + public function save($id, $data, $lifeTime = false, array $options = null) + { + return $this->cache->setItem($id, $data); + } +} diff --git a/vendor/guzzle/cache/Guzzle/Cache/composer.json b/vendor/guzzle/cache/Guzzle/Cache/composer.json new file mode 100644 index 0000000..a5d999b --- /dev/null +++ b/vendor/guzzle/cache/Guzzle/Cache/composer.json @@ -0,0 +1,27 @@ +{ + "name": "guzzle/cache", + "description": "Guzzle cache adapter component", + "homepage": "http://guzzlephp.org/", + "keywords": ["cache", "adapter", "zf", "doctrine", "guzzle"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle/common": "self.version" + }, + "autoload": { + "psr-0": { "Guzzle\\Cache": "" } + }, + "target-dir": "Guzzle/Cache", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} diff --git a/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php b/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php new file mode 100644 index 0000000..d1e842b --- /dev/null +++ b/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php @@ -0,0 +1,49 @@ +eventDispatcher = $eventDispatcher; + + return $this; + } + + public function getEventDispatcher() + { + if (!$this->eventDispatcher) { + $this->eventDispatcher = new EventDispatcher(); + } + + return $this->eventDispatcher; + } + + public function dispatch($eventName, array $context = array()) + { + return $this->getEventDispatcher()->dispatch($eventName, new Event($context)); + } + + public function addSubscriber(EventSubscriberInterface $subscriber) + { + $this->getEventDispatcher()->addSubscriber($subscriber); + + return $this; + } +} diff --git a/vendor/guzzle/common/Guzzle/Common/Collection.php b/vendor/guzzle/common/Guzzle/Common/Collection.php new file mode 100644 index 0000000..5cb1535 --- /dev/null +++ b/vendor/guzzle/common/Guzzle/Common/Collection.php @@ -0,0 +1,403 @@ +data = $data; + } + + /** + * Create a new collection from an array, validate the keys, and add default values where missing + * + * @param array $config Configuration values to apply. + * @param array $defaults Default parameters + * @param array $required Required parameter names + * + * @return self + * @throws InvalidArgumentException if a parameter is missing + */ + public static function fromConfig(array $config = array(), array $defaults = array(), array $required = array()) + { + $data = $config + $defaults; + + if ($missing = array_diff($required, array_keys($data))) { + throw new InvalidArgumentException('Config is missing the following keys: ' . implode(', ', $missing)); + } + + return new self($data); + } + + public function count() + { + return count($this->data); + } + + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + public function toArray() + { + return $this->data; + } + + /** + * Removes all key value pairs + * + * @return Collection + */ + public function clear() + { + $this->data = array(); + + return $this; + } + + /** + * Get all or a subset of matching key value pairs + * + * @param array $keys Pass an array of keys to retrieve only a subset of key value pairs + * + * @return array Returns an array of all matching key value pairs + */ + public function getAll(array $keys = null) + { + return $keys ? array_intersect_key($this->data, array_flip($keys)) : $this->data; + } + + /** + * Get a specific key value. + * + * @param string $key Key to retrieve. + * + * @return mixed|null Value of the key or NULL + */ + public function get($key) + { + return isset($this->data[$key]) ? $this->data[$key] : null; + } + + /** + * Set a key value pair + * + * @param string $key Key to set + * @param mixed $value Value to set + * + * @return Collection Returns a reference to the object + */ + public function set($key, $value) + { + $this->data[$key] = $value; + + return $this; + } + + /** + * Add a value to a key. If a key of the same name has already been added, the key value will be converted into an + * array and the new value will be pushed to the end of the array. + * + * @param string $key Key to add + * @param mixed $value Value to add to the key + * + * @return Collection Returns a reference to the object. + */ + public function add($key, $value) + { + if (!array_key_exists($key, $this->data)) { + $this->data[$key] = $value; + } elseif (is_array($this->data[$key])) { + $this->data[$key][] = $value; + } else { + $this->data[$key] = array($this->data[$key], $value); + } + + return $this; + } + + /** + * Remove a specific key value pair + * + * @param string $key A key to remove + * + * @return Collection + */ + public function remove($key) + { + unset($this->data[$key]); + + return $this; + } + + /** + * Get all keys in the collection + * + * @return array + */ + public function getKeys() + { + return array_keys($this->data); + } + + /** + * Returns whether or not the specified key is present. + * + * @param string $key The key for which to check the existence. + * + * @return bool + */ + public function hasKey($key) + { + return array_key_exists($key, $this->data); + } + + /** + * Case insensitive search the keys in the collection + * + * @param string $key Key to search for + * + * @return bool|string Returns false if not found, otherwise returns the key + */ + public function keySearch($key) + { + foreach (array_keys($this->data) as $k) { + if (!strcasecmp($k, $key)) { + return $k; + } + } + + return false; + } + + /** + * Checks if any keys contains a certain value + * + * @param string $value Value to search for + * + * @return mixed Returns the key if the value was found FALSE if the value was not found. + */ + public function hasValue($value) + { + return array_search($value, $this->data); + } + + /** + * Replace the data of the object with the value of an array + * + * @param array $data Associative array of data + * + * @return Collection Returns a reference to the object + */ + public function replace(array $data) + { + $this->data = $data; + + return $this; + } + + /** + * Add and merge in a Collection or array of key value pair data. + * + * @param Collection|array $data Associative array of key value pair data + * + * @return Collection Returns a reference to the object. + */ + public function merge($data) + { + foreach ($data as $key => $value) { + $this->add($key, $value); + } + + return $this; + } + + /** + * Over write key value pairs in this collection with all of the data from an array or collection. + * + * @param array|\Traversable $data Values to override over this config + * + * @return self + */ + public function overwriteWith($data) + { + if (is_array($data)) { + $this->data = $data + $this->data; + } elseif ($data instanceof Collection) { + $this->data = $data->toArray() + $this->data; + } else { + foreach ($data as $key => $value) { + $this->data[$key] = $value; + } + } + + return $this; + } + + /** + * Returns a Collection containing all the elements of the collection after applying the callback function to each + * one. The Closure should accept three parameters: (string) $key, (string) $value, (array) $context and return a + * modified value + * + * @param \Closure $closure Closure to apply + * @param array $context Context to pass to the closure + * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection + * + * @return Collection + */ + public function map(\Closure $closure, array $context = array(), $static = true) + { + $collection = $static ? new static() : new self(); + foreach ($this as $key => $value) { + $collection->add($key, $closure($key, $value, $context)); + } + + return $collection; + } + + /** + * Iterates over each key value pair in the collection passing them to the Closure. If the Closure function returns + * true, the current value from input is returned into the result Collection. The Closure must accept three + * parameters: (string) $key, (string) $value and return Boolean TRUE or FALSE for each value. + * + * @param \Closure $closure Closure evaluation function + * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection + * + * @return Collection + */ + public function filter(\Closure $closure, $static = true) + { + $collection = ($static) ? new static() : new self(); + foreach ($this->data as $key => $value) { + if ($closure($key, $value)) { + $collection->add($key, $value); + } + } + + return $collection; + } + + public function offsetExists($offset) + { + return isset($this->data[$offset]); + } + + public function offsetGet($offset) + { + return isset($this->data[$offset]) ? $this->data[$offset] : null; + } + + public function offsetSet($offset, $value) + { + $this->data[$offset] = $value; + } + + public function offsetUnset($offset) + { + unset($this->data[$offset]); + } + + /** + * Set a value into a nested array key. Keys will be created as needed to set the value. + * + * @param string $path Path to set + * @param mixed $value Value to set at the key + * + * @return self + * @throws RuntimeException when trying to setPath using a nested path that travels through a scalar value + */ + public function setPath($path, $value) + { + $current =& $this->data; + $queue = explode('/', $path); + while (null !== ($key = array_shift($queue))) { + if (!is_array($current)) { + throw new RuntimeException("Trying to setPath {$path}, but {$key} is set and is not an array"); + } elseif (!$queue) { + $current[$key] = $value; + } elseif (isset($current[$key])) { + $current =& $current[$key]; + } else { + $current[$key] = array(); + $current =& $current[$key]; + } + } + + return $this; + } + + /** + * Gets a value from the collection using an array path (e.g. foo/baz/bar would retrieve bar from two nested arrays) + * Allows for wildcard searches which recursively combine matches up to the level at which the wildcard occurs. This + * can be useful for accepting any key of a sub-array and combining matching keys from each diverging path. + * + * @param string $path Path to traverse and retrieve a value from + * @param string $separator Character used to add depth to the search + * @param mixed $data Optional data to descend into (used when wildcards are encountered) + * + * @return mixed|null + */ + public function getPath($path, $separator = '/', $data = null) + { + if ($data === null) { + $data =& $this->data; + } + + $path = is_array($path) ? $path : explode($separator, $path); + while (null !== ($part = array_shift($path))) { + if (!is_array($data)) { + return null; + } elseif (isset($data[$part])) { + $data =& $data[$part]; + } elseif ($part != '*') { + return null; + } else { + // Perform a wildcard search by diverging and merging paths + $result = array(); + foreach ($data as $value) { + if (!$path) { + $result = array_merge_recursive($result, (array) $value); + } elseif (null !== ($test = $this->getPath($path, $separator, $value))) { + $result = array_merge_recursive($result, (array) $test); + } + } + return $result; + } + } + + return $data; + } + + /** + * Inject configuration settings into an input string + * + * @param string $input Input to inject + * + * @return string + * @deprecated + */ + public function inject($input) + { + Version::warn(__METHOD__ . ' is deprecated'); + $replace = array(); + foreach ($this->data as $key => $val) { + $replace['{' . $key . '}'] = $val; + } + + return strtr($input, $replace); + } +} diff --git a/vendor/guzzle/common/Guzzle/Common/Event.php b/vendor/guzzle/common/Guzzle/Common/Event.php new file mode 100644 index 0000000..fad76a9 --- /dev/null +++ b/vendor/guzzle/common/Guzzle/Common/Event.php @@ -0,0 +1,52 @@ +context = $context; + } + + public function getIterator() + { + return new \ArrayIterator($this->context); + } + + public function offsetGet($offset) + { + return isset($this->context[$offset]) ? $this->context[$offset] : null; + } + + public function offsetSet($offset, $value) + { + $this->context[$offset] = $value; + } + + public function offsetExists($offset) + { + return isset($this->context[$offset]); + } + + public function offsetUnset($offset) + { + unset($this->context[$offset]); + } + + public function toArray() + { + return $this->context; + } +} diff --git a/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php b/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php new file mode 100644 index 0000000..08d1c72 --- /dev/null +++ b/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php @@ -0,0 +1,5 @@ +shortMessage = $message; + } + + /** + * Set all of the exceptions + * + * @param array $exceptions Array of exceptions + * + * @return self + */ + public function setExceptions(array $exceptions) + { + $this->exceptions = array(); + foreach ($exceptions as $exception) { + $this->add($exception); + } + + return $this; + } + + /** + * Add exceptions to the collection + * + * @param ExceptionCollection|\Exception $e Exception to add + * + * @return ExceptionCollection; + */ + public function add($e) + { + $this->exceptions[] = $e; + if ($this->message) { + $this->message .= "\n"; + } + + $this->message .= $this->getExceptionMessage($e, 0); + + return $this; + } + + /** + * Get the total number of request exceptions + * + * @return int + */ + public function count() + { + return count($this->exceptions); + } + + /** + * Allows array-like iteration over the request exceptions + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->exceptions); + } + + /** + * Get the first exception in the collection + * + * @return \Exception + */ + public function getFirst() + { + return $this->exceptions ? $this->exceptions[0] : null; + } + + private function getExceptionMessage(\Exception $e, $depth = 0) + { + static $sp = ' '; + $prefix = $depth ? str_repeat($sp, $depth) : ''; + $message = "{$prefix}(" . get_class($e) . ') ' . $e->getFile() . ' line ' . $e->getLine() . "\n"; + + if ($e instanceof self) { + if ($e->shortMessage) { + $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->shortMessage) . "\n"; + } + foreach ($e as $ee) { + $message .= "\n" . $this->getExceptionMessage($ee, $depth + 1); + } + } else { + $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getMessage()) . "\n"; + $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getTraceAsString()) . "\n"; + } + + return str_replace(getcwd(), '.', $message); + } +} diff --git a/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php b/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php new file mode 100644 index 0000000..458e6f2 --- /dev/null +++ b/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php @@ -0,0 +1,8 @@ +=5.3.2", + "symfony/event-dispatcher": ">=2.1" + }, + "autoload": { + "psr-0": { "Guzzle\\Common": "" } + }, + "target-dir": "Guzzle/Common", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php b/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php new file mode 100644 index 0000000..5005a88 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php @@ -0,0 +1,221 @@ +body = $body; + } + + public function __toString() + { + return (string) $this->body; + } + + /** + * Allow decorators to implement custom methods + * + * @param string $method Missing method name + * @param array $args Method arguments + * + * @return mixed + */ + public function __call($method, array $args) + { + return call_user_func_array(array($this->body, $method), $args); + } + + public function close() + { + return $this->body->close(); + } + + public function setRewindFunction($callable) + { + $this->body->setRewindFunction($callable); + + return $this; + } + + public function rewind() + { + return $this->body->rewind(); + } + + public function compress($filter = 'zlib.deflate') + { + return $this->body->compress($filter); + } + + public function uncompress($filter = 'zlib.inflate') + { + return $this->body->uncompress($filter); + } + + public function getContentLength() + { + return $this->getSize(); + } + + public function getContentType() + { + return $this->body->getContentType(); + } + + public function getContentMd5($rawOutput = false, $base64Encode = false) + { + $hash = Stream::getHash($this, 'md5', $rawOutput); + + return $hash && $base64Encode ? base64_encode($hash) : $hash; + } + + public function getContentEncoding() + { + return $this->body->getContentEncoding(); + } + + public function getMetaData($key = null) + { + return $this->body->getMetaData($key); + } + + public function getStream() + { + return $this->body->getStream(); + } + + public function setStream($stream, $size = 0) + { + $this->body->setStream($stream, $size); + + return $this; + } + + public function detachStream() + { + $this->body->detachStream(); + + return $this; + } + + public function getWrapper() + { + return $this->body->getWrapper(); + } + + public function getWrapperData() + { + return $this->body->getWrapperData(); + } + + public function getStreamType() + { + return $this->body->getStreamType(); + } + + public function getUri() + { + return $this->body->getUri(); + } + + public function getSize() + { + return $this->body->getSize(); + } + + public function isReadable() + { + return $this->body->isReadable(); + } + + public function isRepeatable() + { + return $this->isSeekable() && $this->isReadable(); + } + + public function isWritable() + { + return $this->body->isWritable(); + } + + public function isConsumed() + { + return $this->body->isConsumed(); + } + + /** + * Alias of isConsumed() + * {@inheritdoc} + */ + public function feof() + { + return $this->isConsumed(); + } + + public function isLocal() + { + return $this->body->isLocal(); + } + + public function isSeekable() + { + return $this->body->isSeekable(); + } + + public function setSize($size) + { + $this->body->setSize($size); + + return $this; + } + + public function seek($offset, $whence = SEEK_SET) + { + return $this->body->seek($offset, $whence); + } + + public function read($length) + { + return $this->body->read($length); + } + + public function write($string) + { + return $this->body->write($string); + } + + public function readLine($maxLength = null) + { + return $this->body->readLine($maxLength); + } + + public function ftell() + { + return $this->body->ftell(); + } + + public function getCustomData($key) + { + return $this->body->getCustomData($key); + } + + public function setCustomData($key, $value) + { + $this->body->setCustomData($key, $value); + + return $this; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php b/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php new file mode 100644 index 0000000..c65c136 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php @@ -0,0 +1,229 @@ +remoteStream = $body; + $this->body = new EntityBody(fopen('php://temp', 'r+')); + } + + /** + * Will give the contents of the buffer followed by the exhausted remote stream. + * + * Warning: Loads the entire stream into memory + * + * @return string + */ + public function __toString() + { + $pos = $this->ftell(); + $this->rewind(); + + $str = ''; + while (!$this->isConsumed()) { + $str .= $this->read(16384); + } + + $this->seek($pos); + + return $str; + } + + public function getSize() + { + return max($this->body->getSize(), $this->remoteStream->getSize()); + } + + /** + * {@inheritdoc} + * @throws RuntimeException When seeking with SEEK_END or when seeking past the total size of the buffer stream + */ + public function seek($offset, $whence = SEEK_SET) + { + if ($whence == SEEK_SET) { + $byte = $offset; + } elseif ($whence == SEEK_CUR) { + $byte = $offset + $this->ftell(); + } else { + throw new RuntimeException(__CLASS__ . ' supports only SEEK_SET and SEEK_CUR seek operations'); + } + + // You cannot skip ahead past where you've read from the remote stream + if ($byte > $this->body->getSize()) { + throw new RuntimeException( + "Cannot seek to byte {$byte} when the buffered stream only contains {$this->body->getSize()} bytes" + ); + } + + return $this->body->seek($byte); + } + + public function rewind() + { + return $this->seek(0); + } + + /** + * Does not support custom rewind functions + * + * @throws RuntimeException + */ + public function setRewindFunction($callable) + { + throw new RuntimeException(__CLASS__ . ' does not support custom stream rewind functions'); + } + + public function read($length) + { + // Perform a regular read on any previously read data from the buffer + $data = $this->body->read($length); + $remaining = $length - strlen($data); + + // More data was requested so read from the remote stream + if ($remaining) { + // If data was written to the buffer in a position that would have been filled from the remote stream, + // then we must skip bytes on the remote stream to emulate overwriting bytes from that position. This + // mimics the behavior of other PHP stream wrappers. + $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); + + if ($this->skipReadBytes) { + $len = strlen($remoteData); + $remoteData = substr($remoteData, $this->skipReadBytes); + $this->skipReadBytes = max(0, $this->skipReadBytes - $len); + } + + $data .= $remoteData; + $this->body->write($remoteData); + } + + return $data; + } + + public function write($string) + { + // When appending to the end of the currently read stream, you'll want to skip bytes from being read from + // the remote stream to emulate other stream wrappers. Basically replacing bytes of data of a fixed length. + $overflow = (strlen($string) + $this->ftell()) - $this->remoteStream->ftell(); + if ($overflow > 0) { + $this->skipReadBytes += $overflow; + } + + return $this->body->write($string); + } + + /** + * {@inheritdoc} + * @link http://php.net/manual/en/function.fgets.php + */ + public function readLine($maxLength = null) + { + $buffer = ''; + $size = 0; + while (!$this->isConsumed()) { + $byte = $this->read(1); + $buffer .= $byte; + // Break when a new line is found or the max length - 1 is reached + if ($byte == PHP_EOL || ++$size == $maxLength - 1) { + break; + } + } + + return $buffer; + } + + public function isConsumed() + { + return $this->body->isConsumed() && $this->remoteStream->isConsumed(); + } + + /** + * Close both the remote stream and buffer stream + */ + public function close() + { + return $this->remoteStream->close() && $this->body->close(); + } + + public function setStream($stream, $size = 0) + { + $this->remoteStream->setStream($stream, $size); + } + + public function getContentType() + { + return $this->remoteStream->getContentType(); + } + + public function getContentEncoding() + { + return $this->remoteStream->getContentEncoding(); + } + + public function getMetaData($key = null) + { + return $this->remoteStream->getMetaData($key); + } + + public function getStream() + { + return $this->remoteStream->getStream(); + } + + public function getWrapper() + { + return $this->remoteStream->getWrapper(); + } + + public function getWrapperData() + { + return $this->remoteStream->getWrapperData(); + } + + public function getStreamType() + { + return $this->remoteStream->getStreamType(); + } + + public function getUri() + { + return $this->remoteStream->getUri(); + } + + /** + * Always retrieve custom data from the remote stream + * {@inheritdoc} + */ + public function getCustomData($key) + { + return $this->remoteStream->getCustomData($key); + } + + /** + * Always set custom data on the remote stream + * {@inheritdoc} + */ + public function setCustomData($key, $value) + { + $this->remoteStream->setCustomData($key, $value); + + return $this; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Client.php b/vendor/guzzle/http/Guzzle/Http/Client.php new file mode 100644 index 0000000..3d7298d --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Client.php @@ -0,0 +1,524 @@ +setConfig($config ?: new Collection()); + $this->initSsl(); + $this->setBaseUrl($baseUrl); + $this->defaultHeaders = new Collection(); + $this->setRequestFactory(RequestFactory::getInstance()); + $this->userAgent = $this->getDefaultUserAgent(); + if (!$this->config[self::DISABLE_REDIRECTS]) { + $this->addSubscriber(new RedirectPlugin()); + } + } + + final public function setConfig($config) + { + if ($config instanceof Collection) { + $this->config = $config; + } elseif (is_array($config)) { + $this->config = new Collection($config); + } else { + throw new InvalidArgumentException('Config must be an array or Collection'); + } + + return $this; + } + + final public function getConfig($key = false) + { + return $key ? $this->config[$key] : $this->config; + } + + /** + * Set a default request option on the client that will be used as a default for each request + * + * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo) + * @param mixed $value Value to set + * + * @return $this + */ + public function setDefaultOption($keyOrPath, $value) + { + $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath; + $this->config->setPath($keyOrPath, $value); + + return $this; + } + + /** + * Retrieve a default request option from the client + * + * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo) + * + * @return mixed|null + */ + public function getDefaultOption($keyOrPath) + { + $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath; + + return $this->config->getPath($keyOrPath); + } + + final public function setSslVerification($certificateAuthority = true, $verifyPeer = true, $verifyHost = 2) + { + $opts = $this->config[self::CURL_OPTIONS] ?: array(); + + if ($certificateAuthority === true) { + // use bundled CA bundle, set secure defaults + $opts[CURLOPT_CAINFO] = __DIR__ . '/Resources/cacert.pem'; + $opts[CURLOPT_SSL_VERIFYPEER] = true; + $opts[CURLOPT_SSL_VERIFYHOST] = 2; + } elseif ($certificateAuthority === false) { + unset($opts[CURLOPT_CAINFO]); + $opts[CURLOPT_SSL_VERIFYPEER] = false; + $opts[CURLOPT_SSL_VERIFYHOST] = 0; + } elseif ($verifyPeer !== true && $verifyPeer !== false && $verifyPeer !== 1 && $verifyPeer !== 0) { + throw new InvalidArgumentException('verifyPeer must be 1, 0 or boolean'); + } elseif ($verifyHost !== 0 && $verifyHost !== 1 && $verifyHost !== 2) { + throw new InvalidArgumentException('verifyHost must be 0, 1 or 2'); + } else { + $opts[CURLOPT_SSL_VERIFYPEER] = $verifyPeer; + $opts[CURLOPT_SSL_VERIFYHOST] = $verifyHost; + if (is_file($certificateAuthority)) { + unset($opts[CURLOPT_CAPATH]); + $opts[CURLOPT_CAINFO] = $certificateAuthority; + } elseif (is_dir($certificateAuthority)) { + unset($opts[CURLOPT_CAINFO]); + $opts[CURLOPT_CAPATH] = $certificateAuthority; + } else { + throw new RuntimeException( + 'Invalid option passed to ' . self::SSL_CERT_AUTHORITY . ': ' . $certificateAuthority + ); + } + } + + $this->config->set(self::CURL_OPTIONS, $opts); + + return $this; + } + + public function createRequest($method = 'GET', $uri = null, $headers = null, $body = null, array $options = array()) + { + if (!$uri) { + $url = $this->getBaseUrl(); + } else { + if (!is_array($uri)) { + $templateVars = null; + } else { + list($uri, $templateVars) = $uri; + } + if (strpos($uri, '://')) { + // Use absolute URLs as-is + $url = $this->expandTemplate($uri, $templateVars); + } else { + $url = Url::factory($this->getBaseUrl())->combine($this->expandTemplate($uri, $templateVars)); + } + } + + // If default headers are provided, then merge them under any explicitly provided headers for the request + if (count($this->defaultHeaders)) { + if (!$headers) { + $headers = $this->defaultHeaders->toArray(); + } elseif (is_array($headers)) { + $headers += $this->defaultHeaders->toArray(); + } elseif ($headers instanceof Collection) { + $headers = $headers->toArray() + $this->defaultHeaders->toArray(); + } + } + + return $this->prepareRequest($this->requestFactory->create($method, (string) $url, $headers, $body), $options); + } + + public function getBaseUrl($expand = true) + { + return $expand ? $this->expandTemplate($this->baseUrl) : $this->baseUrl; + } + + public function setBaseUrl($url) + { + $this->baseUrl = $url; + + return $this; + } + + public function setUserAgent($userAgent, $includeDefault = false) + { + if ($includeDefault) { + $userAgent .= ' ' . $this->getDefaultUserAgent(); + } + $this->userAgent = $userAgent; + + return $this; + } + + /** + * Get the default User-Agent string to use with Guzzle + * + * @return string + */ + public function getDefaultUserAgent() + { + return 'Guzzle/' . Version::VERSION + . ' curl/' . CurlVersion::getInstance()->get('version') + . ' PHP/' . PHP_VERSION; + } + + public function get($uri = null, $headers = null, $options = array()) + { + // BC compat: $options can be a string, resource, etc to specify where the response body is downloaded + return is_array($options) + ? $this->createRequest('GET', $uri, $headers, null, $options) + : $this->createRequest('GET', $uri, $headers, $options); + } + + public function head($uri = null, $headers = null, array $options = array()) + { + return $this->createRequest('HEAD', $uri, $headers, null, $options); + } + + public function delete($uri = null, $headers = null, $body = null, array $options = array()) + { + return $this->createRequest('DELETE', $uri, $headers, $body, $options); + } + + public function put($uri = null, $headers = null, $body = null, array $options = array()) + { + return $this->createRequest('PUT', $uri, $headers, $body, $options); + } + + public function patch($uri = null, $headers = null, $body = null, array $options = array()) + { + return $this->createRequest('PATCH', $uri, $headers, $body, $options); + } + + public function post($uri = null, $headers = null, $postBody = null, array $options = array()) + { + return $this->createRequest('POST', $uri, $headers, $postBody, $options); + } + + public function options($uri = null, array $options = array()) + { + return $this->createRequest('OPTIONS', $uri, $options); + } + + public function send($requests) + { + if (!($requests instanceof RequestInterface)) { + return $this->sendMultiple($requests); + } + + try { + /** @var $requests RequestInterface */ + $this->getCurlMulti()->add($requests)->send(); + return $requests->getResponse(); + } catch (ExceptionCollection $e) { + throw $e->getFirst(); + } + } + + /** + * Set a curl multi object to be used internally by the client for transferring requests. + * + * @param CurlMultiInterface $curlMulti Multi object + * + * @return self + */ + public function setCurlMulti(CurlMultiInterface $curlMulti) + { + $this->curlMulti = $curlMulti; + + return $this; + } + + /** + * @return CurlMultiInterface|CurlMultiProxy + */ + public function getCurlMulti() + { + if (!$this->curlMulti) { + $this->curlMulti = new CurlMultiProxy( + self::MAX_HANDLES, + $this->getConfig('select_timeout') ?: self::DEFAULT_SELECT_TIMEOUT + ); + } + + return $this->curlMulti; + } + + public function setRequestFactory(RequestFactoryInterface $factory) + { + $this->requestFactory = $factory; + + return $this; + } + + /** + * Set the URI template expander to use with the client + * + * @param UriTemplateInterface $uriTemplate URI template expander + * + * @return self + */ + public function setUriTemplate(UriTemplateInterface $uriTemplate) + { + $this->uriTemplate = $uriTemplate; + + return $this; + } + + /** + * Expand a URI template while merging client config settings into the template variables + * + * @param string $template Template to expand + * @param array $variables Variables to inject + * + * @return string + */ + protected function expandTemplate($template, array $variables = null) + { + $expansionVars = $this->getConfig()->toArray(); + if ($variables) { + $expansionVars = $variables + $expansionVars; + } + + return $this->getUriTemplate()->expand($template, $expansionVars); + } + + /** + * Get the URI template expander used by the client + * + * @return UriTemplateInterface + */ + protected function getUriTemplate() + { + if (!$this->uriTemplate) { + $this->uriTemplate = ParserRegistry::getInstance()->getParser('uri_template'); + } + + return $this->uriTemplate; + } + + /** + * Send multiple requests in parallel + * + * @param array $requests Array of RequestInterface objects + * + * @return array Returns an array of Response objects + */ + protected function sendMultiple(array $requests) + { + $curlMulti = $this->getCurlMulti(); + foreach ($requests as $request) { + $curlMulti->add($request); + } + $curlMulti->send(); + + /** @var $request RequestInterface */ + $result = array(); + foreach ($requests as $request) { + $result[] = $request->getResponse(); + } + + return $result; + } + + /** + * Prepare a request to be sent from the Client by adding client specific behaviors and properties to the request. + * + * @param RequestInterface $request Request to prepare for the client + * @param array $options Options to apply to the request + * + * @return RequestInterface + */ + protected function prepareRequest(RequestInterface $request, array $options = array()) + { + $request->setClient($this)->setEventDispatcher(clone $this->getEventDispatcher()); + + if ($curl = $this->config[self::CURL_OPTIONS]) { + $request->getCurlOptions()->overwriteWith(CurlHandle::parseCurlConfig($curl)); + } + + if ($params = $this->config[self::REQUEST_PARAMS]) { + Version::warn('request.params is deprecated. Use request.options to add default request options.'); + $request->getParams()->overwriteWith($params); + } + + if ($this->userAgent && !$request->hasHeader('User-Agent')) { + $request->setHeader('User-Agent', $this->userAgent); + } + + if ($defaults = $this->config[self::REQUEST_OPTIONS]) { + $this->requestFactory->applyOptions($request, $defaults, RequestFactoryInterface::OPTIONS_AS_DEFAULTS); + } + + if ($options) { + $this->requestFactory->applyOptions($request, $options); + } + + $this->dispatch('client.create_request', array('client' => $this, 'request' => $request)); + + return $request; + } + + /** + * Initializes SSL settings + */ + protected function initSsl() + { + $authority = $this->config[self::SSL_CERT_AUTHORITY]; + + if ($authority === 'system') { + return; + } + + if ($authority === null) { + $authority = true; + } + + if ($authority === true && substr(__FILE__, 0, 7) == 'phar://') { + $authority = self::extractPharCacert(__DIR__ . '/Resources/cacert.pem'); + } + + $this->setSslVerification($authority); + } + + /** + * @deprecated + */ + public function getDefaultHeaders() + { + Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to retrieve default request options'); + return $this->defaultHeaders; + } + + /** + * @deprecated + */ + public function setDefaultHeaders($headers) + { + Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to specify default request options'); + if ($headers instanceof Collection) { + $this->defaultHeaders = $headers; + } elseif (is_array($headers)) { + $this->defaultHeaders = new Collection($headers); + } else { + throw new InvalidArgumentException('Headers must be an array or Collection'); + } + + return $this; + } + + /** + * @deprecated + */ + public function preparePharCacert($md5Check = true) + { + return sys_get_temp_dir() . '/guzzle-cacert.pem'; + } + + /** + * Copies the phar cacert from a phar into the temp directory. + * + * @param string $pharCacertPath Path to the phar cacert. For example: + * 'phar://aws.phar/Guzzle/Http/Resources/cacert.pem' + * + * @return string Returns the path to the extracted cacert file. + * @throws \RuntimeException Throws if the phar cacert cannot be found or + * the file cannot be copied to the temp dir. + */ + public static function extractPharCacert($pharCacertPath) + { + // Copy the cacert.pem file from the phar if it is not in the temp + // folder. + $certFile = sys_get_temp_dir() . '/guzzle-cacert.pem'; + + if (!file_exists($pharCacertPath)) { + throw new \RuntimeException("Could not find $pharCacertPath"); + } + + if (!file_exists($certFile) || + filesize($certFile) != filesize($pharCacertPath) + ) { + if (!copy($pharCacertPath, $certFile)) { + throw new \RuntimeException( + "Could not copy {$pharCacertPath} to {$certFile}: " + . var_export(error_get_last(), true) + ); + } + } + + return $certFile; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/ClientInterface.php b/vendor/guzzle/http/Guzzle/Http/ClientInterface.php new file mode 100644 index 0000000..10e4de2 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/ClientInterface.php @@ -0,0 +1,223 @@ +getCurlOptions(); + $mediator = new RequestMediator($request, $requestCurlOptions->get('emit_io')); + $tempContentLength = null; + $method = $request->getMethod(); + $bodyAsString = $requestCurlOptions->get(self::BODY_AS_STRING); + + // Prepare url + $url = (string)$request->getUrl(); + if(($pos = strpos($url, '#')) !== false ){ + // strip fragment from url + $url = substr($url, 0, $pos); + } + + // Array of default cURL options. + $curlOptions = array( + CURLOPT_URL => $url, + CURLOPT_CONNECTTIMEOUT => 150, + CURLOPT_RETURNTRANSFER => false, + CURLOPT_HEADER => false, + CURLOPT_PORT => $request->getPort(), + CURLOPT_HTTPHEADER => array(), + CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'), + CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'), + CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0' + ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, + // Verifies the authenticity of the peer's certificate + CURLOPT_SSL_VERIFYPEER => 1, + // Certificate must indicate that the server is the server to which you meant to connect + CURLOPT_SSL_VERIFYHOST => 2 + ); + + if (defined('CURLOPT_PROTOCOLS')) { + // Allow only HTTP and HTTPS protocols + $curlOptions[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; + } + + // Add CURLOPT_ENCODING if Accept-Encoding header is provided + if ($acceptEncodingHeader = $request->getHeader('Accept-Encoding')) { + $curlOptions[CURLOPT_ENCODING] = (string) $acceptEncodingHeader; + // Let cURL set the Accept-Encoding header, prevents duplicate values + $request->removeHeader('Accept-Encoding'); + } + + // Enable curl debug information if the 'debug' param was set + if ($requestCurlOptions->get('debug')) { + $curlOptions[CURLOPT_STDERR] = fopen('php://temp', 'r+'); + // @codeCoverageIgnoreStart + if (false === $curlOptions[CURLOPT_STDERR]) { + throw new RuntimeException('Unable to create a stream for CURLOPT_STDERR'); + } + // @codeCoverageIgnoreEnd + $curlOptions[CURLOPT_VERBOSE] = true; + } + + // Specify settings according to the HTTP method + if ($method == 'GET') { + $curlOptions[CURLOPT_HTTPGET] = true; + } elseif ($method == 'HEAD') { + $curlOptions[CURLOPT_NOBODY] = true; + // HEAD requests do not use a write function + unset($curlOptions[CURLOPT_WRITEFUNCTION]); + } elseif (!($request instanceof EntityEnclosingRequest)) { + $curlOptions[CURLOPT_CUSTOMREQUEST] = $method; + } else { + + $curlOptions[CURLOPT_CUSTOMREQUEST] = $method; + + // Handle sending raw bodies in a request + if ($request->getBody()) { + // You can send the body as a string using curl's CURLOPT_POSTFIELDS + if ($bodyAsString) { + $curlOptions[CURLOPT_POSTFIELDS] = (string) $request->getBody(); + // Allow curl to add the Content-Length for us to account for the times when + // POST redirects are followed by GET requests + if ($tempContentLength = $request->getHeader('Content-Length')) { + $tempContentLength = (int) (string) $tempContentLength; + } + // Remove the curl generated Content-Type header if none was set manually + if (!$request->hasHeader('Content-Type')) { + $curlOptions[CURLOPT_HTTPHEADER][] = 'Content-Type:'; + } + } else { + $curlOptions[CURLOPT_UPLOAD] = true; + // Let cURL handle setting the Content-Length header + if ($tempContentLength = $request->getHeader('Content-Length')) { + $tempContentLength = (int) (string) $tempContentLength; + $curlOptions[CURLOPT_INFILESIZE] = $tempContentLength; + } + // Add a callback for curl to read data to send with the request only if a body was specified + $curlOptions[CURLOPT_READFUNCTION] = array($mediator, 'readRequestBody'); + // Attempt to seek to the start of the stream + $request->getBody()->seek(0); + } + + } else { + + // Special handling for POST specific fields and files + $postFields = false; + if (count($request->getPostFiles())) { + $postFields = $request->getPostFields()->useUrlEncoding(false)->urlEncode(); + foreach ($request->getPostFiles() as $key => $data) { + $prefixKeys = count($data) > 1; + foreach ($data as $index => $file) { + // Allow multiple files in the same key + $fieldKey = $prefixKeys ? "{$key}[{$index}]" : $key; + $postFields[$fieldKey] = $file->getCurlValue(); + } + } + } elseif (count($request->getPostFields())) { + $postFields = (string) $request->getPostFields()->useUrlEncoding(true); + } + + if ($postFields !== false) { + if ($method == 'POST') { + unset($curlOptions[CURLOPT_CUSTOMREQUEST]); + $curlOptions[CURLOPT_POST] = true; + } + $curlOptions[CURLOPT_POSTFIELDS] = $postFields; + $request->removeHeader('Content-Length'); + } + } + + // If the Expect header is not present, prevent curl from adding it + if (!$request->hasHeader('Expect')) { + $curlOptions[CURLOPT_HTTPHEADER][] = 'Expect:'; + } + } + + // If a Content-Length header was specified but we want to allow curl to set one for us + if (null !== $tempContentLength) { + $request->removeHeader('Content-Length'); + } + + // Set custom cURL options + foreach ($requestCurlOptions->toArray() as $key => $value) { + if (is_numeric($key)) { + $curlOptions[$key] = $value; + } + } + + // Do not set an Accept header by default + if (!isset($curlOptions[CURLOPT_ENCODING])) { + $curlOptions[CURLOPT_HTTPHEADER][] = 'Accept:'; + } + + // Add any custom headers to the request. Empty headers will cause curl to not send the header at all. + foreach ($request->getHeaderLines() as $line) { + $curlOptions[CURLOPT_HTTPHEADER][] = $line; + } + + // Add the content-length header back if it was temporarily removed + if ($tempContentLength) { + $request->setHeader('Content-Length', $tempContentLength); + } + + // Apply the options to a new cURL handle. + $handle = curl_init(); + + // Enable the progress function if the 'progress' param was set + if ($requestCurlOptions->get('progress')) { + // Wrap the function in a function that provides the curl handle to the mediator's progress function + // Using this rather than injecting the handle into the mediator prevents a circular reference + $curlOptions[CURLOPT_PROGRESSFUNCTION] = function () use ($mediator, $handle) { + $args = func_get_args(); + $args[] = $handle; + + // PHP 5.5 pushed the handle onto the start of the args + if (is_resource($args[0])) { + array_shift($args); + } + + call_user_func_array(array($mediator, 'progress'), $args); + }; + $curlOptions[CURLOPT_NOPROGRESS] = false; + } + + curl_setopt_array($handle, $curlOptions); + + return new static($handle, $curlOptions); + } + + /** + * Construct a new CurlHandle object that wraps a cURL handle + * + * @param resource $handle Configured cURL handle resource + * @param Collection|array $options Curl options to use with the handle + * + * @throws InvalidArgumentException + */ + public function __construct($handle, $options) + { + if (!is_resource($handle)) { + throw new InvalidArgumentException('Invalid handle provided'); + } + if (is_array($options)) { + $this->options = new Collection($options); + } elseif ($options instanceof Collection) { + $this->options = $options; + } else { + throw new InvalidArgumentException('Expected array or Collection'); + } + $this->handle = $handle; + } + + /** + * Destructor + */ + public function __destruct() + { + $this->close(); + } + + /** + * Close the curl handle + */ + public function close() + { + if (is_resource($this->handle)) { + curl_close($this->handle); + } + $this->handle = null; + } + + /** + * Check if the handle is available and still OK + * + * @return bool + */ + public function isAvailable() + { + return is_resource($this->handle); + } + + /** + * Get the last error that occurred on the cURL handle + * + * @return string + */ + public function getError() + { + return $this->isAvailable() ? curl_error($this->handle) : ''; + } + + /** + * Get the last error number that occurred on the cURL handle + * + * @return int + */ + public function getErrorNo() + { + if ($this->errorNo) { + return $this->errorNo; + } + + return $this->isAvailable() ? curl_errno($this->handle) : CURLE_OK; + } + + /** + * Set the curl error number + * + * @param int $error Error number to set + * + * @return CurlHandle + */ + public function setErrorNo($error) + { + $this->errorNo = $error; + + return $this; + } + + /** + * Get cURL curl_getinfo data + * + * @param int $option Option to retrieve. Pass null to retrieve all data as an array. + * + * @return array|mixed + */ + public function getInfo($option = null) + { + if (!is_resource($this->handle)) { + return null; + } + + if (null !== $option) { + return curl_getinfo($this->handle, $option) ?: null; + } + + return curl_getinfo($this->handle) ?: array(); + } + + /** + * Get the stderr output + * + * @param bool $asResource Set to TRUE to get an fopen resource + * + * @return string|resource|null + */ + public function getStderr($asResource = false) + { + $stderr = $this->getOptions()->get(CURLOPT_STDERR); + if (!$stderr) { + return null; + } + + if ($asResource) { + return $stderr; + } + + fseek($stderr, 0); + $e = stream_get_contents($stderr); + fseek($stderr, 0, SEEK_END); + + return $e; + } + + /** + * Get the URL that this handle is connecting to + * + * @return Url + */ + public function getUrl() + { + return Url::factory($this->options->get(CURLOPT_URL)); + } + + /** + * Get the wrapped curl handle + * + * @return resource|null Returns the cURL handle or null if it was closed + */ + public function getHandle() + { + return $this->isAvailable() ? $this->handle : null; + } + + /** + * Get the cURL setopt options of the handle. Changing values in the return object will have no effect on the curl + * handle after it is created. + * + * @return Collection + */ + public function getOptions() + { + return $this->options; + } + + /** + * Update a request based on the log messages of the CurlHandle + * + * @param RequestInterface $request Request to update + */ + public function updateRequestFromTransfer(RequestInterface $request) + { + if (!$request->getResponse()) { + return; + } + + // Update the transfer stats of the response + $request->getResponse()->setInfo($this->getInfo()); + + if (!$log = $this->getStderr(true)) { + return; + } + + // Parse the cURL stderr output for outgoing requests + $headers = ''; + fseek($log, 0); + while (($line = fgets($log)) !== false) { + if ($line && $line[0] == '>') { + $headers = substr(trim($line), 2) . "\r\n"; + while (($line = fgets($log)) !== false) { + if ($line[0] == '*' || $line[0] == '<') { + break; + } else { + $headers .= trim($line) . "\r\n"; + } + } + } + } + + // Add request headers to the request exactly as they were sent + if ($headers) { + $parsed = ParserRegistry::getInstance()->getParser('message')->parseRequest($headers); + if (!empty($parsed['headers'])) { + $request->setHeaders(array()); + foreach ($parsed['headers'] as $name => $value) { + $request->setHeader($name, $value); + } + } + if (!empty($parsed['version'])) { + $request->setProtocolVersion($parsed['version']); + } + } + } + + /** + * Parse the config and replace curl.* configurators into the constant based values so it can be used elsewhere + * + * @param array|Collection $config The configuration we want to parse + * + * @return array + */ + public static function parseCurlConfig($config) + { + $curlOptions = array(); + foreach ($config as $key => $value) { + if (is_string($key) && defined($key)) { + // Convert constants represented as string to constant int values + $key = constant($key); + } + if (is_string($value) && defined($value)) { + $value = constant($value); + } + $curlOptions[$key] = $value; + } + + return $curlOptions; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php b/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php new file mode 100644 index 0000000..9e4e637 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php @@ -0,0 +1,423 @@ + array('CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'), + CURLM_BAD_EASY_HANDLE => array('CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."), + CURLM_OUT_OF_MEMORY => array('CURLM_OUT_OF_MEMORY', 'You are doomed.'), + CURLM_INTERNAL_ERROR => array('CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!') + ); + + /** @var float */ + protected $selectTimeout; + + public function __construct($selectTimeout = 1.0) + { + $this->selectTimeout = $selectTimeout; + $this->multiHandle = curl_multi_init(); + // @codeCoverageIgnoreStart + if ($this->multiHandle === false) { + throw new CurlException('Unable to create multi handle'); + } + // @codeCoverageIgnoreEnd + $this->reset(); + } + + public function __destruct() + { + if (is_resource($this->multiHandle)) { + curl_multi_close($this->multiHandle); + } + } + + public function add(RequestInterface $request) + { + $this->requests[] = $request; + // If requests are currently transferring and this is async, then the + // request must be prepared now as the send() method is not called. + $this->beforeSend($request); + $this->dispatch(self::ADD_REQUEST, array('request' => $request)); + + return $this; + } + + public function all() + { + return $this->requests; + } + + public function remove(RequestInterface $request) + { + $this->removeHandle($request); + if (($index = array_search($request, $this->requests, true)) !== false) { + $request = $this->requests[$index]; + unset($this->requests[$index]); + $this->requests = array_values($this->requests); + $this->dispatch(self::REMOVE_REQUEST, array('request' => $request)); + return true; + } + + return false; + } + + public function reset($hard = false) + { + // Remove each request + if ($this->requests) { + foreach ($this->requests as $request) { + $this->remove($request); + } + } + + $this->handles = new \SplObjectStorage(); + $this->requests = $this->resourceHash = $this->exceptions = $this->successful = array(); + } + + public function send() + { + $this->perform(); + $exceptions = $this->exceptions; + $successful = $this->successful; + $this->reset(); + + if ($exceptions) { + $this->throwMultiException($exceptions, $successful); + } + } + + public function count() + { + return count($this->requests); + } + + /** + * Build and throw a MultiTransferException + * + * @param array $exceptions Exceptions encountered + * @param array $successful Successful requests + * @throws MultiTransferException + */ + protected function throwMultiException(array $exceptions, array $successful) + { + $multiException = new MultiTransferException('Errors during multi transfer'); + + while ($e = array_shift($exceptions)) { + $multiException->addFailedRequestWithException($e['request'], $e['exception']); + } + + // Add successful requests + foreach ($successful as $request) { + if (!$multiException->containsRequest($request)) { + $multiException->addSuccessfulRequest($request); + } + } + + throw $multiException; + } + + /** + * Prepare for sending + * + * @param RequestInterface $request Request to prepare + * @throws \Exception on error preparing the request + */ + protected function beforeSend(RequestInterface $request) + { + try { + $state = $request->setState(RequestInterface::STATE_TRANSFER); + if ($state == RequestInterface::STATE_TRANSFER) { + $this->addHandle($request); + } else { + // Requests might decide they don't need to be sent just before + // transfer (e.g. CachePlugin) + $this->remove($request); + if ($state == RequestInterface::STATE_COMPLETE) { + $this->successful[] = $request; + } + } + } catch (\Exception $e) { + // Queue the exception to be thrown when sent + $this->removeErroredRequest($request, $e); + } + } + + private function addHandle(RequestInterface $request) + { + $handle = $this->createCurlHandle($request)->getHandle(); + $this->checkCurlResult( + curl_multi_add_handle($this->multiHandle, $handle) + ); + } + + /** + * Create a curl handle for a request + * + * @param RequestInterface $request Request + * + * @return CurlHandle + */ + protected function createCurlHandle(RequestInterface $request) + { + $wrapper = CurlHandle::factory($request); + $this->handles[$request] = $wrapper; + $this->resourceHash[(int) $wrapper->getHandle()] = $request; + + return $wrapper; + } + + /** + * Get the data from the multi handle + */ + protected function perform() + { + $event = new Event(array('curl_multi' => $this)); + + while ($this->requests) { + // Notify each request as polling + $blocking = $total = 0; + foreach ($this->requests as $request) { + ++$total; + $event['request'] = $request; + $request->getEventDispatcher()->dispatch(self::POLLING_REQUEST, $event); + // The blocking variable just has to be non-falsey to block the loop + if ($request->getParams()->hasKey(self::BLOCKING)) { + ++$blocking; + } + } + if ($blocking == $total) { + // Sleep to prevent eating CPU because no requests are actually pending a select call + usleep(500); + } else { + $this->executeHandles(); + } + } + } + + /** + * Execute and select curl handles + */ + private function executeHandles() + { + // The first curl_multi_select often times out no matter what, but is usually required for fast transfers + $selectTimeout = 0.001; + $active = false; + do { + while (($mrc = curl_multi_exec($this->multiHandle, $active)) == CURLM_CALL_MULTI_PERFORM); + $this->checkCurlResult($mrc); + $this->processMessages(); + if ($active && curl_multi_select($this->multiHandle, $selectTimeout) === -1) { + // Perform a usleep if a select returns -1: https://bugs.php.net/bug.php?id=61141 + usleep(150); + } + $selectTimeout = $this->selectTimeout; + } while ($active); + } + + /** + * Process any received curl multi messages + */ + private function processMessages() + { + while ($done = curl_multi_info_read($this->multiHandle)) { + $request = $this->resourceHash[(int) $done['handle']]; + try { + $this->processResponse($request, $this->handles[$request], $done); + $this->successful[] = $request; + } catch (\Exception $e) { + $this->removeErroredRequest($request, $e); + } + } + } + + /** + * Remove a request that encountered an exception + * + * @param RequestInterface $request Request to remove + * @param \Exception $e Exception encountered + */ + protected function removeErroredRequest(RequestInterface $request, \Exception $e = null) + { + $this->exceptions[] = array('request' => $request, 'exception' => $e); + $this->remove($request); + $this->dispatch(self::MULTI_EXCEPTION, array('exception' => $e, 'all_exceptions' => $this->exceptions)); + } + + /** + * Check for errors and fix headers of a request based on a curl response + * + * @param RequestInterface $request Request to process + * @param CurlHandle $handle Curl handle object + * @param array $curl Array returned from curl_multi_info_read + * + * @throws CurlException on Curl error + */ + protected function processResponse(RequestInterface $request, CurlHandle $handle, array $curl) + { + // Set the transfer stats on the response + $handle->updateRequestFromTransfer($request); + // Check if a cURL exception occurred, and if so, notify things + $curlException = $this->isCurlException($request, $handle, $curl); + + // Always remove completed curl handles. They can be added back again + // via events if needed (e.g. ExponentialBackoffPlugin) + $this->removeHandle($request); + + if (!$curlException) { + if ($this->validateResponseWasSet($request)) { + $state = $request->setState( + RequestInterface::STATE_COMPLETE, + array('handle' => $handle) + ); + // Only remove the request if it wasn't resent as a result of + // the state change + if ($state != RequestInterface::STATE_TRANSFER) { + $this->remove($request); + } + } + return; + } + + // Set the state of the request to an error + $state = $request->setState(RequestInterface::STATE_ERROR, array('exception' => $curlException)); + // Allow things to ignore the error if possible + if ($state != RequestInterface::STATE_TRANSFER) { + $this->remove($request); + } + + // The error was not handled, so fail + if ($state == RequestInterface::STATE_ERROR) { + /** @var CurlException $curlException */ + throw $curlException; + } + } + + /** + * Remove a curl handle from the curl multi object + * + * @param RequestInterface $request Request that owns the handle + */ + protected function removeHandle(RequestInterface $request) + { + if (isset($this->handles[$request])) { + $handle = $this->handles[$request]; + curl_multi_remove_handle($this->multiHandle, $handle->getHandle()); + unset($this->handles[$request]); + unset($this->resourceHash[(int) $handle->getHandle()]); + $handle->close(); + } + } + + /** + * Check if a cURL transfer resulted in what should be an exception + * + * @param RequestInterface $request Request to check + * @param CurlHandle $handle Curl handle object + * @param array $curl Array returned from curl_multi_info_read + * + * @return CurlException|bool + */ + private function isCurlException(RequestInterface $request, CurlHandle $handle, array $curl) + { + if (CURLM_OK == $curl['result'] || CURLM_CALL_MULTI_PERFORM == $curl['result']) { + return false; + } + + $handle->setErrorNo($curl['result']); + $e = new CurlException(sprintf('[curl] %s: %s [url] %s', + $handle->getErrorNo(), $handle->getError(), $handle->getUrl())); + $e->setCurlHandle($handle) + ->setRequest($request) + ->setCurlInfo($handle->getInfo()) + ->setError($handle->getError(), $handle->getErrorNo()); + + return $e; + } + + /** + * Throw an exception for a cURL multi response if needed + * + * @param int $code Curl response code + * @throws CurlException + */ + private function checkCurlResult($code) + { + if ($code != CURLM_OK && $code != CURLM_CALL_MULTI_PERFORM) { + throw new CurlException(isset($this->multiErrors[$code]) + ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}" + : 'Unexpected cURL error: ' . $code + ); + } + } + + /** + * @link https://github.com/guzzle/guzzle/issues/710 + */ + private function validateResponseWasSet(RequestInterface $request) + { + if ($request->getResponse()) { + return true; + } + + $body = $request instanceof EntityEnclosingRequestInterface + ? $request->getBody() + : null; + + if (!$body) { + $rex = new RequestException( + 'No response was received for a request with no body. This' + . ' could mean that you are saturating your network.' + ); + $rex->setRequest($request); + $this->removeErroredRequest($request, $rex); + } elseif (!$body->isSeekable() || !$body->seek(0)) { + // Nothing we can do with this. Sorry! + $rex = new RequestException( + 'The connection was unexpectedly closed. The request would' + . ' have been retried, but attempting to rewind the' + . ' request body failed.' + ); + $rex->setRequest($request); + $this->removeErroredRequest($request, $rex); + } else { + $this->remove($request); + // Add the request back to the batch to retry automatically. + $this->requests[] = $request; + $this->addHandle($request); + } + + return false; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php b/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php new file mode 100644 index 0000000..0ead757 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php @@ -0,0 +1,58 @@ +maxHandles = $maxHandles; + $this->selectTimeout = $selectTimeout; + // You can get some weird "Too many open files" errors when sending a large amount of requests in parallel. + // These two statements autoload classes before a system runs out of file descriptors so that you can get back + // valuable error messages if you run out. + class_exists('Guzzle\Http\Message\Response'); + class_exists('Guzzle\Http\Exception\CurlException'); + } + + public function add(RequestInterface $request) + { + $this->queued[] = $request; + + return $this; + } + + public function all() + { + $requests = $this->queued; + foreach ($this->handles as $handle) { + $requests = array_merge($requests, $handle->all()); + } + + return $requests; + } + + public function remove(RequestInterface $request) + { + foreach ($this->queued as $i => $r) { + if ($request === $r) { + unset($this->queued[$i]); + return true; + } + } + + foreach ($this->handles as $handle) { + if ($handle->remove($request)) { + return true; + } + } + + return false; + } + + public function reset($hard = false) + { + $this->queued = array(); + $this->groups = array(); + foreach ($this->handles as $handle) { + $handle->reset(); + } + if ($hard) { + $this->handles = array(); + } + + return $this; + } + + public function send() + { + if ($this->queued) { + $group = $this->getAvailableHandle(); + // Add this handle to a list of handles than is claimed + $this->groups[] = $group; + while ($request = array_shift($this->queued)) { + $group->add($request); + } + try { + $group->send(); + array_pop($this->groups); + $this->cleanupHandles(); + } catch (\Exception $e) { + // Remove the group and cleanup if an exception was encountered and no more requests in group + if (!$group->count()) { + array_pop($this->groups); + $this->cleanupHandles(); + } + throw $e; + } + } + } + + public function count() + { + return count($this->all()); + } + + /** + * Get an existing available CurlMulti handle or create a new one + * + * @return CurlMulti + */ + protected function getAvailableHandle() + { + // Grab a handle that is not claimed + foreach ($this->handles as $h) { + if (!in_array($h, $this->groups, true)) { + return $h; + } + } + + // All are claimed, so create one + $handle = new CurlMulti($this->selectTimeout); + $handle->setEventDispatcher($this->getEventDispatcher()); + $this->handles[] = $handle; + + return $handle; + } + + /** + * Trims down unused CurlMulti handles to limit the number of open connections + */ + protected function cleanupHandles() + { + if ($diff = max(0, count($this->handles) - $this->maxHandles)) { + for ($i = count($this->handles) - 1; $i > 0 && $diff > 0; $i--) { + if (!count($this->handles[$i])) { + unset($this->handles[$i]); + $diff--; + } + } + $this->handles = array_values($this->handles); + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php b/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php new file mode 100644 index 0000000..c3f99dd --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php @@ -0,0 +1,66 @@ +version) { + $this->version = curl_version(); + } + + return $this->version; + } + + /** + * Get a specific type of curl information + * + * @param string $type Version information to retrieve. This value is one of: + * - version_number: cURL 24 bit version number + * - version: cURL version number, as a string + * - ssl_version_number: OpenSSL 24 bit version number + * - ssl_version: OpenSSL version number, as a string + * - libz_version: zlib version number, as a string + * - host: Information about the host where cURL was built + * - features: A bitmask of the CURL_VERSION_XXX constants + * - protocols: An array of protocols names supported by cURL + * + * @return string|float|bool if the $type is found, and false if not found + */ + public function get($type) + { + $version = $this->getAll(); + + return isset($version[$type]) ? $version[$type] : false; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php b/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php new file mode 100644 index 0000000..5d1a0cd --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php @@ -0,0 +1,147 @@ +request = $request; + $this->emitIo = $emitIo; + } + + /** + * Receive a response header from curl + * + * @param resource $curl Curl handle + * @param string $header Received header + * + * @return int + */ + public function receiveResponseHeader($curl, $header) + { + static $normalize = array("\r", "\n"); + $length = strlen($header); + $header = str_replace($normalize, '', $header); + + if (strpos($header, 'HTTP/') === 0) { + + $startLine = explode(' ', $header, 3); + $code = $startLine[1]; + $status = isset($startLine[2]) ? $startLine[2] : ''; + + // Only download the body of the response to the specified response + // body when a successful response is received. + if ($code >= 200 && $code < 300) { + $body = $this->request->getResponseBody(); + } else { + $body = EntityBody::factory(); + } + + $response = new Response($code, null, $body); + $response->setStatus($code, $status); + $this->request->startResponse($response); + + $this->request->dispatch('request.receive.status_line', array( + 'request' => $this, + 'line' => $header, + 'status_code' => $code, + 'reason_phrase' => $status + )); + + } elseif ($pos = strpos($header, ':')) { + $this->request->getResponse()->addHeader( + trim(substr($header, 0, $pos)), + trim(substr($header, $pos + 1)) + ); + } + + return $length; + } + + /** + * Received a progress notification + * + * @param int $downloadSize Total download size + * @param int $downloaded Amount of bytes downloaded + * @param int $uploadSize Total upload size + * @param int $uploaded Amount of bytes uploaded + * @param resource $handle CurlHandle object + */ + public function progress($downloadSize, $downloaded, $uploadSize, $uploaded, $handle = null) + { + $this->request->dispatch('curl.callback.progress', array( + 'request' => $this->request, + 'handle' => $handle, + 'download_size' => $downloadSize, + 'downloaded' => $downloaded, + 'upload_size' => $uploadSize, + 'uploaded' => $uploaded + )); + } + + /** + * Write data to the response body of a request + * + * @param resource $curl Curl handle + * @param string $write Data that was received + * + * @return int + */ + public function writeResponseBody($curl, $write) + { + if ($this->emitIo) { + $this->request->dispatch('curl.callback.write', array( + 'request' => $this->request, + 'write' => $write + )); + } + + if ($response = $this->request->getResponse()) { + return $response->getBody()->write($write); + } else { + // Unexpected data received before response headers - abort transfer + return 0; + } + } + + /** + * Read data from the request body and send it to curl + * + * @param resource $ch Curl handle + * @param resource $fd File descriptor + * @param int $length Amount of data to read + * + * @return string + */ + public function readRequestBody($ch, $fd, $length) + { + if (!($body = $this->request->getBody())) { + return ''; + } + + $read = (string) $body->read($length); + if ($this->emitIo) { + $this->request->dispatch('curl.callback.read', array('request' => $this->request, 'read' => $read)); + } + + return $read; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/EntityBody.php b/vendor/guzzle/http/Guzzle/Http/EntityBody.php new file mode 100644 index 0000000..b60d170 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/EntityBody.php @@ -0,0 +1,201 @@ +rewindFunction = $callable; + + return $this; + } + + public function rewind() + { + return $this->rewindFunction ? call_user_func($this->rewindFunction, $this) : parent::rewind(); + } + + /** + * Create a new EntityBody from a string + * + * @param string $string String of data + * + * @return EntityBody + */ + public static function fromString($string) + { + $stream = fopen('php://temp', 'r+'); + if ($string !== '') { + fwrite($stream, $string); + rewind($stream); + } + + return new static($stream); + } + + public function compress($filter = 'zlib.deflate') + { + $result = $this->handleCompression($filter); + $this->contentEncoding = $result ? $filter : false; + + return $result; + } + + public function uncompress($filter = 'zlib.inflate') + { + $offsetStart = 0; + + // When inflating gzipped data, the first 10 bytes must be stripped + // if a gzip header is present + if ($filter == 'zlib.inflate') { + // @codeCoverageIgnoreStart + if (!$this->isReadable() || ($this->isConsumed() && !$this->isSeekable())) { + return false; + } + // @codeCoverageIgnoreEnd + if (stream_get_contents($this->stream, 3, 0) === "\x1f\x8b\x08") { + $offsetStart = 10; + } + } + + $this->contentEncoding = false; + + return $this->handleCompression($filter, $offsetStart); + } + + public function getContentLength() + { + return $this->getSize(); + } + + public function getContentType() + { + return $this->getUri() ? Mimetypes::getInstance()->fromFilename($this->getUri()) : null; + } + + public function getContentMd5($rawOutput = false, $base64Encode = false) + { + if ($hash = self::getHash($this, 'md5', $rawOutput)) { + return $hash && $base64Encode ? base64_encode($hash) : $hash; + } else { + return false; + } + } + + /** + * Calculate the MD5 hash of an entity body + * + * @param EntityBodyInterface $body Entity body to calculate the hash for + * @param bool $rawOutput Whether or not to use raw output + * @param bool $base64Encode Whether or not to base64 encode raw output (only if raw output is true) + * + * @return bool|string Returns an MD5 string on success or FALSE on failure + * @deprecated This will be deprecated soon + * @codeCoverageIgnore + */ + public static function calculateMd5(EntityBodyInterface $body, $rawOutput = false, $base64Encode = false) + { + Version::warn(__CLASS__ . ' is deprecated. Use getContentMd5()'); + return $body->getContentMd5($rawOutput, $base64Encode); + } + + public function setStreamFilterContentEncoding($streamFilterContentEncoding) + { + $this->contentEncoding = $streamFilterContentEncoding; + + return $this; + } + + public function getContentEncoding() + { + return strtr($this->contentEncoding, array( + 'zlib.deflate' => 'gzip', + 'bzip2.compress' => 'compress' + )) ?: false; + } + + protected function handleCompression($filter, $offsetStart = 0) + { + // @codeCoverageIgnoreStart + if (!$this->isReadable() || ($this->isConsumed() && !$this->isSeekable())) { + return false; + } + // @codeCoverageIgnoreEnd + + $handle = fopen('php://temp', 'r+'); + $filter = @stream_filter_append($handle, $filter, STREAM_FILTER_WRITE); + if (!$filter) { + return false; + } + + // Seek to the offset start if possible + $this->seek($offsetStart); + while ($data = fread($this->stream, 8096)) { + fwrite($handle, $data); + } + + fclose($this->stream); + $this->stream = $handle; + stream_filter_remove($filter); + $stat = fstat($this->stream); + $this->size = $stat['size']; + $this->rebuildCache(); + $this->seek(0); + + // Remove any existing rewind function as the underlying stream has been replaced + $this->rewindFunction = null; + + return true; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php b/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php new file mode 100644 index 0000000..e640f57 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php @@ -0,0 +1,73 @@ +isClientError()) { + $label = 'Client error response'; + $class = __NAMESPACE__ . '\\ClientErrorResponseException'; + } elseif ($response->isServerError()) { + $label = 'Server error response'; + $class = __NAMESPACE__ . '\\ServerErrorResponseException'; + } else { + $label = 'Unsuccessful response'; + $class = __CLASS__; + } + + $message = $label . PHP_EOL . implode(PHP_EOL, array( + '[status code] ' . $response->getStatusCode(), + '[reason phrase] ' . $response->getReasonPhrase(), + '[url] ' . $request->getUrl(), + )); + + $e = new $class($message); + $e->setResponse($response); + $e->setRequest($request); + + return $e; + } + + /** + * Set the response that caused the exception + * + * @param Response $response Response to set + */ + public function setResponse(Response $response) + { + $this->response = $response; + } + + /** + * Get the response that caused the exception + * + * @return Response + */ + public function getResponse() + { + return $this->response; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php b/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php new file mode 100644 index 0000000..04d7ddc --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php @@ -0,0 +1,8 @@ +curlError = $error; + $this->curlErrorNo = $number; + + return $this; + } + + /** + * Set the associated curl handle + * + * @param CurlHandle $handle Curl handle + * + * @return self + */ + public function setCurlHandle(CurlHandle $handle) + { + $this->handle = $handle; + + return $this; + } + + /** + * Get the associated cURL handle + * + * @return CurlHandle|null + */ + public function getCurlHandle() + { + return $this->handle; + } + + /** + * Get the associated cURL error message + * + * @return string|null + */ + public function getError() + { + return $this->curlError; + } + + /** + * Get the associated cURL error number + * + * @return int|null + */ + public function getErrorNo() + { + return $this->curlErrorNo; + } + + /** + * Returns curl information about the transfer + * + * @return array + */ + public function getCurlInfo() + { + return $this->curlInfo; + } + + /** + * Set curl transfer information + * + * @param array $info Array of curl transfer information + * + * @return self + * @link http://php.net/manual/en/function.curl-getinfo.php + */ + public function setCurlInfo(array $info) + { + $this->curlInfo = $info; + + return $this; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php b/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php new file mode 100644 index 0000000..ee87295 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php @@ -0,0 +1,10 @@ +successfulRequests, $this->failedRequests); + } + + /** + * Add to the array of successful requests + * + * @param RequestInterface $request Successful request + * + * @return self + */ + public function addSuccessfulRequest(RequestInterface $request) + { + $this->successfulRequests[] = $request; + + return $this; + } + + /** + * Add to the array of failed requests + * + * @param RequestInterface $request Failed request + * + * @return self + */ + public function addFailedRequest(RequestInterface $request) + { + $this->failedRequests[] = $request; + + return $this; + } + + /** + * Add to the array of failed requests and associate with exceptions + * + * @param RequestInterface $request Failed request + * @param \Exception $exception Exception to add and associate with + * + * @return self + */ + public function addFailedRequestWithException(RequestInterface $request, \Exception $exception) + { + $this->add($exception) + ->addFailedRequest($request) + ->exceptionForRequest[spl_object_hash($request)] = $exception; + + return $this; + } + + /** + * Get the Exception that caused the given $request to fail + * + * @param RequestInterface $request Failed command + * + * @return \Exception|null + */ + public function getExceptionForFailedRequest(RequestInterface $request) + { + $oid = spl_object_hash($request); + + return isset($this->exceptionForRequest[$oid]) ? $this->exceptionForRequest[$oid] : null; + } + + /** + * Set all of the successful requests + * + * @param array Array of requests + * + * @return self + */ + public function setSuccessfulRequests(array $requests) + { + $this->successfulRequests = $requests; + + return $this; + } + + /** + * Set all of the failed requests + * + * @param array Array of requests + * + * @return self + */ + public function setFailedRequests(array $requests) + { + $this->failedRequests = $requests; + + return $this; + } + + /** + * Get an array of successful requests sent in the multi transfer + * + * @return array + */ + public function getSuccessfulRequests() + { + return $this->successfulRequests; + } + + /** + * Get an array of failed requests sent in the multi transfer + * + * @return array + */ + public function getFailedRequests() + { + return $this->failedRequests; + } + + /** + * Check if the exception object contains a request + * + * @param RequestInterface $request Request to check + * + * @return bool + */ + public function containsRequest(RequestInterface $request) + { + return in_array($request, $this->failedRequests, true) || in_array($request, $this->successfulRequests, true); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php b/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php new file mode 100644 index 0000000..274df2c --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php @@ -0,0 +1,39 @@ +request = $request; + + return $this; + } + + /** + * Get the request that caused the exception + * + * @return RequestInterface + */ + public function getRequest() + { + return $this->request; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php b/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php new file mode 100644 index 0000000..f0f7cfe --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php @@ -0,0 +1,8 @@ +eventDispatcher = $eventDispatcher; + + return $this; + } + + public function getEventDispatcher() + { + if (!$this->eventDispatcher) { + $this->eventDispatcher = new EventDispatcher(); + } + + return $this->eventDispatcher; + } + + public function dispatch($eventName, array $context = array()) + { + return $this->getEventDispatcher()->dispatch($eventName, new Event($context)); + } + + /** + * {@inheritdoc} + * @codeCoverageIgnore + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + $this->getEventDispatcher()->addSubscriber($subscriber); + + return $this; + } + + public function read($length) + { + $event = array( + 'body' => $this, + 'length' => $length, + 'read' => $this->body->read($length) + ); + $this->dispatch('body.read', $event); + + return $event['read']; + } + + public function write($string) + { + $event = array( + 'body' => $this, + 'write' => $string, + 'result' => $this->body->write($string) + ); + $this->dispatch('body.write', $event); + + return $event['result']; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php b/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php new file mode 100644 index 0000000..0d066ff --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php @@ -0,0 +1,220 @@ +params = new Collection(); + $this->headerFactory = new HeaderFactory(); + $this->headers = new HeaderCollection(); + } + + /** + * Set the header factory to use to create headers + * + * @param HeaderFactoryInterface $factory + * + * @return self + */ + public function setHeaderFactory(HeaderFactoryInterface $factory) + { + $this->headerFactory = $factory; + + return $this; + } + + public function getParams() + { + return $this->params; + } + + public function addHeader($header, $value) + { + if (isset($this->headers[$header])) { + $this->headers[$header]->add($value); + } elseif ($value instanceof HeaderInterface) { + $this->headers[$header] = $value; + } else { + $this->headers[$header] = $this->headerFactory->createHeader($header, $value); + } + + return $this; + } + + public function addHeaders(array $headers) + { + foreach ($headers as $key => $value) { + $this->addHeader($key, $value); + } + + return $this; + } + + public function getHeader($header) + { + return $this->headers[$header]; + } + + public function getHeaders() + { + return $this->headers; + } + + public function getHeaderLines() + { + $headers = array(); + foreach ($this->headers as $value) { + $headers[] = $value->getName() . ': ' . $value; + } + + return $headers; + } + + public function setHeader($header, $value) + { + unset($this->headers[$header]); + $this->addHeader($header, $value); + + return $this; + } + + public function setHeaders(array $headers) + { + $this->headers->clear(); + foreach ($headers as $key => $value) { + $this->addHeader($key, $value); + } + + return $this; + } + + public function hasHeader($header) + { + return isset($this->headers[$header]); + } + + public function removeHeader($header) + { + unset($this->headers[$header]); + + return $this; + } + + /** + * @deprecated Use $message->getHeader()->parseParams() + * @codeCoverageIgnore + */ + public function getTokenizedHeader($header, $token = ';') + { + Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader()->parseParams()'); + if ($this->hasHeader($header)) { + $data = new Collection(); + foreach ($this->getHeader($header)->parseParams() as $values) { + foreach ($values as $key => $value) { + if ($value === '') { + $data->set($data->count(), $key); + } else { + $data->add($key, $value); + } + } + } + return $data; + } + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function setTokenizedHeader($header, $data, $token = ';') + { + Version::warn(__METHOD__ . ' is deprecated.'); + return $this; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getCacheControlDirective($directive) + { + Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->getDirective()'); + if (!($header = $this->getHeader('Cache-Control'))) { + return null; + } + + return $header->getDirective($directive); + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function hasCacheControlDirective($directive) + { + Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->hasDirective()'); + if ($header = $this->getHeader('Cache-Control')) { + return $header->hasDirective($directive); + } else { + return false; + } + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function addCacheControlDirective($directive, $value = true) + { + Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->addDirective()'); + if (!($header = $this->getHeader('Cache-Control'))) { + $this->addHeader('Cache-Control', ''); + $header = $this->getHeader('Cache-Control'); + } + + $header->addDirective($directive, $value); + + return $this; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function removeCacheControlDirective($directive) + { + Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->removeDirective()'); + if ($header = $this->getHeader('Cache-Control')) { + $header->removeDirective($directive); + } + + return $this; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php b/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php new file mode 100644 index 0000000..212850a --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php @@ -0,0 +1,247 @@ +postFields = new QueryString(); + parent::__construct($method, $url, $headers); + } + + /** + * @return string + */ + public function __toString() + { + // Only attempt to include the POST data if it's only fields + if (count($this->postFields) && empty($this->postFiles)) { + return parent::__toString() . (string) $this->postFields; + } + + return parent::__toString() . $this->body; + } + + public function setState($state, array $context = array()) + { + parent::setState($state, $context); + if ($state == self::STATE_TRANSFER && !$this->body && !count($this->postFields) && !count($this->postFiles)) { + $this->setHeader('Content-Length', 0)->removeHeader('Transfer-Encoding'); + } + + return $this->state; + } + + public function setBody($body, $contentType = null) + { + $this->body = EntityBody::factory($body); + + // Auto detect the Content-Type from the path of the request if possible + if ($contentType === null && !$this->hasHeader('Content-Type')) { + $contentType = $this->body->getContentType(); + } + + if ($contentType) { + $this->setHeader('Content-Type', $contentType); + } + + // Always add the Expect 100-Continue header if the body cannot be rewound. This helps with redirects. + if (!$this->body->isSeekable() && $this->expectCutoff !== false) { + $this->setHeader('Expect', '100-Continue'); + } + + // Set the Content-Length header if it can be determined + $size = $this->body->getContentLength(); + if ($size !== null && $size !== false) { + $this->setHeader('Content-Length', $size); + if ($size > $this->expectCutoff) { + $this->setHeader('Expect', '100-Continue'); + } + } elseif (!$this->hasHeader('Content-Length')) { + if ('1.1' == $this->protocolVersion) { + $this->setHeader('Transfer-Encoding', 'chunked'); + } else { + throw new RequestException( + 'Cannot determine Content-Length and cannot use chunked Transfer-Encoding when using HTTP/1.0' + ); + } + } + + return $this; + } + + public function getBody() + { + return $this->body; + } + + /** + * Set the size that the entity body of the request must exceed before adding the Expect: 100-Continue header. + * + * @param int|bool $size Cutoff in bytes. Set to false to never send the expect header (even with non-seekable data) + * + * @return self + */ + public function setExpectHeaderCutoff($size) + { + $this->expectCutoff = $size; + if ($size === false || !$this->body) { + $this->removeHeader('Expect'); + } elseif ($this->body && $this->body->getSize() && $this->body->getSize() > $size) { + $this->setHeader('Expect', '100-Continue'); + } + + return $this; + } + + public function configureRedirects($strict = false, $maxRedirects = 5) + { + $this->getParams()->set(RedirectPlugin::STRICT_REDIRECTS, $strict); + if ($maxRedirects == 0) { + $this->getParams()->set(RedirectPlugin::DISABLE, true); + } else { + $this->getParams()->set(RedirectPlugin::MAX_REDIRECTS, $maxRedirects); + } + + return $this; + } + + public function getPostField($field) + { + return $this->postFields->get($field); + } + + public function getPostFields() + { + return $this->postFields; + } + + public function setPostField($key, $value) + { + $this->postFields->set($key, $value); + $this->processPostFields(); + + return $this; + } + + public function addPostFields($fields) + { + $this->postFields->merge($fields); + $this->processPostFields(); + + return $this; + } + + public function removePostField($field) + { + $this->postFields->remove($field); + $this->processPostFields(); + + return $this; + } + + public function getPostFiles() + { + return $this->postFiles; + } + + public function getPostFile($fieldName) + { + return isset($this->postFiles[$fieldName]) ? $this->postFiles[$fieldName] : null; + } + + public function removePostFile($fieldName) + { + unset($this->postFiles[$fieldName]); + $this->processPostFields(); + + return $this; + } + + public function addPostFile($field, $filename = null, $contentType = null, $postname = null) + { + $data = null; + + if ($field instanceof PostFileInterface) { + $data = $field; + } elseif (is_array($filename)) { + // Allow multiple values to be set in a single key + foreach ($filename as $file) { + $this->addPostFile($field, $file, $contentType); + } + return $this; + } elseif (!is_string($filename)) { + throw new RequestException('The path to a file must be a string'); + } elseif (!empty($filename)) { + // Adding an empty file will cause cURL to error out + $data = new PostFile($field, $filename, $contentType, $postname); + } + + if ($data) { + if (!isset($this->postFiles[$data->getFieldName()])) { + $this->postFiles[$data->getFieldName()] = array($data); + } else { + $this->postFiles[$data->getFieldName()][] = $data; + } + $this->processPostFields(); + } + + return $this; + } + + public function addPostFiles(array $files) + { + foreach ($files as $key => $file) { + if ($file instanceof PostFileInterface) { + $this->addPostFile($file, null, null, false); + } elseif (is_string($file)) { + // Convert non-associative array keys into 'file' + if (is_numeric($key)) { + $key = 'file'; + } + $this->addPostFile($key, $file, null, false); + } else { + throw new RequestException('File must be a string or instance of PostFileInterface'); + } + } + + return $this; + } + + /** + * Determine what type of request should be sent based on post fields + */ + protected function processPostFields() + { + if (!$this->postFiles) { + $this->removeHeader('Expect')->setHeader('Content-Type', self::URL_ENCODED); + } else { + $this->setHeader('Content-Type', self::MULTIPART); + if ($this->expectCutoff !== false) { + $this->setHeader('Expect', '100-Continue'); + } + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php b/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php new file mode 100644 index 0000000..49ad459 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php @@ -0,0 +1,137 @@ + filenames where filename can be a string or PostFileInterface + * + * @return self + */ + public function addPostFiles(array $files); + + /** + * Configure how redirects are handled for the request + * + * @param bool $strict Set to true to follow strict RFC compliance when redirecting POST requests. Most + * browsers with follow a 301-302 redirect for a POST request with a GET request. This is + * the default behavior of Guzzle. Enable strict redirects to redirect these responses + * with a POST rather than a GET request. + * @param int $maxRedirects Specify the maximum number of allowed redirects. Set to 0 to disable redirects. + * + * @return self + */ + public function configureRedirects($strict = false, $maxRedirects = 5); +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/Header.php b/vendor/guzzle/http/Guzzle/Http/Message/Header.php new file mode 100644 index 0000000..50597b2 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/Header.php @@ -0,0 +1,182 @@ +header = trim($header); + $this->glue = $glue; + + foreach ((array) $values as $value) { + foreach ((array) $value as $v) { + $this->values[] = $v; + } + } + } + + public function __toString() + { + return implode($this->glue . ' ', $this->toArray()); + } + + public function add($value) + { + $this->values[] = $value; + + return $this; + } + + public function getName() + { + return $this->header; + } + + public function setName($name) + { + $this->header = $name; + + return $this; + } + + public function setGlue($glue) + { + $this->glue = $glue; + + return $this; + } + + public function getGlue() + { + return $this->glue; + } + + /** + * Normalize the header to be a single header with an array of values. + * + * If any values of the header contains the glue string value (e.g. ","), then the value will be exploded into + * multiple entries in the header. + * + * @return self + */ + public function normalize() + { + $values = $this->toArray(); + + for ($i = 0, $total = count($values); $i < $total; $i++) { + if (strpos($values[$i], $this->glue) !== false) { + // Explode on glue when the glue is not inside of a comma + foreach (preg_split('/' . preg_quote($this->glue) . '(?=([^"]*"[^"]*")*[^"]*$)/', $values[$i]) as $v) { + $values[] = trim($v); + } + unset($values[$i]); + } + } + + $this->values = array_values($values); + + return $this; + } + + public function hasValue($searchValue) + { + return in_array($searchValue, $this->toArray()); + } + + public function removeValue($searchValue) + { + $this->values = array_values(array_filter($this->values, function ($value) use ($searchValue) { + return $value != $searchValue; + })); + + return $this; + } + + public function toArray() + { + return $this->values; + } + + public function count() + { + return count($this->toArray()); + } + + public function getIterator() + { + return new \ArrayIterator($this->toArray()); + } + + public function parseParams() + { + $params = $matches = array(); + $callback = array($this, 'trimHeader'); + + // Normalize the header into a single array and iterate over all values + foreach ($this->normalize()->toArray() as $val) { + $part = array(); + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (!preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + continue; + } + $pieces = array_map($callback, $matches[0]); + $part[$pieces[0]] = isset($pieces[1]) ? $pieces[1] : ''; + } + if ($part) { + $params[] = $part; + } + } + + return $params; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function hasExactHeader($header) + { + Version::warn(__METHOD__ . ' is deprecated'); + return $this->header == $header; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function raw() + { + Version::warn(__METHOD__ . ' is deprecated. Use toArray()'); + return $this->toArray(); + } + + /** + * Trim a header by removing excess spaces and wrapping quotes + * + * @param $str + * + * @return string + */ + protected function trimHeader($str) + { + static $trimmed = "\"' \n\t"; + + return trim($str, $trimmed); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php b/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php new file mode 100644 index 0000000..77789e5 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php @@ -0,0 +1,121 @@ +directives = null; + } + + public function removeValue($searchValue) + { + parent::removeValue($searchValue); + $this->directives = null; + } + + /** + * Check if a specific cache control directive exists + * + * @param string $param Directive to retrieve + * + * @return bool + */ + public function hasDirective($param) + { + $directives = $this->getDirectives(); + + return isset($directives[$param]); + } + + /** + * Get a specific cache control directive + * + * @param string $param Directive to retrieve + * + * @return string|bool|null + */ + public function getDirective($param) + { + $directives = $this->getDirectives(); + + return isset($directives[$param]) ? $directives[$param] : null; + } + + /** + * Add a cache control directive + * + * @param string $param Directive to add + * @param string $value Value to set + * + * @return self + */ + public function addDirective($param, $value) + { + $directives = $this->getDirectives(); + $directives[$param] = $value; + $this->updateFromDirectives($directives); + + return $this; + } + + /** + * Remove a cache control directive by name + * + * @param string $param Directive to remove + * + * @return self + */ + public function removeDirective($param) + { + $directives = $this->getDirectives(); + unset($directives[$param]); + $this->updateFromDirectives($directives); + + return $this; + } + + /** + * Get an associative array of cache control directives + * + * @return array + */ + public function getDirectives() + { + if ($this->directives === null) { + $this->directives = array(); + foreach ($this->parseParams() as $collection) { + foreach ($collection as $key => $value) { + $this->directives[$key] = $value === '' ? true : $value; + } + } + } + + return $this->directives; + } + + /** + * Updates the header value based on the parsed directives + * + * @param array $directives Array of cache control directives + */ + protected function updateFromDirectives(array $directives) + { + $this->directives = $directives; + $this->values = array(); + + foreach ($directives as $key => $value) { + $this->values[] = $value === true ? $key : "{$key}={$value}"; + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php b/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php new file mode 100644 index 0000000..8c7f6ae --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php @@ -0,0 +1,108 @@ +headers = $headers; + } + + public function __clone() + { + foreach ($this->headers as &$header) { + $header = clone $header; + } + } + + /** + * Clears the header collection + */ + public function clear() + { + $this->headers = array(); + } + + /** + * Set a header on the collection + * + * @param HeaderInterface $header Header to add + * + * @return self + */ + public function add(HeaderInterface $header) + { + $this->headers[strtolower($header->getName())] = $header; + + return $this; + } + + /** + * Get an array of header objects + * + * @return array + */ + public function getAll() + { + return $this->headers; + } + + /** + * Alias of offsetGet + */ + public function get($key) + { + return $this->offsetGet($key); + } + + public function count() + { + return count($this->headers); + } + + public function offsetExists($offset) + { + return isset($this->headers[strtolower($offset)]); + } + + public function offsetGet($offset) + { + $l = strtolower($offset); + + return isset($this->headers[$l]) ? $this->headers[$l] : null; + } + + public function offsetSet($offset, $value) + { + $this->add($value); + } + + public function offsetUnset($offset) + { + unset($this->headers[strtolower($offset)]); + } + + public function getIterator() + { + return new \ArrayIterator($this->headers); + } + + public function toArray() + { + $result = array(); + foreach ($this->headers as $header) { + $result[$header->getName()] = $header->toArray(); + } + + return $result; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php b/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php new file mode 100644 index 0000000..0273be5 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php @@ -0,0 +1,26 @@ + 'Guzzle\Http\Message\Header\CacheControl', + 'link' => 'Guzzle\Http\Message\Header\Link', + ); + + public function createHeader($header, $value = null) + { + $lowercase = strtolower($header); + + return isset($this->mapping[$lowercase]) + ? new $this->mapping[$lowercase]($header, $value) + : new Header($header, $value); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php b/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php new file mode 100644 index 0000000..9457cf6 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php @@ -0,0 +1,19 @@ +", "rel=\"{$rel}\""); + + foreach ($params as $k => $v) { + $values[] = "{$k}=\"{$v}\""; + } + + return $this->add(implode('; ', $values)); + } + + /** + * Check if a specific link exists for a given rel attribute + * + * @param string $rel rel value + * + * @return bool + */ + public function hasLink($rel) + { + return $this->getLink($rel) !== null; + } + + /** + * Get a specific link for a given rel attribute + * + * @param string $rel Rel value + * + * @return array|null + */ + public function getLink($rel) + { + foreach ($this->getLinks() as $link) { + if (isset($link['rel']) && $link['rel'] == $rel) { + return $link; + } + } + + return null; + } + + /** + * Get an associative array of links + * + * For example: + * Link: ; rel=front; type="image/jpeg", ; rel=back; type="image/jpeg" + * + * + * var_export($response->getLinks()); + * array( + * array( + * 'url' => 'http:/.../front.jpeg', + * 'rel' => 'back', + * 'type' => 'image/jpeg', + * ) + * ) + * + * + * @return array + */ + public function getLinks() + { + $links = $this->parseParams(); + + foreach ($links as &$link) { + $key = key($link); + unset($link[$key]); + $link['url'] = trim($key, '<> '); + } + + return $links; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php b/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php new file mode 100644 index 0000000..62bcd43 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php @@ -0,0 +1,102 @@ +fieldName = $fieldName; + $this->setFilename($filename); + $this->postname = $postname ? $postname : basename($filename); + $this->contentType = $contentType ?: $this->guessContentType(); + } + + public function setFieldName($name) + { + $this->fieldName = $name; + + return $this; + } + + public function getFieldName() + { + return $this->fieldName; + } + + public function setFilename($filename) + { + // Remove leading @ symbol + if (strpos($filename, '@') === 0) { + $filename = substr($filename, 1); + } + + if (!is_readable($filename)) { + throw new InvalidArgumentException("Unable to open {$filename} for reading"); + } + + $this->filename = $filename; + + return $this; + } + + public function setPostname($postname) + { + $this->postname = $postname; + + return $this; + } + + public function getFilename() + { + return $this->filename; + } + + public function getPostname() + { + return $this->postname; + } + + public function setContentType($type) + { + $this->contentType = $type; + + return $this; + } + + public function getContentType() + { + return $this->contentType; + } + + public function getCurlValue() + { + // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax + // See: https://wiki.php.net/rfc/curl-file-upload + if (function_exists('curl_file_create')) { + return curl_file_create($this->filename, $this->contentType, $this->postname); + } + + // Use the old style if using an older version of PHP + $value = "@{$this->filename};filename=" . $this->postname; + if ($this->contentType) { + $value .= ';type=' . $this->contentType; + } + + return $value; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getCurlString() + { + Version::warn(__METHOD__ . ' is deprecated. Use getCurlValue()'); + return $this->getCurlValue(); + } + + /** + * Determine the Content-Type of the file + */ + protected function guessContentType() + { + return Mimetypes::getInstance()->fromFilename($this->filename) ?: 'application/octet-stream'; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php b/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php new file mode 100644 index 0000000..7f0779d --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php @@ -0,0 +1,83 @@ +method = strtoupper($method); + $this->curlOptions = new Collection(); + $this->setUrl($url); + + if ($headers) { + // Special handling for multi-value headers + foreach ($headers as $key => $value) { + // Deal with collisions with Host and Authorization + if ($key == 'host' || $key == 'Host') { + $this->setHeader($key, $value); + } elseif ($value instanceof HeaderInterface) { + $this->addHeader($key, $value); + } else { + foreach ((array) $value as $v) { + $this->addHeader($key, $v); + } + } + } + } + + $this->setState(self::STATE_NEW); + } + + public function __clone() + { + if ($this->eventDispatcher) { + $this->eventDispatcher = clone $this->eventDispatcher; + } + $this->curlOptions = clone $this->curlOptions; + $this->params = clone $this->params; + $this->url = clone $this->url; + $this->response = $this->responseBody = null; + $this->headers = clone $this->headers; + + $this->setState(RequestInterface::STATE_NEW); + $this->dispatch('request.clone', array('request' => $this)); + } + + /** + * Get the HTTP request as a string + * + * @return string + */ + public function __toString() + { + return $this->getRawHeaders() . "\r\n\r\n"; + } + + /** + * Default method that will throw exceptions if an unsuccessful response is received. + * + * @param Event $event Received + * @throws BadResponseException if the response is not successful + */ + public static function onRequestError(Event $event) + { + $e = BadResponseException::factory($event['request'], $event['response']); + $event['request']->setState(self::STATE_ERROR, array('exception' => $e) + $event->toArray()); + throw $e; + } + + public function setClient(ClientInterface $client) + { + $this->client = $client; + + return $this; + } + + public function getClient() + { + return $this->client; + } + + public function getRawHeaders() + { + $protocolVersion = $this->protocolVersion ?: '1.1'; + + return trim($this->method . ' ' . $this->getResource()) . ' ' + . strtoupper(str_replace('https', 'http', $this->url->getScheme())) + . '/' . $protocolVersion . "\r\n" . implode("\r\n", $this->getHeaderLines()); + } + + public function setUrl($url) + { + if ($url instanceof Url) { + $this->url = $url; + } else { + $this->url = Url::factory($url); + } + + // Update the port and host header + $this->setPort($this->url->getPort()); + + if ($this->url->getUsername() || $this->url->getPassword()) { + $this->setAuth($this->url->getUsername(), $this->url->getPassword()); + // Remove the auth info from the URL + $this->url->setUsername(null); + $this->url->setPassword(null); + } + + return $this; + } + + public function send() + { + if (!$this->client) { + throw new RuntimeException('A client must be set on the request'); + } + + return $this->client->send($this); + } + + public function getResponse() + { + return $this->response; + } + + public function getQuery($asString = false) + { + return $asString + ? (string) $this->url->getQuery() + : $this->url->getQuery(); + } + + public function getMethod() + { + return $this->method; + } + + public function getScheme() + { + return $this->url->getScheme(); + } + + public function setScheme($scheme) + { + $this->url->setScheme($scheme); + + return $this; + } + + public function getHost() + { + return $this->url->getHost(); + } + + public function setHost($host) + { + $this->url->setHost($host); + $this->setPort($this->url->getPort()); + + return $this; + } + + public function getProtocolVersion() + { + return $this->protocolVersion; + } + + public function setProtocolVersion($protocol) + { + $this->protocolVersion = $protocol; + + return $this; + } + + public function getPath() + { + return '/' . ltrim($this->url->getPath(), '/'); + } + + public function setPath($path) + { + $this->url->setPath($path); + + return $this; + } + + public function getPort() + { + return $this->url->getPort(); + } + + public function setPort($port) + { + $this->url->setPort($port); + + // Include the port in the Host header if it is not the default port for the scheme of the URL + $scheme = $this->url->getScheme(); + if ($port && (($scheme == 'http' && $port != 80) || ($scheme == 'https' && $port != 443))) { + $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost() . ':' . $port); + } else { + $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost()); + } + + return $this; + } + + public function getUsername() + { + return $this->username; + } + + public function getPassword() + { + return $this->password; + } + + public function setAuth($user, $password = '', $scheme = CURLAUTH_BASIC) + { + static $authMap = array( + 'basic' => CURLAUTH_BASIC, + 'digest' => CURLAUTH_DIGEST, + 'ntlm' => CURLAUTH_NTLM, + 'any' => CURLAUTH_ANY + ); + + // If we got false or null, disable authentication + if (!$user) { + $this->password = $this->username = null; + $this->removeHeader('Authorization'); + $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH); + return $this; + } + + if (!is_numeric($scheme)) { + $scheme = strtolower($scheme); + if (!isset($authMap[$scheme])) { + throw new InvalidArgumentException($scheme . ' is not a valid authentication type'); + } + $scheme = $authMap[$scheme]; + } + + $this->username = $user; + $this->password = $password; + + // Bypass CURL when using basic auth to promote connection reuse + if ($scheme == CURLAUTH_BASIC) { + $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH); + $this->setHeader('Authorization', 'Basic ' . base64_encode($this->username . ':' . $this->password)); + } else { + $this->getCurlOptions() + ->set(CURLOPT_HTTPAUTH, $scheme) + ->set(CURLOPT_USERPWD, $this->username . ':' . $this->password); + } + + return $this; + } + + public function getResource() + { + $resource = $this->getPath(); + if ($query = (string) $this->url->getQuery()) { + $resource .= '?' . $query; + } + + return $resource; + } + + public function getUrl($asObject = false) + { + return $asObject ? clone $this->url : (string) $this->url; + } + + public function getState() + { + return $this->state; + } + + public function setState($state, array $context = array()) + { + $oldState = $this->state; + $this->state = $state; + + switch ($state) { + case self::STATE_NEW: + $this->response = null; + break; + case self::STATE_TRANSFER: + if ($oldState !== $state) { + // Fix Content-Length and Transfer-Encoding collisions + if ($this->hasHeader('Transfer-Encoding') && $this->hasHeader('Content-Length')) { + $this->removeHeader('Transfer-Encoding'); + } + $this->dispatch('request.before_send', array('request' => $this)); + } + break; + case self::STATE_COMPLETE: + if ($oldState !== $state) { + $this->processResponse($context); + $this->responseBody = null; + } + break; + case self::STATE_ERROR: + if (isset($context['exception'])) { + $this->dispatch('request.exception', array( + 'request' => $this, + 'response' => isset($context['response']) ? $context['response'] : $this->response, + 'exception' => isset($context['exception']) ? $context['exception'] : null + )); + } + } + + return $this->state; + } + + public function getCurlOptions() + { + return $this->curlOptions; + } + + public function startResponse(Response $response) + { + $this->state = self::STATE_TRANSFER; + $response->setEffectiveUrl((string) $this->getUrl()); + $this->response = $response; + + return $this; + } + + public function setResponse(Response $response, $queued = false) + { + $response->setEffectiveUrl((string) $this->url); + + if ($queued) { + $ed = $this->getEventDispatcher(); + $ed->addListener('request.before_send', $f = function ($e) use ($response, &$f, $ed) { + $e['request']->setResponse($response); + $ed->removeListener('request.before_send', $f); + }, -9999); + } else { + $this->response = $response; + // If a specific response body is specified, then use it instead of the response's body + if ($this->responseBody && !$this->responseBody->getCustomData('default') && !$response->isRedirect()) { + $this->getResponseBody()->write((string) $this->response->getBody()); + } else { + $this->responseBody = $this->response->getBody(); + } + $this->setState(self::STATE_COMPLETE); + } + + return $this; + } + + public function setResponseBody($body) + { + // Attempt to open a file for writing if a string was passed + if (is_string($body)) { + // @codeCoverageIgnoreStart + if (!($body = fopen($body, 'w+'))) { + throw new InvalidArgumentException('Could not open ' . $body . ' for writing'); + } + // @codeCoverageIgnoreEnd + } + + $this->responseBody = EntityBody::factory($body); + + return $this; + } + + public function getResponseBody() + { + if ($this->responseBody === null) { + $this->responseBody = EntityBody::factory()->setCustomData('default', true); + } + + return $this->responseBody; + } + + /** + * Determine if the response body is repeatable (readable + seekable) + * + * @return bool + * @deprecated Use getResponseBody()->isSeekable() + * @codeCoverageIgnore + */ + public function isResponseBodyRepeatable() + { + Version::warn(__METHOD__ . ' is deprecated. Use $request->getResponseBody()->isRepeatable()'); + return !$this->responseBody ? true : $this->responseBody->isRepeatable(); + } + + public function getCookies() + { + if ($cookie = $this->getHeader('Cookie')) { + $data = ParserRegistry::getInstance()->getParser('cookie')->parseCookie($cookie); + return $data['cookies']; + } + + return array(); + } + + public function getCookie($name) + { + $cookies = $this->getCookies(); + + return isset($cookies[$name]) ? $cookies[$name] : null; + } + + public function addCookie($name, $value) + { + if (!$this->hasHeader('Cookie')) { + $this->setHeader('Cookie', "{$name}={$value}"); + } else { + $this->getHeader('Cookie')->add("{$name}={$value}"); + } + + // Always use semicolons to separate multiple cookie headers + $this->getHeader('Cookie')->setGlue(';'); + + return $this; + } + + public function removeCookie($name) + { + if ($cookie = $this->getHeader('Cookie')) { + foreach ($cookie as $cookieValue) { + if (strpos($cookieValue, $name . '=') === 0) { + $cookie->removeValue($cookieValue); + } + } + } + + return $this; + } + + public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) + { + $this->eventDispatcher = $eventDispatcher; + $this->eventDispatcher->addListener('request.error', array(__CLASS__, 'onRequestError'), -255); + + return $this; + } + + public function getEventDispatcher() + { + if (!$this->eventDispatcher) { + $this->setEventDispatcher(new EventDispatcher()); + } + + return $this->eventDispatcher; + } + + public function dispatch($eventName, array $context = array()) + { + $context['request'] = $this; + + return $this->getEventDispatcher()->dispatch($eventName, new Event($context)); + } + + public function addSubscriber(EventSubscriberInterface $subscriber) + { + $this->getEventDispatcher()->addSubscriber($subscriber); + + return $this; + } + + /** + * Get an array containing the request and response for event notifications + * + * @return array + */ + protected function getEventArray() + { + return array( + 'request' => $this, + 'response' => $this->response + ); + } + + /** + * Process a received response + * + * @param array $context Contextual information + * @throws RequestException|BadResponseException on unsuccessful responses + */ + protected function processResponse(array $context = array()) + { + if (!$this->response) { + // If no response, then processResponse shouldn't have been called + $e = new RequestException('Error completing request'); + $e->setRequest($this); + throw $e; + } + + $this->state = self::STATE_COMPLETE; + + // A request was sent, but we don't know if we'll send more or if the final response will be successful + $this->dispatch('request.sent', $this->getEventArray() + $context); + + // Some response processors will remove the response or reset the state (example: ExponentialBackoffPlugin) + if ($this->state == RequestInterface::STATE_COMPLETE) { + + // The request completed, so the HTTP transaction is complete + $this->dispatch('request.complete', $this->getEventArray()); + + // If the response is bad, allow listeners to modify it or throw exceptions. You can change the response by + // modifying the Event object in your listeners or calling setResponse() on the request + if ($this->response->isError()) { + $event = new Event($this->getEventArray()); + $this->getEventDispatcher()->dispatch('request.error', $event); + // Allow events of request.error to quietly change the response + if ($event['response'] !== $this->response) { + $this->response = $event['response']; + } + } + + // If a successful response was received, dispatch an event + if ($this->response->isSuccessful()) { + $this->dispatch('request.success', $this->getEventArray()); + } + } + } + + /** + * @deprecated Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy + * @codeCoverageIgnore + */ + public function canCache() + { + Version::warn(__METHOD__ . ' is deprecated. Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy.'); + if (class_exists('Guzzle\Plugin\Cache\DefaultCanCacheStrategy')) { + $canCache = new \Guzzle\Plugin\Cache\DefaultCanCacheStrategy(); + return $canCache->canCacheRequest($this); + } else { + return false; + } + } + + /** + * @deprecated Use the history plugin (not emitting a warning as this is built-into the RedirectPlugin for now) + * @codeCoverageIgnore + */ + public function setIsRedirect($isRedirect) + { + $this->isRedirect = $isRedirect; + + return $this; + } + + /** + * @deprecated Use the history plugin + * @codeCoverageIgnore + */ + public function isRedirect() + { + Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin to track this.'); + return $this->isRedirect; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php b/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php new file mode 100644 index 0000000..ba00a76 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php @@ -0,0 +1,359 @@ +methods = array_flip(get_class_methods(__CLASS__)); + } + + public function fromMessage($message) + { + $parsed = ParserRegistry::getInstance()->getParser('message')->parseRequest($message); + + if (!$parsed) { + return false; + } + + $request = $this->fromParts($parsed['method'], $parsed['request_url'], + $parsed['headers'], $parsed['body'], $parsed['protocol'], + $parsed['version']); + + // EntityEnclosingRequest adds an "Expect: 100-Continue" header when using a raw request body for PUT or POST + // requests. This factory method should accurately reflect the message, so here we are removing the Expect + // header if one was not supplied in the message. + if (!isset($parsed['headers']['Expect']) && !isset($parsed['headers']['expect'])) { + $request->removeHeader('Expect'); + } + + return $request; + } + + public function fromParts( + $method, + array $urlParts, + $headers = null, + $body = null, + $protocol = 'HTTP', + $protocolVersion = '1.1' + ) { + return $this->create($method, Url::buildUrl($urlParts), $headers, $body) + ->setProtocolVersion($protocolVersion); + } + + public function create($method, $url, $headers = null, $body = null, array $options = array()) + { + $method = strtoupper($method); + + if ($method == 'GET' || $method == 'HEAD' || $method == 'TRACE') { + // Handle non-entity-enclosing request methods + $request = new $this->requestClass($method, $url, $headers); + if ($body) { + // The body is where the response body will be stored + $type = gettype($body); + if ($type == 'string' || $type == 'resource' || $type == 'object') { + $request->setResponseBody($body); + } + } + } else { + // Create an entity enclosing request by default + $request = new $this->entityEnclosingRequestClass($method, $url, $headers); + if ($body || $body === '0') { + // Add POST fields and files to an entity enclosing request if an array is used + if (is_array($body) || $body instanceof Collection) { + // Normalize PHP style cURL uploads with a leading '@' symbol + foreach ($body as $key => $value) { + if (is_string($value) && substr($value, 0, 1) == '@') { + $request->addPostFile($key, $value); + unset($body[$key]); + } + } + // Add the fields if they are still present and not all files + $request->addPostFields($body); + } else { + // Add a raw entity body body to the request + $request->setBody($body, (string) $request->getHeader('Content-Type')); + if ((string) $request->getHeader('Transfer-Encoding') == 'chunked') { + $request->removeHeader('Content-Length'); + } + } + } + } + + if ($options) { + $this->applyOptions($request, $options); + } + + return $request; + } + + /** + * Clone a request while changing the method. Emulates the behavior of + * {@see Guzzle\Http\Message\Request::clone}, but can change the HTTP method. + * + * @param RequestInterface $request Request to clone + * @param string $method Method to set + * + * @return RequestInterface + */ + public function cloneRequestWithMethod(RequestInterface $request, $method) + { + // Create the request with the same client if possible + if ($request->getClient()) { + $cloned = $request->getClient()->createRequest($method, $request->getUrl(), $request->getHeaders()); + } else { + $cloned = $this->create($method, $request->getUrl(), $request->getHeaders()); + } + + $cloned->getCurlOptions()->replace($request->getCurlOptions()->toArray()); + $cloned->setEventDispatcher(clone $request->getEventDispatcher()); + // Ensure that that the Content-Length header is not copied if changing to GET or HEAD + if (!($cloned instanceof EntityEnclosingRequestInterface)) { + $cloned->removeHeader('Content-Length'); + } elseif ($request instanceof EntityEnclosingRequestInterface) { + $cloned->setBody($request->getBody()); + } + $cloned->getParams()->replace($request->getParams()->toArray()); + $cloned->dispatch('request.clone', array('request' => $cloned)); + + return $cloned; + } + + public function applyOptions(RequestInterface $request, array $options = array(), $flags = self::OPTIONS_NONE) + { + // Iterate over each key value pair and attempt to apply a config using function visitors + foreach ($options as $key => $value) { + $method = "visit_{$key}"; + if (isset($this->methods[$method])) { + $this->{$method}($request, $value, $flags); + } + } + } + + protected function visit_headers(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('headers value must be an array'); + } + + if ($flags & self::OPTIONS_AS_DEFAULTS) { + // Merge headers in but do not overwrite existing values + foreach ($value as $key => $header) { + if (!$request->hasHeader($key)) { + $request->setHeader($key, $header); + } + } + } else { + $request->addHeaders($value); + } + } + + protected function visit_body(RequestInterface $request, $value, $flags) + { + if ($request instanceof EntityEnclosingRequestInterface) { + $request->setBody($value); + } else { + throw new InvalidArgumentException('Attempting to set a body on a non-entity-enclosing request'); + } + } + + protected function visit_allow_redirects(RequestInterface $request, $value, $flags) + { + if ($value === false) { + $request->getParams()->set(RedirectPlugin::DISABLE, true); + } + } + + protected function visit_auth(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('auth value must be an array'); + } + + $request->setAuth($value[0], isset($value[1]) ? $value[1] : null, isset($value[2]) ? $value[2] : 'basic'); + } + + protected function visit_query(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('query value must be an array'); + } + + if ($flags & self::OPTIONS_AS_DEFAULTS) { + // Merge query string values in but do not overwrite existing values + $query = $request->getQuery(); + $query->overwriteWith(array_diff_key($value, $query->toArray())); + } else { + $request->getQuery()->overwriteWith($value); + } + } + + protected function visit_cookies(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('cookies value must be an array'); + } + + foreach ($value as $name => $v) { + $request->addCookie($name, $v); + } + } + + protected function visit_events(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('events value must be an array'); + } + + foreach ($value as $name => $method) { + if (is_array($method)) { + $request->getEventDispatcher()->addListener($name, $method[0], $method[1]); + } else { + $request->getEventDispatcher()->addListener($name, $method); + } + } + } + + protected function visit_plugins(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('plugins value must be an array'); + } + + foreach ($value as $plugin) { + $request->addSubscriber($plugin); + } + } + + protected function visit_exceptions(RequestInterface $request, $value, $flags) + { + if ($value === false || $value === 0) { + $dispatcher = $request->getEventDispatcher(); + foreach ($dispatcher->getListeners('request.error') as $listener) { + if (is_array($listener) && $listener[0] == 'Guzzle\Http\Message\Request' && $listener[1] = 'onRequestError') { + $dispatcher->removeListener('request.error', $listener); + break; + } + } + } + } + + protected function visit_save_to(RequestInterface $request, $value, $flags) + { + $request->setResponseBody($value); + } + + protected function visit_params(RequestInterface $request, $value, $flags) + { + if (!is_array($value)) { + throw new InvalidArgumentException('params value must be an array'); + } + + $request->getParams()->overwriteWith($value); + } + + protected function visit_timeout(RequestInterface $request, $value, $flags) + { + if (defined('CURLOPT_TIMEOUT_MS')) { + $request->getCurlOptions()->set(CURLOPT_TIMEOUT_MS, $value * 1000); + } else { + $request->getCurlOptions()->set(CURLOPT_TIMEOUT, $value); + } + } + + protected function visit_connect_timeout(RequestInterface $request, $value, $flags) + { + if (defined('CURLOPT_CONNECTTIMEOUT_MS')) { + $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT_MS, $value * 1000); + } else { + $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT, $value); + } + } + + protected function visit_debug(RequestInterface $request, $value, $flags) + { + if ($value) { + $request->getCurlOptions()->set(CURLOPT_VERBOSE, true); + } + } + + protected function visit_verify(RequestInterface $request, $value, $flags) + { + $curl = $request->getCurlOptions(); + if ($value === true || is_string($value)) { + $curl[CURLOPT_SSL_VERIFYHOST] = 2; + $curl[CURLOPT_SSL_VERIFYPEER] = true; + if ($value !== true) { + $curl[CURLOPT_CAINFO] = $value; + } + } elseif ($value === false) { + unset($curl[CURLOPT_CAINFO]); + $curl[CURLOPT_SSL_VERIFYHOST] = 0; + $curl[CURLOPT_SSL_VERIFYPEER] = false; + } + } + + protected function visit_proxy(RequestInterface $request, $value, $flags) + { + $request->getCurlOptions()->set(CURLOPT_PROXY, $value, $flags); + } + + protected function visit_cert(RequestInterface $request, $value, $flags) + { + if (is_array($value)) { + $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value[0]); + $request->getCurlOptions()->set(CURLOPT_SSLCERTPASSWD, $value[1]); + } else { + $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value); + } + } + + protected function visit_ssl_key(RequestInterface $request, $value, $flags) + { + if (is_array($value)) { + $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value[0]); + $request->getCurlOptions()->set(CURLOPT_SSLKEYPASSWD, $value[1]); + } else { + $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value); + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php b/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php new file mode 100644 index 0000000..6088f10 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php @@ -0,0 +1,105 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 208 => 'Already Reported', + 226 => 'IM Used', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Reserved for WebDAV advanced collections expired proposal', + 426 => 'Upgrade required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates (Experimental)', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 510 => 'Not Extended', + 511 => 'Network Authentication Required', + ); + + /** @var EntityBodyInterface The response body */ + protected $body; + + /** @var string The reason phrase of the response (human readable code) */ + protected $reasonPhrase; + + /** @var string The status code of the response */ + protected $statusCode; + + /** @var array Information about the request */ + protected $info = array(); + + /** @var string The effective URL that returned this response */ + protected $effectiveUrl; + + /** @var array Cacheable response codes (see RFC 2616:13.4) */ + protected static $cacheResponseCodes = array(200, 203, 206, 300, 301, 410); + + /** + * Create a new Response based on a raw response message + * + * @param string $message Response message + * + * @return self|bool Returns false on error + */ + public static function fromMessage($message) + { + $data = ParserRegistry::getInstance()->getParser('message')->parseResponse($message); + if (!$data) { + return false; + } + + $response = new static($data['code'], $data['headers'], $data['body']); + $response->setProtocol($data['protocol'], $data['version']) + ->setStatus($data['code'], $data['reason_phrase']); + + // Set the appropriate Content-Length if the one set is inaccurate (e.g. setting to X) + $contentLength = (string) $response->getHeader('Content-Length'); + $actualLength = strlen($data['body']); + if (strlen($data['body']) > 0 && $contentLength != $actualLength) { + $response->setHeader('Content-Length', $actualLength); + } + + return $response; + } + + /** + * Construct the response + * + * @param string $statusCode The response status code (e.g. 200, 404, etc) + * @param ToArrayInterface|array $headers The response headers + * @param string|resource|EntityBodyInterface $body The body of the response + * + * @throws BadResponseException if an invalid response code is given + */ + public function __construct($statusCode, $headers = null, $body = null) + { + parent::__construct(); + $this->setStatus($statusCode); + $this->body = EntityBody::factory($body !== null ? $body : ''); + + if ($headers) { + if (is_array($headers)) { + $this->setHeaders($headers); + } elseif ($headers instanceof ToArrayInterface) { + $this->setHeaders($headers->toArray()); + } else { + throw new BadResponseException('Invalid headers argument received'); + } + } + } + + /** + * @return string + */ + public function __toString() + { + return $this->getMessage(); + } + + public function serialize() + { + return json_encode(array( + 'status' => $this->statusCode, + 'body' => (string) $this->body, + 'headers' => $this->headers->toArray() + )); + } + + public function unserialize($serialize) + { + $data = json_decode($serialize, true); + $this->__construct($data['status'], $data['headers'], $data['body']); + } + + /** + * Get the response entity body + * + * @param bool $asString Set to TRUE to return a string of the body rather than a full body object + * + * @return EntityBodyInterface|string + */ + public function getBody($asString = false) + { + return $asString ? (string) $this->body : $this->body; + } + + /** + * Set the response entity body + * + * @param EntityBodyInterface|string $body Body to set + * + * @return self + */ + public function setBody($body) + { + $this->body = EntityBody::factory($body); + + return $this; + } + + /** + * Set the protocol and protocol version of the response + * + * @param string $protocol Response protocol + * @param string $version Protocol version + * + * @return self + */ + public function setProtocol($protocol, $version) + { + $this->protocol = $protocol; + $this->protocolVersion = $version; + + return $this; + } + + /** + * Get the protocol used for the response (e.g. HTTP) + * + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * Get the HTTP protocol version + * + * @return string + */ + public function getProtocolVersion() + { + return $this->protocolVersion; + } + + /** + * Get a cURL transfer information + * + * @param string $key A single statistic to check + * + * @return array|string|null Returns all stats if no key is set, a single stat if a key is set, or null if a key + * is set and not found + * @link http://www.php.net/manual/en/function.curl-getinfo.php + */ + public function getInfo($key = null) + { + if ($key === null) { + return $this->info; + } elseif (array_key_exists($key, $this->info)) { + return $this->info[$key]; + } else { + return null; + } + } + + /** + * Set the transfer information + * + * @param array $info Array of cURL transfer stats + * + * @return self + */ + public function setInfo(array $info) + { + $this->info = $info; + + return $this; + } + + /** + * Set the response status + * + * @param int $statusCode Response status code to set + * @param string $reasonPhrase Response reason phrase + * + * @return self + * @throws BadResponseException when an invalid response code is received + */ + public function setStatus($statusCode, $reasonPhrase = '') + { + $this->statusCode = (int) $statusCode; + + if (!$reasonPhrase && isset(self::$statusTexts[$this->statusCode])) { + $this->reasonPhrase = self::$statusTexts[$this->statusCode]; + } else { + $this->reasonPhrase = $reasonPhrase; + } + + return $this; + } + + /** + * Get the response status code + * + * @return integer + */ + public function getStatusCode() + { + return $this->statusCode; + } + + /** + * Get the entire response as a string + * + * @return string + */ + public function getMessage() + { + $message = $this->getRawHeaders(); + + // Only include the body in the message if the size is < 2MB + $size = $this->body->getSize(); + if ($size < 2097152) { + $message .= (string) $this->body; + } + + return $message; + } + + /** + * Get the the raw message headers as a string + * + * @return string + */ + public function getRawHeaders() + { + $headers = 'HTTP/1.1 ' . $this->statusCode . ' ' . $this->reasonPhrase . "\r\n"; + $lines = $this->getHeaderLines(); + if (!empty($lines)) { + $headers .= implode("\r\n", $lines) . "\r\n"; + } + + return $headers . "\r\n"; + } + + /** + * Get the response reason phrase- a human readable version of the numeric + * status code + * + * @return string + */ + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + /** + * Get the Accept-Ranges HTTP header + * + * @return string Returns what partial content range types this server supports. + */ + public function getAcceptRanges() + { + return (string) $this->getHeader('Accept-Ranges'); + } + + /** + * Calculate the age of the response + * + * @return integer + */ + public function calculateAge() + { + $age = $this->getHeader('Age'); + + if ($age === null && $this->getDate()) { + $age = time() - strtotime($this->getDate()); + } + + return $age === null ? null : (int) (string) $age; + } + + /** + * Get the Age HTTP header + * + * @return integer|null Returns the age the object has been in a proxy cache in seconds. + */ + public function getAge() + { + return (string) $this->getHeader('Age'); + } + + /** + * Get the Allow HTTP header + * + * @return string|null Returns valid actions for a specified resource. To be used for a 405 Method not allowed. + */ + public function getAllow() + { + return (string) $this->getHeader('Allow'); + } + + /** + * Check if an HTTP method is allowed by checking the Allow response header + * + * @param string $method Method to check + * + * @return bool + */ + public function isMethodAllowed($method) + { + $allow = $this->getHeader('Allow'); + if ($allow) { + foreach (explode(',', $allow) as $allowable) { + if (!strcasecmp(trim($allowable), $method)) { + return true; + } + } + } + + return false; + } + + /** + * Get the Cache-Control HTTP header + * + * @return string + */ + public function getCacheControl() + { + return (string) $this->getHeader('Cache-Control'); + } + + /** + * Get the Connection HTTP header + * + * @return string + */ + public function getConnection() + { + return (string) $this->getHeader('Connection'); + } + + /** + * Get the Content-Encoding HTTP header + * + * @return string|null + */ + public function getContentEncoding() + { + return (string) $this->getHeader('Content-Encoding'); + } + + /** + * Get the Content-Language HTTP header + * + * @return string|null Returns the language the content is in. + */ + public function getContentLanguage() + { + return (string) $this->getHeader('Content-Language'); + } + + /** + * Get the Content-Length HTTP header + * + * @return integer Returns the length of the response body in bytes + */ + public function getContentLength() + { + return (int) (string) $this->getHeader('Content-Length'); + } + + /** + * Get the Content-Location HTTP header + * + * @return string|null Returns an alternate location for the returned data (e.g /index.htm) + */ + public function getContentLocation() + { + return (string) $this->getHeader('Content-Location'); + } + + /** + * Get the Content-Disposition HTTP header + * + * @return string|null Returns the Content-Disposition header + */ + public function getContentDisposition() + { + return (string) $this->getHeader('Content-Disposition'); + } + + /** + * Get the Content-MD5 HTTP header + * + * @return string|null Returns a Base64-encoded binary MD5 sum of the content of the response. + */ + public function getContentMd5() + { + return (string) $this->getHeader('Content-MD5'); + } + + /** + * Get the Content-Range HTTP header + * + * @return string Returns where in a full body message this partial message belongs (e.g. bytes 21010-47021/47022). + */ + public function getContentRange() + { + return (string) $this->getHeader('Content-Range'); + } + + /** + * Get the Content-Type HTTP header + * + * @return string Returns the mime type of this content. + */ + public function getContentType() + { + return (string) $this->getHeader('Content-Type'); + } + + /** + * Checks if the Content-Type is of a certain type. This is useful if the + * Content-Type header contains charset information and you need to know if + * the Content-Type matches a particular type. + * + * @param string $type Content type to check against + * + * @return bool + */ + public function isContentType($type) + { + return stripos($this->getHeader('Content-Type'), $type) !== false; + } + + /** + * Get the Date HTTP header + * + * @return string|null Returns the date and time that the message was sent. + */ + public function getDate() + { + return (string) $this->getHeader('Date'); + } + + /** + * Get the ETag HTTP header + * + * @return string|null Returns an identifier for a specific version of a resource, often a Message digest. + */ + public function getEtag() + { + return (string) $this->getHeader('ETag'); + } + + /** + * Get the Expires HTTP header + * + * @return string|null Returns the date/time after which the response is considered stale. + */ + public function getExpires() + { + return (string) $this->getHeader('Expires'); + } + + /** + * Get the Last-Modified HTTP header + * + * @return string|null Returns the last modified date for the requested object, in RFC 2822 format + * (e.g. Tue, 15 Nov 1994 12:45:26 GMT) + */ + public function getLastModified() + { + return (string) $this->getHeader('Last-Modified'); + } + + /** + * Get the Location HTTP header + * + * @return string|null Used in redirection, or when a new resource has been created. + */ + public function getLocation() + { + return (string) $this->getHeader('Location'); + } + + /** + * Get the Pragma HTTP header + * + * @return Header|null Returns the implementation-specific headers that may have various effects anywhere along + * the request-response chain. + */ + public function getPragma() + { + return (string) $this->getHeader('Pragma'); + } + + /** + * Get the Proxy-Authenticate HTTP header + * + * @return string|null Authentication to access the proxy (e.g. Basic) + */ + public function getProxyAuthenticate() + { + return (string) $this->getHeader('Proxy-Authenticate'); + } + + /** + * Get the Retry-After HTTP header + * + * @return int|null If an entity is temporarily unavailable, this instructs the client to try again after a + * specified period of time. + */ + public function getRetryAfter() + { + return (string) $this->getHeader('Retry-After'); + } + + /** + * Get the Server HTTP header + * + * @return string|null A name for the server + */ + public function getServer() + { + return (string) $this->getHeader('Server'); + } + + /** + * Get the Set-Cookie HTTP header + * + * @return string|null An HTTP cookie. + */ + public function getSetCookie() + { + return (string) $this->getHeader('Set-Cookie'); + } + + /** + * Get the Trailer HTTP header + * + * @return string|null The Trailer general field value indicates that the given set of header fields is present in + * the trailer of a message encoded with chunked transfer-coding. + */ + public function getTrailer() + { + return (string) $this->getHeader('Trailer'); + } + + /** + * Get the Transfer-Encoding HTTP header + * + * @return string|null The form of encoding used to safely transfer the entity to the user + */ + public function getTransferEncoding() + { + return (string) $this->getHeader('Transfer-Encoding'); + } + + /** + * Get the Vary HTTP header + * + * @return string|null Tells downstream proxies how to match future request headers to decide whether the cached + * response can be used rather than requesting a fresh one from the origin server. + */ + public function getVary() + { + return (string) $this->getHeader('Vary'); + } + + /** + * Get the Via HTTP header + * + * @return string|null Informs the client of proxies through which the response was sent. + */ + public function getVia() + { + return (string) $this->getHeader('Via'); + } + + /** + * Get the Warning HTTP header + * + * @return string|null A general warning about possible problems with the entity body + */ + public function getWarning() + { + return (string) $this->getHeader('Warning'); + } + + /** + * Get the WWW-Authenticate HTTP header + * + * @return string|null Indicates the authentication scheme that should be used to access the requested entity + */ + public function getWwwAuthenticate() + { + return (string) $this->getHeader('WWW-Authenticate'); + } + + /** + * Checks if HTTP Status code is a Client Error (4xx) + * + * @return bool + */ + public function isClientError() + { + return $this->statusCode >= 400 && $this->statusCode < 500; + } + + /** + * Checks if HTTP Status code is Server OR Client Error (4xx or 5xx) + * + * @return boolean + */ + public function isError() + { + return $this->isClientError() || $this->isServerError(); + } + + /** + * Checks if HTTP Status code is Information (1xx) + * + * @return bool + */ + public function isInformational() + { + return $this->statusCode < 200; + } + + /** + * Checks if HTTP Status code is a Redirect (3xx) + * + * @return bool + */ + public function isRedirect() + { + return $this->statusCode >= 300 && $this->statusCode < 400; + } + + /** + * Checks if HTTP Status code is Server Error (5xx) + * + * @return bool + */ + public function isServerError() + { + return $this->statusCode >= 500 && $this->statusCode < 600; + } + + /** + * Checks if HTTP Status code is Successful (2xx | 304) + * + * @return bool + */ + public function isSuccessful() + { + return ($this->statusCode >= 200 && $this->statusCode < 300) || $this->statusCode == 304; + } + + /** + * Check if the response can be cached based on the response headers + * + * @return bool Returns TRUE if the response can be cached or false if not + */ + public function canCache() + { + // Check if the response is cacheable based on the code + if (!in_array((int) $this->getStatusCode(), self::$cacheResponseCodes)) { + return false; + } + + // Make sure a valid body was returned and can be cached + if ((!$this->getBody()->isReadable() || !$this->getBody()->isSeekable()) + && ($this->getContentLength() > 0 || $this->getTransferEncoding() == 'chunked')) { + return false; + } + + // Never cache no-store resources (this is a private cache, so private + // can be cached) + if ($this->getHeader('Cache-Control') && $this->getHeader('Cache-Control')->hasDirective('no-store')) { + return false; + } + + return $this->isFresh() || $this->getFreshness() === null || $this->canValidate(); + } + + /** + * Gets the number of seconds from the current time in which this response is still considered fresh + * + * @return int|null Returns the number of seconds + */ + public function getMaxAge() + { + if ($header = $this->getHeader('Cache-Control')) { + // s-max-age, then max-age, then Expires + if ($age = $header->getDirective('s-maxage')) { + return $age; + } + if ($age = $header->getDirective('max-age')) { + return $age; + } + } + + if ($this->getHeader('Expires')) { + return strtotime($this->getExpires()) - time(); + } + + return null; + } + + /** + * Check if the response is considered fresh. + * + * A response is considered fresh when its age is less than or equal to the freshness lifetime (maximum age) of the + * response. + * + * @return bool|null + */ + public function isFresh() + { + $fresh = $this->getFreshness(); + + return $fresh === null ? null : $fresh >= 0; + } + + /** + * Check if the response can be validated against the origin server using a conditional GET request. + * + * @return bool + */ + public function canValidate() + { + return $this->getEtag() || $this->getLastModified(); + } + + /** + * Get the freshness of the response by returning the difference of the maximum lifetime of the response and the + * age of the response (max-age - age). + * + * Freshness values less than 0 mean that the response is no longer fresh and is ABS(freshness) seconds expired. + * Freshness values of greater than zero is the number of seconds until the response is no longer fresh. A NULL + * result means that no freshness information is available. + * + * @return int + */ + public function getFreshness() + { + $maxAge = $this->getMaxAge(); + $age = $this->calculateAge(); + + return $maxAge && $age ? ($maxAge - $age) : null; + } + + /** + * Parse the JSON response body and return an array + * + * @return array|string|int|bool|float + * @throws RuntimeException if the response body is not in JSON format + */ + public function json() + { + $data = json_decode((string) $this->body, true); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new RuntimeException('Unable to parse response body into JSON: ' . json_last_error()); + } + + return $data === null ? array() : $data; + } + + /** + * Parse the XML response body and return a \SimpleXMLElement. + * + * In order to prevent XXE attacks, this method disables loading external + * entities. If you rely on external entities, then you must parse the + * XML response manually by accessing the response body directly. + * + * @return \SimpleXMLElement + * @throws RuntimeException if the response body is not in XML format + * @link http://websec.io/2012/08/27/Preventing-XXE-in-PHP.html + */ + public function xml() + { + $errorMessage = null; + $internalErrors = libxml_use_internal_errors(true); + $disableEntities = libxml_disable_entity_loader(true); + libxml_clear_errors(); + + try { + $xml = new \SimpleXMLElement((string) $this->body ?: '', LIBXML_NONET); + if ($error = libxml_get_last_error()) { + $errorMessage = $error->message; + } + } catch (\Exception $e) { + $errorMessage = $e->getMessage(); + } + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + libxml_disable_entity_loader($disableEntities); + + if ($errorMessage) { + throw new RuntimeException('Unable to parse response body into XML: ' . $errorMessage); + } + + return $xml; + } + + /** + * Get the redirect count of this response + * + * @return int + */ + public function getRedirectCount() + { + return (int) $this->params->get(RedirectPlugin::REDIRECT_COUNT); + } + + /** + * Set the effective URL that resulted in this response (e.g. the last redirect URL) + * + * @param string $url The effective URL + * + * @return self + */ + public function setEffectiveUrl($url) + { + $this->effectiveUrl = $url; + + return $this; + } + + /** + * Get the effective URL that resulted in this response (e.g. the last redirect URL) + * + * @return string + */ + public function getEffectiveUrl() + { + return $this->effectiveUrl; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getPreviousResponse() + { + Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin.'); + return null; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function setRequest($request) + { + Version::warn(__METHOD__ . ' is deprecated'); + return $this; + } + + /** + * @deprecated + * @codeCoverageIgnore + */ + public function getRequest() + { + Version::warn(__METHOD__ . ' is deprecated'); + return null; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Mimetypes.php b/vendor/guzzle/http/Guzzle/Http/Mimetypes.php new file mode 100644 index 0000000..d71586a --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Mimetypes.php @@ -0,0 +1,962 @@ + 'text/vnd.in3d.3dml', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'asa' => 'text/plain', + 'asax' => 'application/octet-stream', + 'asc' => 'application/pgp-signature', + 'ascx' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'ashx' => 'text/plain', + 'asm' => 'text/x-asm', + 'asmx' => 'text/plain', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asp' => 'text/plain', + 'aspx' => 'text/plain', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'axd' => 'text/plain', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfc' => 'application/x-coldfusion', + 'cfm' => 'application/x-coldfusion', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'cs' => 'text/plain', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxt' => 'application/vnd.geonext', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hta' => 'application/octet-stream', + 'htc' => 'text/html', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/octet-stream', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/mp4', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsf' => 'application/vnd.lotus-notes', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'text/x-php', + 'phps' => 'application/x-httpd-phps', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rb' => 'text/plain', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'resx' => 'text/xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sig' => 'application/pgp-signature', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'src' => 'application/x-wais-source', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'image/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvx' => 'application/vnd.dece.unspecified', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-ms-wmz', + 'woff' => 'application/x-font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'application/vnd.hzn-3d-crossword', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml' + ); + + /** + * Get a singleton instance of the class + * + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * Get a mimetype value from a file extension + * + * @param string $extension File extension + * + * @return string|null + * + */ + public function fromExtension($extension) + { + $extension = strtolower($extension); + + return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; + } + + /** + * Get a mimetype from a filename + * + * @param string $filename Filename to generate a mimetype from + * + * @return string|null + */ + public function fromFilename($filename) + { + return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php new file mode 100644 index 0000000..4b4e49d --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php @@ -0,0 +1,20 @@ +isUrlEncoding()) { + return array($query->encodeValue($key) => implode(',', array_map(array($query, 'encodeValue'), $value))); + } else { + return array($key => implode(',', $value)); + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php new file mode 100644 index 0000000..1bf1730 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php @@ -0,0 +1,22 @@ +isUrlEncoding()) { + return array($query->encodeValue($key) => array_map(array($query, 'encodeValue'), $value)); + } else { + return array($key => $value); + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php new file mode 100644 index 0000000..133ea2b --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php @@ -0,0 +1,27 @@ + $v) { + $k = "{$key}[{$k}]"; + if (is_array($v)) { + $ret = array_merge($ret, self::aggregate($k, $v, $query)); + } else { + $ret[$query->encodeValue($k)] = $query->encodeValue($v); + } + } + + return $ret; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php new file mode 100644 index 0000000..72bee62 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php @@ -0,0 +1,22 @@ +add($key, $value); + $foundDuplicates = true; + } elseif ($paramIsPhpStyleArray) { + $q[$key] = array($value); + } else { + $q[$key] = $value; + } + } else { + // Uses false by default to represent keys with no trailing "=" sign. + $q->add($key, false); + } + } + + // Use the duplicate aggregator if duplicates were found and not using PHP style arrays + if ($foundDuplicates && !$foundPhpStyle) { + $q->setAggregator(new DuplicateAggregator()); + } + + return $q; + } + + /** + * Convert the query string parameters to a query string string + * + * @return string + * @throws RuntimeException + */ + public function __toString() + { + if (!$this->data) { + return ''; + } + + $queryList = array(); + foreach ($this->prepareData($this->data) as $name => $value) { + $queryList[] = $this->convertKvp($name, $value); + } + + return implode($this->fieldSeparator, $queryList); + } + + /** + * Get the query string field separator + * + * @return string + */ + public function getFieldSeparator() + { + return $this->fieldSeparator; + } + + /** + * Get the query string value separator + * + * @return string + */ + public function getValueSeparator() + { + return $this->valueSeparator; + } + + /** + * Returns the type of URL encoding used by the query string + * + * One of: false, "RFC 3986", or "application/x-www-form-urlencoded" + * + * @return bool|string + */ + public function getUrlEncoding() + { + return $this->urlEncode; + } + + /** + * Returns true or false if using URL encoding + * + * @return bool + */ + public function isUrlEncoding() + { + return $this->urlEncode !== false; + } + + /** + * Provide a function for combining multi-valued query string parameters into a single or multiple fields + * + * @param null|QueryAggregatorInterface $aggregator Pass in a QueryAggregatorInterface object to handle converting + * deeply nested query string variables into a flattened array. + * Pass null to use the default PHP style aggregator. For legacy + * reasons, this function accepts a callable that must accepts a + * $key, $value, and query object. + * @return self + * @see \Guzzle\Http\QueryString::aggregateUsingComma() + */ + public function setAggregator(QueryAggregatorInterface $aggregator = null) + { + // Use the default aggregator if none was set + if (!$aggregator) { + if (!self::$defaultAggregator) { + self::$defaultAggregator = new PhpAggregator(); + } + $aggregator = self::$defaultAggregator; + } + + $this->aggregator = $aggregator; + + return $this; + } + + /** + * Set whether or not field names and values should be rawurlencoded + * + * @param bool|string $encode Set to TRUE to use RFC 3986 encoding (rawurlencode), false to disable encoding, or + * form_urlencoding to use application/x-www-form-urlencoded encoding (urlencode) + * @return self + */ + public function useUrlEncoding($encode) + { + $this->urlEncode = ($encode === true) ? self::RFC_3986 : $encode; + + return $this; + } + + /** + * Set the query string separator + * + * @param string $separator The query string separator that will separate fields + * + * @return self + */ + public function setFieldSeparator($separator) + { + $this->fieldSeparator = $separator; + + return $this; + } + + /** + * Set the query string value separator + * + * @param string $separator The query string separator that will separate values from fields + * + * @return self + */ + public function setValueSeparator($separator) + { + $this->valueSeparator = $separator; + + return $this; + } + + /** + * Returns an array of url encoded field names and values + * + * @return array + */ + public function urlEncode() + { + return $this->prepareData($this->data); + } + + /** + * URL encodes a value based on the url encoding type of the query string object + * + * @param string $value Value to encode + * + * @return string + */ + public function encodeValue($value) + { + if ($this->urlEncode == self::RFC_3986) { + return rawurlencode($value); + } elseif ($this->urlEncode == self::FORM_URLENCODED) { + return urlencode($value); + } else { + return (string) $value; + } + } + + /** + * Url encode parameter data and convert nested query strings into a flattened hash. + * + * @param array $data The data to encode + * + * @return array Returns an array of encoded values and keys + */ + protected function prepareData(array $data) + { + // If no aggregator is present then set the default + if (!$this->aggregator) { + $this->setAggregator(null); + } + + $temp = array(); + foreach ($data as $key => $value) { + if ($value === false || $value === null) { + // False and null will not include the "=". Use an empty string to include the "=". + $temp[$this->encodeValue($key)] = $value; + } elseif (is_array($value)) { + $temp = array_merge($temp, $this->aggregator->aggregate($key, $value, $this)); + } else { + $temp[$this->encodeValue($key)] = $this->encodeValue($value); + } + } + + return $temp; + } + + /** + * Converts a key value pair that can contain strings, nulls, false, or arrays + * into a single string. + * + * @param string $name Name of the field + * @param mixed $value Value of the field + * @return string + */ + private function convertKvp($name, $value) + { + if ($value === self::BLANK || $value === null || $value === false) { + return $name; + } elseif (!is_array($value)) { + return $name . $this->valueSeparator . $value; + } + + $result = ''; + foreach ($value as $v) { + $result .= $this->convertKvp($name, $v) . $this->fieldSeparator; + } + + return rtrim($result, $this->fieldSeparator); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php b/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php new file mode 100644 index 0000000..a34893a --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php @@ -0,0 +1,106 @@ +setLimit($limit)->setOffset($offset); + } + + /** + * Returns only a subset of the decorated entity body when cast as a string + * {@inheritdoc} + */ + public function __toString() + { + return substr((string) $this->body, $this->offset, $this->limit) ?: ''; + } + + public function isConsumed() + { + return $this->body->isConsumed() || + ($this->body->ftell() >= $this->offset + $this->limit); + } + + /** + * Returns the Content-Length of the limited subset of data + * {@inheritdoc} + */ + public function getContentLength() + { + $length = $this->body->getContentLength(); + + return $length === false + ? $this->limit + : min($this->limit, min($length, $this->offset + $this->limit) - $this->offset); + } + + /** + * Allow for a bounded seek on the read limited entity body + * {@inheritdoc} + */ + public function seek($offset, $whence = SEEK_SET) + { + return $whence === SEEK_SET + ? $this->body->seek(max($this->offset, min($this->offset + $this->limit, $offset))) + : false; + } + + /** + * Set the offset to start limiting from + * + * @param int $offset Offset to seek to and begin byte limiting from + * + * @return self + */ + public function setOffset($offset) + { + $this->body->seek($offset); + $this->offset = $offset; + + return $this; + } + + /** + * Set the limit of bytes that the decorator allows to be read from the stream + * + * @param int $limit Total number of bytes to allow to be read from the stream + * + * @return self + */ + public function setLimit($limit) + { + $this->limit = $limit; + + return $this; + } + + public function read($length) + { + // Check if the current position is less than the total allowed bytes + original offset + $remaining = ($this->offset + $this->limit) - $this->body->ftell(); + if ($remaining > 0) { + // Only return the amount of requested data, ensuring that the byte limit is not exceeded + return $this->body->read(min($remaining, $length)); + } else { + return false; + } + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php b/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php new file mode 100644 index 0000000..1a824b8 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php @@ -0,0 +1,250 @@ + array('onRequestSent', 100), + 'request.clone' => 'cleanupRequest', + 'request.before_send' => 'cleanupRequest' + ); + } + + /** + * Clean up the parameters of a request when it is cloned + * + * @param Event $event Event emitted + */ + public function cleanupRequest(Event $event) + { + $params = $event['request']->getParams(); + unset($params[self::REDIRECT_COUNT]); + unset($params[self::PARENT_REQUEST]); + } + + /** + * Called when a request receives a redirect response + * + * @param Event $event Event emitted + */ + public function onRequestSent(Event $event) + { + $response = $event['response']; + $request = $event['request']; + + // Only act on redirect requests with Location headers + if (!$response || $request->getParams()->get(self::DISABLE)) { + return; + } + + // Trace the original request based on parameter history + $original = $this->getOriginalRequest($request); + + // Terminating condition to set the effective response on the original request + if (!$response->isRedirect() || !$response->hasHeader('Location')) { + if ($request !== $original) { + // This is a terminating redirect response, so set it on the original request + $response->getParams()->set(self::REDIRECT_COUNT, $original->getParams()->get(self::REDIRECT_COUNT)); + $original->setResponse($response); + $response->setEffectiveUrl($request->getUrl()); + } + return; + } + + $this->sendRedirectRequest($original, $request, $response); + } + + /** + * Get the original request that initiated a series of redirects + * + * @param RequestInterface $request Request to get the original request from + * + * @return RequestInterface + */ + protected function getOriginalRequest(RequestInterface $request) + { + $original = $request; + // The number of redirects is held on the original request, so determine which request that is + while ($parent = $original->getParams()->get(self::PARENT_REQUEST)) { + $original = $parent; + } + + return $original; + } + + /** + * Create a redirect request for a specific request object + * + * Takes into account strict RFC compliant redirection (e.g. redirect POST with POST) vs doing what most clients do + * (e.g. redirect POST with GET). + * + * @param RequestInterface $request Request being redirected + * @param RequestInterface $original Original request + * @param int $statusCode Status code of the redirect + * @param string $location Location header of the redirect + * + * @return RequestInterface Returns a new redirect request + * @throws CouldNotRewindStreamException If the body needs to be rewound but cannot + */ + protected function createRedirectRequest( + RequestInterface $request, + $statusCode, + $location, + RequestInterface $original + ) { + $redirectRequest = null; + $strict = $original->getParams()->get(self::STRICT_REDIRECTS); + + // Switch method to GET for 303 redirects. 301 and 302 redirects also switch to GET unless we are forcing RFC + // compliance to emulate what most browsers do. NOTE: IE only switches methods on 301/302 when coming from a POST. + if ($request instanceof EntityEnclosingRequestInterface && ($statusCode == 303 || (!$strict && $statusCode <= 302))) { + $redirectRequest = RequestFactory::getInstance()->cloneRequestWithMethod($request, 'GET'); + } else { + $redirectRequest = clone $request; + } + + $redirectRequest->setIsRedirect(true); + // Always use the same response body when redirecting + $redirectRequest->setResponseBody($request->getResponseBody()); + + $location = Url::factory($location); + // If the location is not absolute, then combine it with the original URL + if (!$location->isAbsolute()) { + $originalUrl = $redirectRequest->getUrl(true); + // Remove query string parameters and just take what is present on the redirect Location header + $originalUrl->getQuery()->clear(); + $location = $originalUrl->combine((string) $location, true); + } + + $redirectRequest->setUrl($location); + + // Add the parent request to the request before it sends (make sure it's before the onRequestClone event too) + $redirectRequest->getEventDispatcher()->addListener( + 'request.before_send', + $func = function ($e) use (&$func, $request, $redirectRequest) { + $redirectRequest->getEventDispatcher()->removeListener('request.before_send', $func); + $e['request']->getParams()->set(RedirectPlugin::PARENT_REQUEST, $request); + } + ); + + // Rewind the entity body of the request if needed + if ($redirectRequest instanceof EntityEnclosingRequestInterface && $redirectRequest->getBody()) { + $body = $redirectRequest->getBody(); + // Only rewind the body if some of it has been read already, and throw an exception if the rewind fails + if ($body->ftell() && !$body->rewind()) { + throw new CouldNotRewindStreamException( + 'Unable to rewind the non-seekable entity body of the request after redirecting. cURL probably ' + . 'sent part of body before the redirect occurred. Try adding acustom rewind function using on the ' + . 'entity body of the request using setRewindFunction().' + ); + } + } + + return $redirectRequest; + } + + /** + * Prepare the request for redirection and enforce the maximum number of allowed redirects per client + * + * @param RequestInterface $original Original request + * @param RequestInterface $request Request to prepare and validate + * @param Response $response The current response + * + * @return RequestInterface + */ + protected function prepareRedirection(RequestInterface $original, RequestInterface $request, Response $response) + { + $params = $original->getParams(); + // This is a new redirect, so increment the redirect counter + $current = $params[self::REDIRECT_COUNT] + 1; + $params[self::REDIRECT_COUNT] = $current; + // Use a provided maximum value or default to a max redirect count of 5 + $max = isset($params[self::MAX_REDIRECTS]) ? $params[self::MAX_REDIRECTS] : $this->defaultMaxRedirects; + + // Throw an exception if the redirect count is exceeded + if ($current > $max) { + $this->throwTooManyRedirectsException($original, $max); + return false; + } else { + // Create a redirect request based on the redirect rules set on the request + return $this->createRedirectRequest( + $request, + $response->getStatusCode(), + trim($response->getLocation()), + $original + ); + } + } + + /** + * Send a redirect request and handle any errors + * + * @param RequestInterface $original The originating request + * @param RequestInterface $request The current request being redirected + * @param Response $response The response of the current request + * + * @throws BadResponseException|\Exception + */ + protected function sendRedirectRequest(RequestInterface $original, RequestInterface $request, Response $response) + { + // Validate and create a redirect request based on the original request and current response + if ($redirectRequest = $this->prepareRedirection($original, $request, $response)) { + try { + $redirectRequest->send(); + } catch (BadResponseException $e) { + $e->getResponse(); + if (!$e->getResponse()) { + throw $e; + } + } + } + } + + /** + * Throw a too many redirects exception for a request + * + * @param RequestInterface $original Request + * @param int $max Max allowed redirects + * + * @throws TooManyRedirectsException when too many redirects have been issued + */ + protected function throwTooManyRedirectsException(RequestInterface $original, $max) + { + $original->getEventDispatcher()->addListener( + 'request.complete', + $func = function ($e) use (&$func, $original, $max) { + $original->getEventDispatcher()->removeListener('request.complete', $func); + $str = "{$max} redirects were issued for this request:\n" . $e['request']->getRawHeaders(); + throw new TooManyRedirectsException($str); + } + ); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem b/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem new file mode 100644 index 0000000..9794dfb --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem @@ -0,0 +1,3866 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Apr 22 08:29:31 2014 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg +QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe +Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt +IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by +X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b +gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr +eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ +TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy +Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn +uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI +qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm +ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 +Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW +Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t +FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm +zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k +XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT +bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU +RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK +1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt +2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ +Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 +AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 +MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM +LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo +ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ +wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH +Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a +SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS +NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab +mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY +Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 +qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu +MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO +v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ +82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz +o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs +a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx +OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW +mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o ++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC +rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE +BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl +cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN +MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT +HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg +Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz +o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy +Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti +GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li +qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH +Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG +alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa +m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox +bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi +xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB +bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL +j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU +wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 +XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH +59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ +23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq +J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA +HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi +uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- diff --git a/vendor/guzzle/http/Guzzle/Http/StaticClient.php b/vendor/guzzle/http/Guzzle/Http/StaticClient.php new file mode 100644 index 0000000..dbd4c18 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/StaticClient.php @@ -0,0 +1,157 @@ +createRequest($method, $url, null, null, $options); + + if (isset($options['stream'])) { + if ($options['stream'] instanceof StreamRequestFactoryInterface) { + return $options['stream']->fromRequest($request); + } elseif ($options['stream'] == true) { + $streamFactory = new PhpStreamRequestFactory(); + return $streamFactory->fromRequest($request); + } + } + + return $request->send(); + } + + /** + * Send a GET request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function get($url, $options = array()) + { + return self::request('GET', $url, $options); + } + + /** + * Send a HEAD request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function head($url, $options = array()) + { + return self::request('HEAD', $url, $options); + } + + /** + * Send a DELETE request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function delete($url, $options = array()) + { + return self::request('DELETE', $url, $options); + } + + /** + * Send a POST request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function post($url, $options = array()) + { + return self::request('POST', $url, $options); + } + + /** + * Send a PUT request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function put($url, $options = array()) + { + return self::request('PUT', $url, $options); + } + + /** + * Send a PATCH request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function patch($url, $options = array()) + { + return self::request('PATCH', $url, $options); + } + + /** + * Send an OPTIONS request + * + * @param string $url URL of the request + * @param array $options Array of request options + * + * @return \Guzzle\Http\Message\Response + * @see Guzzle::request for a list of available options + */ + public static function options($url, $options = array()) + { + return self::request('OPTIONS', $url, $options); + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/Url.php b/vendor/guzzle/http/Guzzle/Http/Url.php new file mode 100644 index 0000000..6a4e772 --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/Url.php @@ -0,0 +1,554 @@ + null, 'host' => null, 'path' => null, 'port' => null, 'query' => null, + 'user' => null, 'pass' => null, 'fragment' => null); + + if (false === ($parts = parse_url($url))) { + throw new InvalidArgumentException('Was unable to parse malformed url: ' . $url); + } + + $parts += $defaults; + + // Convert the query string into a QueryString object + if ($parts['query'] || 0 !== strlen($parts['query'])) { + $parts['query'] = QueryString::fromString($parts['query']); + } + + return new static($parts['scheme'], $parts['host'], $parts['user'], + $parts['pass'], $parts['port'], $parts['path'], $parts['query'], + $parts['fragment']); + } + + /** + * Build a URL from parse_url parts. The generated URL will be a relative URL if a scheme or host are not provided. + * + * @param array $parts Array of parse_url parts + * + * @return string + */ + public static function buildUrl(array $parts) + { + $url = $scheme = ''; + + if (isset($parts['scheme'])) { + $scheme = $parts['scheme']; + $url .= $scheme . ':'; + } + + if (isset($parts['host'])) { + $url .= '//'; + if (isset($parts['user'])) { + $url .= $parts['user']; + if (isset($parts['pass'])) { + $url .= ':' . $parts['pass']; + } + $url .= '@'; + } + + $url .= $parts['host']; + + // Only include the port if it is not the default port of the scheme + if (isset($parts['port']) + && !(($scheme == 'http' && $parts['port'] == 80) || ($scheme == 'https' && $parts['port'] == 443)) + ) { + $url .= ':' . $parts['port']; + } + } + + // Add the path component if present + if (isset($parts['path']) && 0 !== strlen($parts['path'])) { + // Always ensure that the path begins with '/' if set and something is before the path + if ($url && $parts['path'][0] != '/' && substr($url, -1) != '/') { + $url .= '/'; + } + $url .= $parts['path']; + } + + // Add the query string if present + if (isset($parts['query'])) { + $url .= '?' . $parts['query']; + } + + // Ensure that # is only added to the url if fragment contains anything. + if (isset($parts['fragment'])) { + $url .= '#' . $parts['fragment']; + } + + return $url; + } + + /** + * Create a new URL from URL parts + * + * @param string $scheme Scheme of the URL + * @param string $host Host of the URL + * @param string $username Username of the URL + * @param string $password Password of the URL + * @param int $port Port of the URL + * @param string $path Path of the URL + * @param QueryString|array|string $query Query string of the URL + * @param string $fragment Fragment of the URL + */ + public function __construct($scheme, $host, $username = null, $password = null, $port = null, $path = null, QueryString $query = null, $fragment = null) + { + $this->scheme = $scheme; + $this->host = $host; + $this->port = $port; + $this->username = $username; + $this->password = $password; + $this->fragment = $fragment; + if (!$query) { + $this->query = new QueryString(); + } else { + $this->setQuery($query); + } + $this->setPath($path); + } + + /** + * Clone the URL + */ + public function __clone() + { + $this->query = clone $this->query; + } + + /** + * Returns the URL as a URL string + * + * @return string + */ + public function __toString() + { + return self::buildUrl($this->getParts()); + } + + /** + * Get the parts of the URL as an array + * + * @return array + */ + public function getParts() + { + $query = (string) $this->query; + + return array( + 'scheme' => $this->scheme, + 'user' => $this->username, + 'pass' => $this->password, + 'host' => $this->host, + 'port' => $this->port, + 'path' => $this->getPath(), + 'query' => $query !== '' ? $query : null, + 'fragment' => $this->fragment, + ); + } + + /** + * Set the host of the request. + * + * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com) + * + * @return Url + */ + public function setHost($host) + { + if (strpos($host, ':') === false) { + $this->host = $host; + } else { + list($host, $port) = explode(':', $host); + $this->host = $host; + $this->setPort($port); + } + + return $this; + } + + /** + * Get the host part of the URL + * + * @return string + */ + public function getHost() + { + return $this->host; + } + + /** + * Set the scheme part of the URL (http, https, ftp, etc) + * + * @param string $scheme Scheme to set + * + * @return Url + */ + public function setScheme($scheme) + { + if ($this->scheme == 'http' && $this->port == 80) { + $this->port = null; + } elseif ($this->scheme == 'https' && $this->port == 443) { + $this->port = null; + } + + $this->scheme = $scheme; + + return $this; + } + + /** + * Get the scheme part of the URL + * + * @return string + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * Set the port part of the URL + * + * @param int $port Port to set + * + * @return Url + */ + public function setPort($port) + { + $this->port = $port; + + return $this; + } + + /** + * Get the port part of the URl. Will return the default port for a given scheme if no port has been set. + * + * @return int|null + */ + public function getPort() + { + if ($this->port) { + return $this->port; + } elseif ($this->scheme == 'http') { + return 80; + } elseif ($this->scheme == 'https') { + return 443; + } + + return null; + } + + /** + * Set the path part of the URL + * + * @param array|string $path Path string or array of path segments + * + * @return Url + */ + public function setPath($path) + { + static $pathReplace = array(' ' => '%20', '?' => '%3F'); + if (is_array($path)) { + $path = '/' . implode('/', $path); + } + + $this->path = strtr($path, $pathReplace); + + return $this; + } + + /** + * Normalize the URL so that double slashes and relative paths are removed + * + * @return Url + */ + public function normalizePath() + { + if (!$this->path || $this->path == '/' || $this->path == '*') { + return $this; + } + + $results = array(); + $segments = $this->getPathSegments(); + foreach ($segments as $segment) { + if ($segment == '..') { + array_pop($results); + } elseif ($segment != '.' && $segment != '') { + $results[] = $segment; + } + } + + // Combine the normalized parts and add the leading slash if needed + $this->path = ($this->path[0] == '/' ? '/' : '') . implode('/', $results); + + // Add the trailing slash if necessary + if ($this->path != '/' && end($segments) == '') { + $this->path .= '/'; + } + + return $this; + } + + /** + * Add a relative path to the currently set path. + * + * @param string $relativePath Relative path to add + * + * @return Url + */ + public function addPath($relativePath) + { + if ($relativePath != '/' && is_string($relativePath) && strlen($relativePath) > 0) { + // Add a leading slash if needed + if ($relativePath[0] != '/') { + $relativePath = '/' . $relativePath; + } + $this->setPath(str_replace('//', '/', $this->path . $relativePath)); + } + + return $this; + } + + /** + * Get the path part of the URL + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Get the path segments of the URL as an array + * + * @return array + */ + public function getPathSegments() + { + return array_slice(explode('/', $this->getPath()), 1); + } + + /** + * Set the password part of the URL + * + * @param string $password Password to set + * + * @return Url + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** + * Get the password part of the URL + * + * @return null|string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set the username part of the URL + * + * @param string $username Username to set + * + * @return Url + */ + public function setUsername($username) + { + $this->username = $username; + + return $this; + } + + /** + * Get the username part of the URl + * + * @return null|string + */ + public function getUsername() + { + return $this->username; + } + + /** + * Get the query part of the URL as a QueryString object + * + * @return QueryString + */ + public function getQuery() + { + return $this->query; + } + + /** + * Set the query part of the URL + * + * @param QueryString|string|array $query Query to set + * + * @return Url + */ + public function setQuery($query) + { + if (is_string($query)) { + $output = null; + parse_str($query, $output); + $this->query = new QueryString($output); + } elseif (is_array($query)) { + $this->query = new QueryString($query); + } elseif ($query instanceof QueryString) { + $this->query = $query; + } + + return $this; + } + + /** + * Get the fragment part of the URL + * + * @return null|string + */ + public function getFragment() + { + return $this->fragment; + } + + /** + * Set the fragment part of the URL + * + * @param string $fragment Fragment to set + * + * @return Url + */ + public function setFragment($fragment) + { + $this->fragment = $fragment; + + return $this; + } + + /** + * Check if this is an absolute URL + * + * @return bool + */ + public function isAbsolute() + { + return $this->scheme && $this->host; + } + + /** + * Combine the URL with another URL. Follows the rules specific in RFC 3986 section 5.4. + * + * @param string $url Relative URL to combine with + * @param bool $strictRfc3986 Set to true to use strict RFC 3986 compliance when merging paths. When first + * released, Guzzle used an incorrect algorithm for combining relative URL paths. In + * order to not break users, we introduced this flag to allow the merging of URLs based + * on strict RFC 3986 section 5.4.1. This means that "http://a.com/foo/baz" merged with + * "bar" would become "http://a.com/foo/bar". When this value is set to false, it would + * become "http://a.com/foo/baz/bar". + * @return Url + * @throws InvalidArgumentException + * @link http://tools.ietf.org/html/rfc3986#section-5.4 + */ + public function combine($url, $strictRfc3986 = false) + { + $url = self::factory($url); + + // Use the more absolute URL as the base URL + if (!$this->isAbsolute() && $url->isAbsolute()) { + $url = $url->combine($this); + } + + // Passing a URL with a scheme overrides everything + if ($buffer = $url->getScheme()) { + $this->scheme = $buffer; + $this->host = $url->getHost(); + $this->port = $url->getPort(); + $this->username = $url->getUsername(); + $this->password = $url->getPassword(); + $this->path = $url->getPath(); + $this->query = $url->getQuery(); + $this->fragment = $url->getFragment(); + return $this; + } + + // Setting a host overrides the entire rest of the URL + if ($buffer = $url->getHost()) { + $this->host = $buffer; + $this->port = $url->getPort(); + $this->username = $url->getUsername(); + $this->password = $url->getPassword(); + $this->path = $url->getPath(); + $this->query = $url->getQuery(); + $this->fragment = $url->getFragment(); + return $this; + } + + $path = $url->getPath(); + $query = $url->getQuery(); + + if (!$path) { + if (count($query)) { + $this->addQuery($query, $strictRfc3986); + } + } else { + if ($path[0] == '/') { + $this->path = $path; + } elseif ($strictRfc3986) { + $this->path .= '/../' . $path; + } else { + $this->path .= '/' . $path; + } + $this->normalizePath(); + $this->addQuery($query, $strictRfc3986); + } + + $this->fragment = $url->getFragment(); + + return $this; + } + + private function addQuery(QueryString $new, $strictRfc386) + { + if (!$strictRfc386) { + $new->merge($this->query); + } + + $this->query = $new; + } +} diff --git a/vendor/guzzle/http/Guzzle/Http/composer.json b/vendor/guzzle/http/Guzzle/Http/composer.json new file mode 100644 index 0000000..9384a5b --- /dev/null +++ b/vendor/guzzle/http/Guzzle/Http/composer.json @@ -0,0 +1,32 @@ +{ + "name": "guzzle/http", + "description": "HTTP libraries used by Guzzle", + "homepage": "http://guzzlephp.org/", + "keywords": ["http client", "http", "client", "Guzzle", "curl"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "require": { + "php": ">=5.3.2", + "guzzle/common": "self.version", + "guzzle/parser": "self.version", + "guzzle/stream": "self.version" + }, + "suggest": { + "ext-curl": "*" + }, + "autoload": { + "psr-0": { "Guzzle\\Http": "" } + }, + "target-dir": "Guzzle/Http", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php b/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php new file mode 100644 index 0000000..4349eeb --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php @@ -0,0 +1,131 @@ + 'Domain', + 'path' => 'Path', + 'max_age' => 'Max-Age', + 'expires' => 'Expires', + 'version' => 'Version', + 'secure' => 'Secure', + 'port' => 'Port', + 'discard' => 'Discard', + 'comment' => 'Comment', + 'comment_url' => 'Comment-Url', + 'http_only' => 'HttpOnly' + ); + + public function parseCookie($cookie, $host = null, $path = null, $decode = false) + { + // Explode the cookie string using a series of semicolons + $pieces = array_filter(array_map('trim', explode(';', $cookie))); + + // The name of the cookie (first kvp) must include an equal sign. + if (empty($pieces) || !strpos($pieces[0], '=')) { + return false; + } + + // Create the default return array + $data = array_merge(array_fill_keys(array_keys(self::$cookieParts), null), array( + 'cookies' => array(), + 'data' => array(), + 'path' => null, + 'http_only' => false, + 'discard' => false, + 'domain' => $host + )); + $foundNonCookies = 0; + + // Add the cookie pieces into the parsed data array + foreach ($pieces as $part) { + + $cookieParts = explode('=', $part, 2); + $key = trim($cookieParts[0]); + + if (count($cookieParts) == 1) { + // Can be a single value (e.g. secure, httpOnly) + $value = true; + } else { + // Be sure to strip wrapping quotes + $value = trim($cookieParts[1], " \n\r\t\0\x0B\""); + if ($decode) { + $value = urldecode($value); + } + } + + // Only check for non-cookies when cookies have been found + if (!empty($data['cookies'])) { + foreach (self::$cookieParts as $mapValue => $search) { + if (!strcasecmp($search, $key)) { + $data[$mapValue] = $mapValue == 'port' ? array_map('trim', explode(',', $value)) : $value; + $foundNonCookies++; + continue 2; + } + } + } + + // If cookies have not yet been retrieved, or this value was not found in the pieces array, treat it as a + // cookie. IF non-cookies have been parsed, then this isn't a cookie, it's cookie data. Cookies then data. + $data[$foundNonCookies ? 'data' : 'cookies'][$key] = $value; + } + + // Calculate the expires date + if (!$data['expires'] && $data['max_age']) { + $data['expires'] = time() + (int) $data['max_age']; + } + + // Check path attribute according RFC6265 http://tools.ietf.org/search/rfc6265#section-5.2.4 + // "If the attribute-value is empty or if the first character of the + // attribute-value is not %x2F ("/"): + // Let cookie-path be the default-path. + // Otherwise: + // Let cookie-path be the attribute-value." + if (!$data['path'] || substr($data['path'], 0, 1) !== '/') { + $data['path'] = $this->getDefaultPath($path); + } + + return $data; + } + + /** + * Get default cookie path according to RFC 6265 + * http://tools.ietf.org/search/rfc6265#section-5.1.4 Paths and Path-Match + * + * @param string $path Request uri-path + * + * @return string + */ + protected function getDefaultPath($path) { + // "The user agent MUST use an algorithm equivalent to the following algorithm + // to compute the default-path of a cookie:" + + // "2. If the uri-path is empty or if the first character of the uri-path is not + // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. + if (empty($path) || substr($path, 0, 1) !== '/') { + return '/'; + } + + // "3. If the uri-path contains no more than one %x2F ("/") character, output + // %x2F ("/") and skip the remaining step." + if ($path === "/") { + return $path; + } + + $rightSlashPos = strrpos($path, '/'); + if ($rightSlashPos === 0) { + return "/"; + } + + // "4. Output the characters of the uri-path from the first character up to, + // but not including, the right-most %x2F ("/")." + return substr($path, 0, $rightSlashPos); + + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php b/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php new file mode 100644 index 0000000..d21ffe2 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php @@ -0,0 +1,33 @@ + $requestUrl, + 'scheme' => 'http' + ); + + // Check for the Host header + if (isset($parts['headers']['Host'])) { + $urlParts['host'] = $parts['headers']['Host']; + } elseif (isset($parts['headers']['host'])) { + $urlParts['host'] = $parts['headers']['host']; + } else { + $urlParts['host'] = null; + } + + if (false === strpos($urlParts['host'], ':')) { + $urlParts['port'] = ''; + } else { + $hostParts = explode(':', $urlParts['host']); + $urlParts['host'] = trim($hostParts[0]); + $urlParts['port'] = (int) trim($hostParts[1]); + if ($urlParts['port'] == 443) { + $urlParts['scheme'] = 'https'; + } + } + + // Check if a query is present + $path = $urlParts['path']; + $qpos = strpos($path, '?'); + if ($qpos) { + $urlParts['query'] = substr($path, $qpos + 1); + $urlParts['path'] = substr($path, 0, $qpos); + } else { + $urlParts['query'] = ''; + } + + return $urlParts; + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php b/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php new file mode 100644 index 0000000..1047400 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php @@ -0,0 +1,110 @@ +parseMessage($message); + + // Parse the protocol and protocol version + if (isset($parts['start_line'][2])) { + $startParts = explode('/', $parts['start_line'][2]); + $protocol = strtoupper($startParts[0]); + $version = isset($startParts[1]) ? $startParts[1] : '1.1'; + } else { + $protocol = 'HTTP'; + $version = '1.1'; + } + + $parsed = array( + 'method' => strtoupper($parts['start_line'][0]), + 'protocol' => $protocol, + 'version' => $version, + 'headers' => $parts['headers'], + 'body' => $parts['body'] + ); + + $parsed['request_url'] = $this->getUrlPartsFromMessage($parts['start_line'][1], $parsed); + + return $parsed; + } + + public function parseResponse($message) + { + if (!$message) { + return false; + } + + $parts = $this->parseMessage($message); + list($protocol, $version) = explode('/', trim($parts['start_line'][0])); + + return array( + 'protocol' => $protocol, + 'version' => $version, + 'code' => $parts['start_line'][1], + 'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '', + 'headers' => $parts['headers'], + 'body' => $parts['body'] + ); + } + + /** + * Parse a message into parts + * + * @param string $message Message to parse + * + * @return array + */ + protected function parseMessage($message) + { + $startLine = null; + $headers = array(); + $body = ''; + + // Iterate over each line in the message, accounting for line endings + $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { + + $line = $lines[$i]; + + // If two line breaks were encountered, then this is the end of body + if (empty($line)) { + if ($i < $totalLines - 1) { + $body = implode('', array_slice($lines, $i + 2)); + } + break; + } + + // Parse message headers + if (!$startLine) { + $startLine = explode(' ', $line, 3); + } elseif (strpos($line, ':')) { + $parts = explode(':', $line, 2); + $key = trim($parts[0]); + $value = isset($parts[1]) ? trim($parts[1]) : ''; + if (!isset($headers[$key])) { + $headers[$key] = $value; + } elseif (!is_array($headers[$key])) { + $headers[$key] = array($headers[$key], $value); + } else { + $headers[$key][] = $value; + } + } + } + + return array( + 'start_line' => $startLine, + 'headers' => $headers, + 'body' => $body + ); + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php b/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php new file mode 100644 index 0000000..cc44808 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php @@ -0,0 +1,27 @@ + $parts->requestMethod, + 'protocol' => 'HTTP', + 'version' => number_format($parts->httpVersion, 1), + 'headers' => $parts->headers, + 'body' => $parts->body + ); + + $parsed['request_url'] = $this->getUrlPartsFromMessage($parts->requestUrl, $parsed); + + return $parsed; + } + + public function parseResponse($message) + { + if (!$message) { + return false; + } + + $parts = http_parse_message($message); + + return array( + 'protocol' => 'HTTP', + 'version' => number_format($parts->httpVersion, 1), + 'code' => $parts->responseCode, + 'reason_phrase' => $parts->responseStatus, + 'headers' => $parts->headers, + 'body' => $parts->body + ); + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php b/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php new file mode 100644 index 0000000..f838683 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php @@ -0,0 +1,75 @@ + 'Guzzle\\Parser\\Message\\MessageParser', + 'cookie' => 'Guzzle\\Parser\\Cookie\\CookieParser', + 'url' => 'Guzzle\\Parser\\Url\\UrlParser', + 'uri_template' => 'Guzzle\\Parser\\UriTemplate\\UriTemplate', + ); + + /** + * @return self + * @codeCoverageIgnore + */ + public static function getInstance() + { + if (!self::$instance) { + self::$instance = new static; + } + + return self::$instance; + } + + public function __construct() + { + // Use the PECL URI template parser if available + if (extension_loaded('uri_template')) { + $this->mapping['uri_template'] = 'Guzzle\\Parser\\UriTemplate\\PeclUriTemplate'; + } + } + + /** + * Get a parser by name from an instance + * + * @param string $name Name of the parser to retrieve + * + * @return mixed|null + */ + public function getParser($name) + { + if (!isset($this->instances[$name])) { + if (!isset($this->mapping[$name])) { + return null; + } + $class = $this->mapping[$name]; + $this->instances[$name] = new $class(); + } + + return $this->instances[$name]; + } + + /** + * Register a custom parser by name with the register + * + * @param string $name Name or handle of the parser to register + * @param mixed $parser Instantiated parser to register + */ + public function registerParser($name, $parser) + { + $this->instances[$name] = $parser; + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php b/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php new file mode 100644 index 0000000..b0764e8 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php @@ -0,0 +1,26 @@ + true, '#' => true, '.' => true, '/' => true, ';' => true, '?' => true, '&' => true + ); + + /** @var array Delimiters */ + private static $delims = array( + ':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' + ); + + /** @var array Percent encoded delimiters */ + private static $delimsPct = array( + '%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', + '%3B', '%3D' + ); + + public function expand($template, array $variables) + { + if ($this->regex == self::DEFAULT_PATTERN && false === strpos($template, '{')) { + return $template; + } + + $this->template = $template; + $this->variables = $variables; + + return preg_replace_callback($this->regex, array($this, 'expandMatch'), $this->template); + } + + /** + * Set the regex patten used to expand URI templates + * + * @param string $regexPattern + */ + public function setRegex($regexPattern) + { + $this->regex = $regexPattern; + } + + /** + * Parse an expression into parts + * + * @param string $expression Expression to parse + * + * @return array Returns an associative array of parts + */ + private function parseExpression($expression) + { + // Check for URI operators + $operator = ''; + + if (isset(self::$operatorHash[$expression[0]])) { + $operator = $expression[0]; + $expression = substr($expression, 1); + } + + $values = explode(',', $expression); + foreach ($values as &$value) { + $value = trim($value); + $varspec = array(); + $substrPos = strpos($value, ':'); + if ($substrPos) { + $varspec['value'] = substr($value, 0, $substrPos); + $varspec['modifier'] = ':'; + $varspec['position'] = (int) substr($value, $substrPos + 1); + } elseif (substr($value, -1) == '*') { + $varspec['modifier'] = '*'; + $varspec['value'] = substr($value, 0, -1); + } else { + $varspec['value'] = (string) $value; + $varspec['modifier'] = ''; + } + $value = $varspec; + } + + return array( + 'operator' => $operator, + 'values' => $values + ); + } + + /** + * Process an expansion + * + * @param array $matches Matches met in the preg_replace_callback + * + * @return string Returns the replacement string + */ + private function expandMatch(array $matches) + { + static $rfc1738to3986 = array( + '+' => '%20', + '%7e' => '~' + ); + + $parsed = self::parseExpression($matches[1]); + $replacements = array(); + + $prefix = $parsed['operator']; + $joiner = $parsed['operator']; + $useQueryString = false; + if ($parsed['operator'] == '?') { + $joiner = '&'; + $useQueryString = true; + } elseif ($parsed['operator'] == '&') { + $useQueryString = true; + } elseif ($parsed['operator'] == '#') { + $joiner = ','; + } elseif ($parsed['operator'] == ';') { + $useQueryString = true; + } elseif ($parsed['operator'] == '' || $parsed['operator'] == '+') { + $joiner = ','; + $prefix = ''; + } + + foreach ($parsed['values'] as $value) { + + if (!array_key_exists($value['value'], $this->variables) || $this->variables[$value['value']] === null) { + continue; + } + + $variable = $this->variables[$value['value']]; + $actuallyUseQueryString = $useQueryString; + $expanded = ''; + + if (is_array($variable)) { + + $isAssoc = $this->isAssoc($variable); + $kvp = array(); + foreach ($variable as $key => $var) { + + if ($isAssoc) { + $key = rawurlencode($key); + $isNestedArray = is_array($var); + } else { + $isNestedArray = false; + } + + if (!$isNestedArray) { + $var = rawurlencode($var); + if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { + $var = $this->decodeReserved($var); + } + } + + if ($value['modifier'] == '*') { + if ($isAssoc) { + if ($isNestedArray) { + // Nested arrays must allow for deeply nested structures + $var = strtr(http_build_query(array($key => $var)), $rfc1738to3986); + } else { + $var = $key . '=' . $var; + } + } elseif ($key > 0 && $actuallyUseQueryString) { + $var = $value['value'] . '=' . $var; + } + } + + $kvp[$key] = $var; + } + + if (empty($variable)) { + $actuallyUseQueryString = false; + } elseif ($value['modifier'] == '*') { + $expanded = implode($joiner, $kvp); + if ($isAssoc) { + // Don't prepend the value name when using the explode modifier with an associative array + $actuallyUseQueryString = false; + } + } else { + if ($isAssoc) { + // When an associative array is encountered and the explode modifier is not set, then the + // result must be a comma separated list of keys followed by their respective values. + foreach ($kvp as $k => &$v) { + $v = $k . ',' . $v; + } + } + $expanded = implode(',', $kvp); + } + + } else { + if ($value['modifier'] == ':') { + $variable = substr($variable, 0, $value['position']); + } + $expanded = rawurlencode($variable); + if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { + $expanded = $this->decodeReserved($expanded); + } + } + + if ($actuallyUseQueryString) { + if (!$expanded && $joiner != '&') { + $expanded = $value['value']; + } else { + $expanded = $value['value'] . '=' . $expanded; + } + } + + $replacements[] = $expanded; + } + + $ret = implode($joiner, $replacements); + if ($ret && $prefix) { + return $prefix . $ret; + } + + return $ret; + } + + /** + * Determines if an array is associative + * + * @param array $array Array to check + * + * @return bool + */ + private function isAssoc(array $array) + { + return (bool) count(array_filter(array_keys($array), 'is_string')); + } + + /** + * Removes percent encoding on reserved characters (used with + and # modifiers) + * + * @param string $string String to fix + * + * @return string + */ + private function decodeReserved($string) + { + return str_replace(self::$delimsPct, self::$delims, $string); + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php b/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php new file mode 100644 index 0000000..c81d515 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php @@ -0,0 +1,21 @@ +utf8 = $utf8; + } + + public function parseUrl($url) + { + Version::warn(__CLASS__ . ' is deprecated. Just use parse_url()'); + + static $defaults = array('scheme' => null, 'host' => null, 'path' => null, 'port' => null, 'query' => null, + 'user' => null, 'pass' => null, 'fragment' => null); + + $parts = parse_url($url); + + // Need to handle query parsing specially for UTF-8 requirements + if ($this->utf8 && isset($parts['query'])) { + $queryPos = strpos($url, '?'); + if (isset($parts['fragment'])) { + $parts['query'] = substr($url, $queryPos + 1, strpos($url, '#') - $queryPos - 1); + } else { + $parts['query'] = substr($url, $queryPos + 1); + } + } + + return $parts + $defaults; + } +} diff --git a/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php b/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php new file mode 100644 index 0000000..89ac4b3 --- /dev/null +++ b/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php @@ -0,0 +1,19 @@ +=5.3.2" + }, + "autoload": { + "psr-0": { "Guzzle\\Parser": "" } + }, + "target-dir": "Guzzle/Parser", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php new file mode 100644 index 0000000..7790f88 --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php @@ -0,0 +1,11 @@ + new DefaultCacheStorage($options)); + } elseif ($options instanceof CacheStorageInterface) { + $options = array('storage' => $options); + } elseif ($options) { + $options = array('storage' => new DefaultCacheStorage(CacheAdapterFactory::fromCache($options))); + } elseif (!class_exists('Doctrine\Common\Cache\ArrayCache')) { + // @codeCoverageIgnoreStart + throw new InvalidArgumentException('No cache was provided and Doctrine is not installed'); + // @codeCoverageIgnoreEnd + } + } + + $this->autoPurge = isset($options['auto_purge']) ? $options['auto_purge'] : false; + + // Add a cache storage if a cache adapter was provided + $this->storage = isset($options['storage']) + ? $options['storage'] + : new DefaultCacheStorage(new DoctrineCacheAdapter(new ArrayCache())); + + if (!isset($options['can_cache'])) { + $this->canCache = new DefaultCanCacheStrategy(); + } else { + $this->canCache = is_callable($options['can_cache']) + ? new CallbackCanCacheStrategy($options['can_cache']) + : $options['can_cache']; + } + + // Use the provided revalidation strategy or the default + $this->revalidation = isset($options['revalidation']) + ? $options['revalidation'] + : new DefaultRevalidation($this->storage, $this->canCache); + } + + public static function getSubscribedEvents() + { + return array( + 'request.before_send' => array('onRequestBeforeSend', -255), + 'request.sent' => array('onRequestSent', 255), + 'request.error' => array('onRequestError', 0), + 'request.exception' => array('onRequestException', 0), + ); + } + + /** + * Check if a response in cache will satisfy the request before sending + * + * @param Event $event + */ + public function onRequestBeforeSend(Event $event) + { + $request = $event['request']; + $request->addHeader('Via', sprintf('%s GuzzleCache/%s', $request->getProtocolVersion(), Version::VERSION)); + + if (!$this->canCache->canCacheRequest($request)) { + switch ($request->getMethod()) { + case 'PURGE': + $this->purge($request); + $request->setResponse(new Response(200, array(), 'purged')); + break; + case 'PUT': + case 'POST': + case 'DELETE': + case 'PATCH': + if ($this->autoPurge) { + $this->purge($request); + } + } + return; + } + + if ($response = $this->storage->fetch($request)) { + $params = $request->getParams(); + $params['cache.lookup'] = true; + $response->setHeader( + 'Age', + time() - strtotime($response->getDate() ? : $response->getLastModified() ?: 'now') + ); + // Validate that the response satisfies the request + if ($this->canResponseSatisfyRequest($request, $response)) { + if (!isset($params['cache.hit'])) { + $params['cache.hit'] = true; + } + $request->setResponse($response); + } + } + } + + /** + * If possible, store a response in cache after sending + * + * @param Event $event + */ + public function onRequestSent(Event $event) + { + $request = $event['request']; + $response = $event['response']; + + if ($request->getParams()->get('cache.hit') === null && + $this->canCache->canCacheRequest($request) && + $this->canCache->canCacheResponse($response) + ) { + $this->storage->cache($request, $response); + } + + $this->addResponseHeaders($request, $response); + } + + /** + * If possible, return a cache response on an error + * + * @param Event $event + */ + public function onRequestError(Event $event) + { + $request = $event['request']; + + if (!$this->canCache->canCacheRequest($request)) { + return; + } + + if ($response = $this->storage->fetch($request)) { + $response->setHeader( + 'Age', + time() - strtotime($response->getLastModified() ? : $response->getDate() ?: 'now') + ); + + if ($this->canResponseSatisfyFailedRequest($request, $response)) { + $request->getParams()->set('cache.hit', 'error'); + $this->addResponseHeaders($request, $response); + $event['response'] = $response; + $event->stopPropagation(); + } + } + } + + /** + * If possible, set a cache response on a cURL exception + * + * @param Event $event + * + * @return null + */ + public function onRequestException(Event $event) + { + if (!$event['exception'] instanceof CurlException) { + return; + } + + $request = $event['request']; + if (!$this->canCache->canCacheRequest($request)) { + return; + } + + if ($response = $this->storage->fetch($request)) { + $response->setHeader('Age', time() - strtotime($response->getDate() ? : 'now')); + if (!$this->canResponseSatisfyFailedRequest($request, $response)) { + return; + } + $request->getParams()->set('cache.hit', 'error'); + $request->setResponse($response); + $this->addResponseHeaders($request, $response); + $event->stopPropagation(); + } + } + + /** + * Check if a cache response satisfies a request's caching constraints + * + * @param RequestInterface $request Request to validate + * @param Response $response Response to validate + * + * @return bool + */ + public function canResponseSatisfyRequest(RequestInterface $request, Response $response) + { + $responseAge = $response->calculateAge(); + $reqc = $request->getHeader('Cache-Control'); + $resc = $response->getHeader('Cache-Control'); + + // Check the request's max-age header against the age of the response + if ($reqc && $reqc->hasDirective('max-age') && + $responseAge > $reqc->getDirective('max-age')) { + return false; + } + + // Check the response's max-age header + if ($response->isFresh() === false) { + $maxStale = $reqc ? $reqc->getDirective('max-stale') : null; + if (null !== $maxStale) { + if ($maxStale !== true && $response->getFreshness() < (-1 * $maxStale)) { + return false; + } + } elseif ($resc && $resc->hasDirective('max-age') + && $responseAge > $resc->getDirective('max-age') + ) { + return false; + } + } + + if ($this->revalidation->shouldRevalidate($request, $response)) { + try { + return $this->revalidation->revalidate($request, $response); + } catch (CurlException $e) { + $request->getParams()->set('cache.hit', 'error'); + return $this->canResponseSatisfyFailedRequest($request, $response); + } + } + + return true; + } + + /** + * Check if a cache response satisfies a failed request's caching constraints + * + * @param RequestInterface $request Request to validate + * @param Response $response Response to validate + * + * @return bool + */ + public function canResponseSatisfyFailedRequest(RequestInterface $request, Response $response) + { + $reqc = $request->getHeader('Cache-Control'); + $resc = $response->getHeader('Cache-Control'); + $requestStaleIfError = $reqc ? $reqc->getDirective('stale-if-error') : null; + $responseStaleIfError = $resc ? $resc->getDirective('stale-if-error') : null; + + if (!$requestStaleIfError && !$responseStaleIfError) { + return false; + } + + if (is_numeric($requestStaleIfError) && $response->getAge() - $response->getMaxAge() > $requestStaleIfError) { + return false; + } + + if (is_numeric($responseStaleIfError) && $response->getAge() - $response->getMaxAge() > $responseStaleIfError) { + return false; + } + + return true; + } + + /** + * Purge all cache entries for a given URL + * + * @param string $url URL to purge + */ + public function purge($url) + { + // BC compatibility with previous version that accepted a Request object + $url = $url instanceof RequestInterface ? $url->getUrl() : $url; + $this->storage->purge($url); + } + + /** + * Add the plugin's headers to a response + * + * @param RequestInterface $request Request + * @param Response $response Response to add headers to + */ + protected function addResponseHeaders(RequestInterface $request, Response $response) + { + $params = $request->getParams(); + $response->setHeader('Via', sprintf('%s GuzzleCache/%s', $request->getProtocolVersion(), Version::VERSION)); + + $lookup = ($params['cache.lookup'] === true ? 'HIT' : 'MISS') . ' from GuzzleCache'; + if ($header = $response->getHeader('X-Cache-Lookup')) { + // Don't add duplicates + $values = $header->toArray(); + $values[] = $lookup; + $response->setHeader('X-Cache-Lookup', array_unique($values)); + } else { + $response->setHeader('X-Cache-Lookup', $lookup); + } + + if ($params['cache.hit'] === true) { + $xcache = 'HIT from GuzzleCache'; + } elseif ($params['cache.hit'] == 'error') { + $xcache = 'HIT_ERROR from GuzzleCache'; + } else { + $xcache = 'MISS from GuzzleCache'; + } + + if ($header = $response->getHeader('X-Cache')) { + // Don't add duplicates + $values = $header->toArray(); + $values[] = $xcache; + $response->setHeader('X-Cache', array_unique($values)); + } else { + $response->setHeader('X-Cache', $xcache); + } + + if ($response->isFresh() === false) { + $response->addHeader('Warning', sprintf('110 GuzzleCache/%s "Response is stale"', Version::VERSION)); + if ($params['cache.hit'] === 'error') { + $response->addHeader('Warning', sprintf('111 GuzzleCache/%s "Revalidation failed"', Version::VERSION)); + } + } + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheStorageInterface.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheStorageInterface.php new file mode 100644 index 0000000..f3d9154 --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CacheStorageInterface.php @@ -0,0 +1,43 @@ +requestCallback = $requestCallback; + $this->responseCallback = $responseCallback; + } + + public function canCacheRequest(RequestInterface $request) + { + return $this->requestCallback + ? call_user_func($this->requestCallback, $request) + : parent::canCacheRequest($request); + } + + public function canCacheResponse(Response $response) + { + return $this->responseCallback + ? call_user_func($this->responseCallback, $response) + : parent::canCacheResponse($response); + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php new file mode 100644 index 0000000..6e01a8e --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php @@ -0,0 +1,30 @@ +getParams()->get(self::CACHE_KEY); + + if (!$key) { + + $cloned = clone $request; + $cloned->removeHeader('Cache-Control'); + + // Check to see how and if the key should be filtered + foreach (explode(';', $request->getParams()->get(self::CACHE_KEY_FILTER)) as $part) { + $pieces = array_map('trim', explode('=', $part)); + if (isset($pieces[1])) { + foreach (array_map('trim', explode(',', $pieces[1])) as $remove) { + if ($pieces[0] == 'header') { + $cloned->removeHeader($remove); + } elseif ($pieces[0] == 'query') { + $cloned->getQuery()->remove($remove); + } + } + } + } + + $raw = (string) $cloned; + $key = 'GZ' . md5($raw); + $request->getParams()->set(self::CACHE_KEY, $key)->set(self::CACHE_KEY_RAW, $raw); + } + + return $key; + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCacheStorage.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCacheStorage.php new file mode 100644 index 0000000..555c9b7 --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCacheStorage.php @@ -0,0 +1,251 @@ +cache = CacheAdapterFactory::fromCache($cache); + $this->defaultTtl = $defaultTtl; + $this->keyPrefix = $keyPrefix; + } + + public function cache(RequestInterface $request, Response $response) + { + $currentTime = time(); + $ttl = $request->getParams()->get('cache.override_ttl') ?: $response->getMaxAge() ?: $this->defaultTtl; + + if ($cacheControl = $response->getHeader('Cache-Control')) { + $stale = $cacheControl->getDirective('stale-if-error'); + $ttl += $stale == true ? $ttl : $stale; + } + + // Determine which manifest key should be used + $key = $this->getCacheKey($request); + $persistedRequest = $this->persistHeaders($request); + $entries = array(); + + if ($manifest = $this->cache->fetch($key)) { + // Determine which cache entries should still be in the cache + $vary = $response->getVary(); + foreach (unserialize($manifest) as $entry) { + // Check if the entry is expired + if ($entry[4] < $currentTime) { + continue; + } + $entry[1]['vary'] = isset($entry[1]['vary']) ? $entry[1]['vary'] : ''; + if ($vary != $entry[1]['vary'] || !$this->requestsMatch($vary, $entry[0], $persistedRequest)) { + $entries[] = $entry; + } + } + } + + // Persist the response body if needed + $bodyDigest = null; + if ($response->getBody() && $response->getBody()->getContentLength() > 0) { + $bodyDigest = $this->getBodyKey($request->getUrl(), $response->getBody()); + $this->cache->save($bodyDigest, (string) $response->getBody(), $ttl); + } + + array_unshift($entries, array( + $persistedRequest, + $this->persistHeaders($response), + $response->getStatusCode(), + $bodyDigest, + $currentTime + $ttl + )); + + $this->cache->save($key, serialize($entries)); + } + + public function delete(RequestInterface $request) + { + $key = $this->getCacheKey($request); + if ($entries = $this->cache->fetch($key)) { + // Delete each cached body + foreach (unserialize($entries) as $entry) { + if ($entry[3]) { + $this->cache->delete($entry[3]); + } + } + $this->cache->delete($key); + } + } + + public function purge($url) + { + foreach (array('GET', 'HEAD', 'POST', 'PUT', 'DELETE') as $method) { + $this->delete(new Request($method, $url)); + } + } + + public function fetch(RequestInterface $request) + { + $key = $this->getCacheKey($request); + if (!($entries = $this->cache->fetch($key))) { + return null; + } + + $match = null; + $headers = $this->persistHeaders($request); + $entries = unserialize($entries); + foreach ($entries as $index => $entry) { + if ($this->requestsMatch(isset($entry[1]['vary']) ? $entry[1]['vary'] : '', $headers, $entry[0])) { + $match = $entry; + break; + } + } + + if (!$match) { + return null; + } + + // Ensure that the response is not expired + $response = null; + if ($match[4] < time()) { + $response = -1; + } else { + $response = new Response($match[2], $match[1]); + if ($match[3]) { + if ($body = $this->cache->fetch($match[3])) { + $response->setBody($body); + } else { + // The response is not valid because the body was somehow deleted + $response = -1; + } + } + } + + if ($response === -1) { + // Remove the entry from the metadata and update the cache + unset($entries[$index]); + if ($entries) { + $this->cache->save($key, serialize($entries)); + } else { + $this->cache->delete($key); + } + return null; + } + + return $response; + } + + /** + * Hash a request URL into a string that returns cache metadata + * + * @param RequestInterface $request + * + * @return string + */ + protected function getCacheKey(RequestInterface $request) + { + // Allow cache.key_filter to trim down the URL cache key by removing generate query string values (e.g. auth) + if ($filter = $request->getParams()->get('cache.key_filter')) { + $url = $request->getUrl(true); + foreach (explode(',', $filter) as $remove) { + $url->getQuery()->remove(trim($remove)); + } + } else { + $url = $request->getUrl(); + } + + return $this->keyPrefix . md5($request->getMethod() . ' ' . $url); + } + + /** + * Create a cache key for a response's body + * + * @param string $url URL of the entry + * @param EntityBodyInterface $body Response body + * + * @return string + */ + protected function getBodyKey($url, EntityBodyInterface $body) + { + return $this->keyPrefix . md5($url) . $body->getContentMd5(); + } + + /** + * Determines whether two Request HTTP header sets are non-varying + * + * @param string $vary Response vary header + * @param array $r1 HTTP header array + * @param array $r2 HTTP header array + * + * @return bool + */ + private function requestsMatch($vary, $r1, $r2) + { + if ($vary) { + foreach (explode(',', $vary) as $header) { + $key = trim(strtolower($header)); + $v1 = isset($r1[$key]) ? $r1[$key] : null; + $v2 = isset($r2[$key]) ? $r2[$key] : null; + if ($v1 !== $v2) { + return false; + } + } + } + + return true; + } + + /** + * Creates an array of cacheable and normalized message headers + * + * @param MessageInterface $message + * + * @return array + */ + private function persistHeaders(MessageInterface $message) + { + // Headers are excluded from the caching (see RFC 2616:13.5.1) + static $noCache = array( + 'age' => true, + 'connection' => true, + 'keep-alive' => true, + 'proxy-authenticate' => true, + 'proxy-authorization' => true, + 'te' => true, + 'trailers' => true, + 'transfer-encoding' => true, + 'upgrade' => true, + 'set-cookie' => true, + 'set-cookie2' => true + ); + + // Clone the response to not destroy any necessary headers when caching + $headers = $message->getHeaders()->getAll(); + $headers = array_diff_key($headers, $noCache); + // Cast the headers to a string + $headers = array_map(function ($h) { return (string) $h; }, $headers); + + return $headers; + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php new file mode 100644 index 0000000..3ca1fbf --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php @@ -0,0 +1,32 @@ +getMethod() != RequestInterface::GET && $request->getMethod() != RequestInterface::HEAD) { + return false; + } + + // Never cache requests when using no-store + if ($request->hasHeader('Cache-Control') && $request->getHeader('Cache-Control')->hasDirective('no-store')) { + return false; + } + + return true; + } + + public function canCacheResponse(Response $response) + { + return $response->isSuccessful() && $response->canCache(); + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultRevalidation.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultRevalidation.php new file mode 100644 index 0000000..af33234 --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DefaultRevalidation.php @@ -0,0 +1,174 @@ +storage = $cache; + $this->canCache = $canCache ?: new DefaultCanCacheStrategy(); + } + + public function revalidate(RequestInterface $request, Response $response) + { + try { + $revalidate = $this->createRevalidationRequest($request, $response); + $validateResponse = $revalidate->send(); + if ($validateResponse->getStatusCode() == 200) { + return $this->handle200Response($request, $validateResponse); + } elseif ($validateResponse->getStatusCode() == 304) { + return $this->handle304Response($request, $validateResponse, $response); + } + } catch (BadResponseException $e) { + $this->handleBadResponse($e); + } + + // Other exceptions encountered in the revalidation request are ignored + // in hopes that sending a request to the origin server will fix it + return false; + } + + public function shouldRevalidate(RequestInterface $request, Response $response) + { + if ($request->getMethod() != RequestInterface::GET) { + return false; + } + + $reqCache = $request->getHeader('Cache-Control'); + $resCache = $response->getHeader('Cache-Control'); + + $revalidate = $request->getHeader('Pragma') == 'no-cache' || + ($reqCache && ($reqCache->hasDirective('no-cache') || $reqCache->hasDirective('must-revalidate'))) || + ($resCache && ($resCache->hasDirective('no-cache') || $resCache->hasDirective('must-revalidate'))); + + // Use the strong ETag validator if available and the response contains no Cache-Control directive + if (!$revalidate && !$resCache && $response->hasHeader('ETag')) { + $revalidate = true; + } + + return $revalidate; + } + + /** + * Handles a bad response when attempting to revalidate + * + * @param BadResponseException $e Exception encountered + * + * @throws BadResponseException + */ + protected function handleBadResponse(BadResponseException $e) + { + // 404 errors mean the resource no longer exists, so remove from + // cache, and prevent an additional request by throwing the exception + if ($e->getResponse()->getStatusCode() == 404) { + $this->storage->delete($e->getRequest()); + throw $e; + } + } + + /** + * Creates a request to use for revalidation + * + * @param RequestInterface $request Request + * @param Response $response Response to revalidate + * + * @return RequestInterface returns a revalidation request + */ + protected function createRevalidationRequest(RequestInterface $request, Response $response) + { + $revalidate = clone $request; + $revalidate->removeHeader('Pragma')->removeHeader('Cache-Control'); + + if ($response->getLastModified()) { + $revalidate->setHeader('If-Modified-Since', $response->getLastModified()); + } + + if ($response->getEtag()) { + $revalidate->setHeader('If-None-Match', $response->getEtag()); + } + + // Remove any cache plugins that might be on the request to prevent infinite recursive revalidations + $dispatcher = $revalidate->getEventDispatcher(); + foreach ($dispatcher->getListeners() as $eventName => $listeners) { + foreach ($listeners as $listener) { + if (is_array($listener) && $listener[0] instanceof CachePlugin) { + $dispatcher->removeListener($eventName, $listener); + } + } + } + + return $revalidate; + } + + /** + * Handles a 200 response response from revalidating. The server does not support validation, so use this response. + * + * @param RequestInterface $request Request that was sent + * @param Response $validateResponse Response received + * + * @return bool Returns true if valid, false if invalid + */ + protected function handle200Response(RequestInterface $request, Response $validateResponse) + { + $request->setResponse($validateResponse); + if ($this->canCache->canCacheResponse($validateResponse)) { + $this->storage->cache($request, $validateResponse); + } + + return false; + } + + /** + * Handle a 304 response and ensure that it is still valid + * + * @param RequestInterface $request Request that was sent + * @param Response $validateResponse Response received + * @param Response $response Original cached response + * + * @return bool Returns true if valid, false if invalid + */ + protected function handle304Response(RequestInterface $request, Response $validateResponse, Response $response) + { + static $replaceHeaders = array('Date', 'Expires', 'Cache-Control', 'ETag', 'Last-Modified'); + + // Make sure that this response has the same ETag + if ($validateResponse->getEtag() != $response->getEtag()) { + return false; + } + + // Replace cached headers with any of these headers from the + // origin server that might be more up to date + $modified = false; + foreach ($replaceHeaders as $name) { + if ($validateResponse->hasHeader($name)) { + $modified = true; + $response->setHeader($name, $validateResponse->getHeader($name)); + } + } + + // Store the updated response in cache + if ($modified && $this->canCache->canCacheResponse($response)) { + $this->storage->cache($request, $response); + } + + return true; + } +} diff --git a/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DenyRevalidation.php b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DenyRevalidation.php new file mode 100644 index 0000000..88b86f3 --- /dev/null +++ b/vendor/guzzle/plugin-cache/Guzzle/Plugin/Cache/DenyRevalidation.php @@ -0,0 +1,19 @@ +=5.3.2", + "guzzle/http": "self.version", + "guzzle/cache": "self.version" + }, + "autoload": { + "psr-0": { "Guzzle\\Plugin\\Cache": "" } + }, + "target-dir": "Guzzle/Plugin/Cache", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} diff --git a/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php b/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php new file mode 100644 index 0000000..9949e45 --- /dev/null +++ b/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php @@ -0,0 +1,276 @@ +contextOptions = stream_context_get_options($context); + $this->context = $context; + } elseif (is_array($context) || !$context) { + $this->contextOptions = $context; + $this->createContext($params); + } elseif ($context) { + throw new InvalidArgumentException('$context must be an array or resource'); + } + + // Dispatch the before send event + $request->dispatch('request.before_send', array( + 'request' => $request, + 'context' => $this->context, + 'context_options' => $this->contextOptions + )); + + $this->setUrl($request); + $this->addDefaultContextOptions($request); + $this->addSslOptions($request); + $this->addBodyOptions($request); + $this->addProxyOptions($request); + + // Create the file handle but silence errors + return $this->createStream($params) + ->setCustomData('request', $request) + ->setCustomData('response_headers', $this->getLastResponseHeaders()); + } + + /** + * Set an option on the context and the internal options array + * + * @param string $wrapper Stream wrapper name of http + * @param string $name Context name + * @param mixed $value Context value + * @param bool $overwrite Set to true to overwrite an existing value + */ + protected function setContextValue($wrapper, $name, $value, $overwrite = false) + { + if (!isset($this->contextOptions[$wrapper])) { + $this->contextOptions[$wrapper] = array($name => $value); + } elseif (!$overwrite && isset($this->contextOptions[$wrapper][$name])) { + return; + } + $this->contextOptions[$wrapper][$name] = $value; + stream_context_set_option($this->context, $wrapper, $name, $value); + } + + /** + * Create a stream context + * + * @param array $params Parameter array + */ + protected function createContext(array $params) + { + $options = $this->contextOptions; + $this->context = $this->createResource(function () use ($params, $options) { + return stream_context_create($options, $params); + }); + } + + /** + * Get the last response headers received by the HTTP request + * + * @return array + */ + public function getLastResponseHeaders() + { + return $this->lastResponseHeaders; + } + + /** + * Adds the default context options to the stream context options + * + * @param RequestInterface $request Request + */ + protected function addDefaultContextOptions(RequestInterface $request) + { + $this->setContextValue('http', 'method', $request->getMethod()); + $headers = $request->getHeaderLines(); + + // "Connection: close" is required to get streams to work in HTTP 1.1 + if (!$request->hasHeader('Connection')) { + $headers[] = 'Connection: close'; + } + + $this->setContextValue('http', 'header', $headers); + $this->setContextValue('http', 'protocol_version', $request->getProtocolVersion()); + $this->setContextValue('http', 'ignore_errors', true); + } + + /** + * Set the URL to use with the factory + * + * @param RequestInterface $request Request that owns the URL + */ + protected function setUrl(RequestInterface $request) + { + $this->url = $request->getUrl(true); + + // Check for basic Auth username + if ($request->getUsername()) { + $this->url->setUsername($request->getUsername()); + } + + // Check for basic Auth password + if ($request->getPassword()) { + $this->url->setPassword($request->getPassword()); + } + } + + /** + * Add SSL options to the stream context + * + * @param RequestInterface $request Request + */ + protected function addSslOptions(RequestInterface $request) + { + if ($request->getCurlOptions()->get(CURLOPT_SSL_VERIFYPEER)) { + $this->setContextValue('ssl', 'verify_peer', true, true); + if ($cafile = $request->getCurlOptions()->get(CURLOPT_CAINFO)) { + $this->setContextValue('ssl', 'cafile', $cafile, true); + } + } else { + $this->setContextValue('ssl', 'verify_peer', false, true); + } + } + + /** + * Add body (content) specific options to the context options + * + * @param RequestInterface $request + */ + protected function addBodyOptions(RequestInterface $request) + { + // Add the content for the request if needed + if (!($request instanceof EntityEnclosingRequestInterface)) { + return; + } + + if (count($request->getPostFields())) { + $this->setContextValue('http', 'content', (string) $request->getPostFields(), true); + } elseif ($request->getBody()) { + $this->setContextValue('http', 'content', (string) $request->getBody(), true); + } + + // Always ensure a content-length header is sent + if (isset($this->contextOptions['http']['content'])) { + $headers = isset($this->contextOptions['http']['header']) ? $this->contextOptions['http']['header'] : array(); + $headers[] = 'Content-Length: ' . strlen($this->contextOptions['http']['content']); + $this->setContextValue('http', 'header', $headers, true); + } + } + + /** + * Add proxy parameters to the context if needed + * + * @param RequestInterface $request Request + */ + protected function addProxyOptions(RequestInterface $request) + { + if ($proxy = $request->getCurlOptions()->get(CURLOPT_PROXY)) { + $this->setContextValue('http', 'proxy', $proxy); + } + } + + /** + * Create the stream for the request with the context options + * + * @param array $params Parameters of the stream + * + * @return StreamInterface + */ + protected function createStream(array $params) + { + $http_response_header = null; + $url = $this->url; + $context = $this->context; + $fp = $this->createResource(function () use ($context, $url, &$http_response_header) { + return fopen((string) $url, 'r', false, $context); + }); + + // Determine the class to instantiate + $className = isset($params['stream_class']) ? $params['stream_class'] : __NAMESPACE__ . '\\Stream'; + + /** @var $stream StreamInterface */ + $stream = new $className($fp); + + // Track the response headers of the request + if (isset($http_response_header)) { + $this->lastResponseHeaders = $http_response_header; + $this->processResponseHeaders($stream); + } + + return $stream; + } + + /** + * Process response headers + * + * @param StreamInterface $stream + */ + protected function processResponseHeaders(StreamInterface $stream) + { + // Set the size on the stream if it was returned in the response + foreach ($this->lastResponseHeaders as $header) { + if ((stripos($header, 'Content-Length:')) === 0) { + $stream->setSize(trim(substr($header, 15))); + } + } + } + + /** + * Create a resource and check to ensure it was created successfully + * + * @param callable $callback Closure to invoke that must return a valid resource + * + * @return resource + * @throws RuntimeException on error + */ + protected function createResource($callback) + { + // Turn off error reporting while we try to initiate the request + $level = error_reporting(0); + $resource = call_user_func($callback); + error_reporting($level); + + // If the resource could not be created, then grab the last error and throw an exception + if (false === $resource) { + $message = 'Error creating resource. '; + foreach (error_get_last() as $key => $value) { + $message .= "[{$key}] {$value} "; + } + throw new RuntimeException(trim($message)); + } + + return $resource; + } +} diff --git a/vendor/guzzle/stream/Guzzle/Stream/Stream.php b/vendor/guzzle/stream/Guzzle/Stream/Stream.php new file mode 100644 index 0000000..12bed26 --- /dev/null +++ b/vendor/guzzle/stream/Guzzle/Stream/Stream.php @@ -0,0 +1,289 @@ + array( + 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, + 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, + 'rt' => true, 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a+' => true + ), + 'write' => array( + 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, 'c+' => true, + 'wb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, + 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true + ) + ); + + /** + * @param resource $stream Stream resource to wrap + * @param int $size Size of the stream in bytes. Only pass if the size cannot be obtained from the stream. + * + * @throws InvalidArgumentException if the stream is not a stream resource + */ + public function __construct($stream, $size = null) + { + $this->setStream($stream, $size); + } + + /** + * Closes the stream when the helper is destructed + */ + public function __destruct() + { + $this->close(); + } + + public function __toString() + { + if (!$this->isReadable() || (!$this->isSeekable() && $this->isConsumed())) { + return ''; + } + + $originalPos = $this->ftell(); + $body = stream_get_contents($this->stream, -1, 0); + $this->seek($originalPos); + + return $body; + } + + public function close() + { + if (is_resource($this->stream)) { + fclose($this->stream); + } + $this->cache[self::IS_READABLE] = false; + $this->cache[self::IS_WRITABLE] = false; + } + + /** + * Calculate a hash of a Stream + * + * @param StreamInterface $stream Stream to calculate the hash for + * @param string $algo Hash algorithm (e.g. md5, crc32, etc) + * @param bool $rawOutput Whether or not to use raw output + * + * @return bool|string Returns false on failure or a hash string on success + */ + public static function getHash(StreamInterface $stream, $algo, $rawOutput = false) + { + $pos = $stream->ftell(); + if (!$stream->seek(0)) { + return false; + } + + $ctx = hash_init($algo); + while (!$stream->feof()) { + hash_update($ctx, $stream->read(8192)); + } + + $out = hash_final($ctx, (bool) $rawOutput); + $stream->seek($pos); + + return $out; + } + + public function getMetaData($key = null) + { + $meta = stream_get_meta_data($this->stream); + + return !$key ? $meta : (array_key_exists($key, $meta) ? $meta[$key] : null); + } + + public function getStream() + { + return $this->stream; + } + + public function setStream($stream, $size = null) + { + if (!is_resource($stream)) { + throw new InvalidArgumentException('Stream must be a resource'); + } + + $this->size = $size; + $this->stream = $stream; + $this->rebuildCache(); + + return $this; + } + + public function detachStream() + { + $this->stream = null; + + return $this; + } + + public function getWrapper() + { + return $this->cache[self::WRAPPER_TYPE]; + } + + public function getWrapperData() + { + return $this->getMetaData('wrapper_data') ?: array(); + } + + public function getStreamType() + { + return $this->cache[self::STREAM_TYPE]; + } + + public function getUri() + { + return $this->cache['uri']; + } + + public function getSize() + { + if ($this->size !== null) { + return $this->size; + } + + // If the stream is a file based stream and local, then use fstat + clearstatcache(true, $this->cache['uri']); + $stats = fstat($this->stream); + if (isset($stats['size'])) { + $this->size = $stats['size']; + return $this->size; + } elseif ($this->cache[self::IS_READABLE] && $this->cache[self::SEEKABLE]) { + // Only get the size based on the content if the the stream is readable and seekable + $pos = $this->ftell(); + $this->size = strlen((string) $this); + $this->seek($pos); + return $this->size; + } + + return false; + } + + public function isReadable() + { + return $this->cache[self::IS_READABLE]; + } + + public function isRepeatable() + { + return $this->cache[self::IS_READABLE] && $this->cache[self::SEEKABLE]; + } + + public function isWritable() + { + return $this->cache[self::IS_WRITABLE]; + } + + public function isConsumed() + { + return feof($this->stream); + } + + public function feof() + { + return $this->isConsumed(); + } + + public function isLocal() + { + return $this->cache[self::IS_LOCAL]; + } + + public function isSeekable() + { + return $this->cache[self::SEEKABLE]; + } + + public function setSize($size) + { + $this->size = $size; + + return $this; + } + + public function seek($offset, $whence = SEEK_SET) + { + return $this->cache[self::SEEKABLE] ? fseek($this->stream, $offset, $whence) === 0 : false; + } + + public function read($length) + { + return fread($this->stream, $length); + } + + public function write($string) + { + // We can't know the size after writing anything + $this->size = null; + + return fwrite($this->stream, $string); + } + + public function ftell() + { + return ftell($this->stream); + } + + public function rewind() + { + return $this->seek(0); + } + + public function readLine($maxLength = null) + { + if (!$this->cache[self::IS_READABLE]) { + return false; + } else { + return $maxLength ? fgets($this->getStream(), $maxLength) : fgets($this->getStream()); + } + } + + public function setCustomData($key, $value) + { + $this->customData[$key] = $value; + + return $this; + } + + public function getCustomData($key) + { + return isset($this->customData[$key]) ? $this->customData[$key] : null; + } + + /** + * Reprocess stream metadata + */ + protected function rebuildCache() + { + $this->cache = stream_get_meta_data($this->stream); + $this->cache[self::IS_LOCAL] = stream_is_local($this->stream); + $this->cache[self::IS_READABLE] = isset(self::$readWriteHash['read'][$this->cache['mode']]); + $this->cache[self::IS_WRITABLE] = isset(self::$readWriteHash['write'][$this->cache['mode']]); + } +} diff --git a/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php b/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php new file mode 100644 index 0000000..6d7dc37 --- /dev/null +++ b/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php @@ -0,0 +1,218 @@ +=5.3.2", + "guzzle/common": "self.version" + }, + "suggest": { + "guzzle/http": "To convert Guzzle request objects to PHP streams" + }, + "autoload": { + "psr-0": { "Guzzle\\Stream": "" } + }, + "target-dir": "Guzzle/Stream", + "extra": { + "branch-alias": { + "dev-master": "3.7-dev" + } + } +} diff --git a/vendor/phayes/geophp/.gitignore b/vendor/phayes/geophp/.gitignore new file mode 100644 index 0000000..61ead86 --- /dev/null +++ b/vendor/phayes/geophp/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/vendor/phayes/geophp/.travis.yml b/vendor/phayes/geophp/.travis.yml new file mode 100644 index 0000000..5e2821a --- /dev/null +++ b/vendor/phayes/geophp/.travis.yml @@ -0,0 +1,27 @@ +# docs available at http://docs.travis-ci.com/user/languages/php/ +# example available at https://github.com/travis-ci/travis-ci-php-example +language: php + +before_script: + - composer self-update + +install: + - composer install + # TODO Install geos library -- as a matrix test + # TODO optionally set up a postgis database for testing + +script: cd tests && phpunit --verbose --colors --stderr tests + +# run tests on the following versions +php: + - 5.6 + - 5.5 + - 5.4 + - 5.3 + - hhvm + +matrix: + fast_finish: false + allow_failures: + # php 5.3 does not support random file list as an argument to scandir + - php: 5.3 diff --git a/vendor/phayes/geophp/LICENSE b/vendor/phayes/geophp/LICENSE new file mode 100644 index 0000000..9593990 --- /dev/null +++ b/vendor/phayes/geophp/LICENSE @@ -0,0 +1,370 @@ +Copyright (c) 2011, Patrick Hayes and contributors + +This program is dual-licensed under both the GPL version 2 (or later) and +Modified BSD License. Either license may be used at your option. + +------------------------------------------------------------------------------ +Modified BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/vendor/phayes/geophp/README.md b/vendor/phayes/geophp/README.md new file mode 100644 index 0000000..6e657fc --- /dev/null +++ b/vendor/phayes/geophp/README.md @@ -0,0 +1,150 @@ +GeoPHP is a open-source native PHP library for doing geometry operations. It is written entirely in PHP and +can therefore run on shared hosts. It can read and write a wide variety of formats: WKT (including EWKT), WKB (including EWKB), GeoJSON, +KML, GPX, GeoRSS). It works with all Simple-Feature geometries (Point, LineString, Polygon, GeometryCollection etc.) +and can be used to get centroids, bounding-boxes, area, and a wide variety of other useful information. + +geoPHP also helpfully wraps the GEOS php extension so that applications can get a transparent performance +increase when GEOS is installed on the server. When GEOS is installed, geoPHP also becomes +fully compliant with the OpenGIS® Implementation Standard for Geographic information. With GEOS you get the +full-set of openGIS functions in PHP like Union, IsWithin, Touches etc. This means that applications +get a useful "core-set" of geometry operations that work in all environments, and an "extended-set"of operations +for environments that have GEOS installed. + +See the 'getting started' section below for references and examples of everything that geoPHP can do. + +This project is currently looking for co-maintainers. If you think you can help out, please send me a +message. Forks are also welcome, please issue pull requests and I will merge them into the main branch. + +Getting Started +----------------------- + + * The lastest stable version can always be downloaded at: + * Read the API Reference at: + * Examples + * Using geoPHP as a GIS format converter: + * Other Interesting Links: + * Learn about GEOS integration at: + +Example usage +------------------------------------------------- + +```php +getArea(); +$centroid = $polygon->getCentroid(); +$centX = $centroid->getX(); +$centY = $centroid->getY(); + +print "This polygon has an area of ".$area." and a centroid with X=".$centX." and Y=".$centY; + +// MultiPoint json example +print "
"; +$json = +'{ + "type": "MultiPoint", + "coordinates": [ + [100.0, 0.0], [101.0, 1.0] + ] +}'; + +$multipoint = geoPHP::load($json, 'json'); +$multipoint_points = $multipoint->getComponents(); +$first_wkt = $multipoint_points[0]->out('wkt'); + +print "This multipoint has ".$multipoint->numGeometries()." points. The first point has a wkt representation of ".$first_wkt; +``` +======= + +More Examples +------------------------------------------------- + +The Well Known Text (WKT) and Well Known Binary (WKB) support is ideal for integrating with MySQL's or PostGIS's spatial capability. +Once you have SELECTed your data with `'AsText('geo_field')'` or `'AsBinary('geo_field')'`, you can put it straight into +geoPHP (can be wkt or wkb, but must be the same as how you extracted it from your database): + + $geom = geoPHP::load($dbRow,'wkt'); + +You can collect multiple geometries into one (note that you must use wkt for this): + + $geom = geoPHP::load("GEOMETRYCOLLECTION(".$dbString1.",".$dbString2.")",'wkt'); + +Calling get components returns the sub-geometries within a geometry as an array. + + $geom2 = geoPHP::load("GEOMETRYCOLLECTION(LINESTRING(1 1,5 1,5 5,1 5,1 1),LINESTRING(2 2,2 3,3 3,3 2,2 2))"); + $geomComponents = $geom2->getComponents(); //an array of the two linestring geometries + $linestring1 = $geomComponents[0]->getComponents(); //an array of the first linestring's point geometries + $linestring2 = $geomComponents[1]->getComponents(); + echo $linestring1[0]->x() . ", " . $linestring1[0]->y(); //outputs '1, 1' + +An alternative is to use the `asArray()` method. Using the above geometry collection of two linestrings, + + $geometryArray = $geom2->asArray(); + echo $geometryArray[0][0][0] . ", " . $geometryArray[0][0][1]; //outputs '1, 1' + +Clearly, more complex analysis is possible. + + echo $geom2->envelope()->area(); + + +Working with PostGIS +--------------------- +geoPHP, through it's EWKB adapter, has good integration with postGIS. Here's an example of reading and writing postGIS geometries + +```php +out('ewkb')); + pg_query($connection, "INSERT INTO $table ($column) values (GeomFromWKB('$insert_string'))"); +} + +// Using a direct SELECT and INSERTs in PostGIS without using wrapping functions +$result = pg_fetch_all(pg_query($connection, "SELECT $column as geom FROM $table")); +foreach ($result as $item) { + $wkb = pack('H*',$item['geom']); // Unpacking the hex blob + $geom = geoPHP::load($wkb, 'ewkb'); // We now have a geoPHP Geometry + + // To insert directly into postGIS we need to unpack the WKB + $unpacked = unpack('H*', $geom->out('ewkb')); + $insert_string = $unpacked[1]; + pg_query($connection, "INSERT INTO $table ($column) values ('$insert_string')"); +} +``` + + +Credit +------------------------------------------------- + +Maintainer: Patrick Hayes + +Additional Contributors: + + * GeoMemes Research () + * HighWire Press () and GeoScienceWorld () + * Arnaud Renevier (gisconverter.php) + * Dave Tarc + * Elliott Hunston (documentation) + +This library is open-source and dual-licensed under both the Modified BSD License and GPLv2. Either license may be used at your option. diff --git a/vendor/phayes/geophp/composer.json b/vendor/phayes/geophp/composer.json new file mode 100644 index 0000000..a02eba8 --- /dev/null +++ b/vendor/phayes/geophp/composer.json @@ -0,0 +1,18 @@ +{ + "name": "phayes/geophp", + "license": "GPL-2 or New-BSD", + "type": "library", + "description": "GeoPHP is a open-source native PHP library for doing geometry operations. It is written entirely in PHP and can therefore run on shared hosts. It can read and write a wide variety of formats: WKT (including EWKT), WKB (including EWKB), GeoJSON, KML, GPX, GeoRSS). It works with all Simple-Feature geometries (Point, LineString, Polygon, GeometryCollection etc.) and can be used to get centroids, bounding-boxes, area, and a wide variety of other useful information.", + "homepage": "https://github.com/phayes/geoPHP", + "autoload": { + "classmap": ["geoPHP.inc"] + }, + "authors":[ + { + "name":"Patrick Hayes" + } + ], + "require-dev": { + "phpunit/phpunit": "4.1.*" + } +} diff --git a/vendor/phayes/geophp/doc/api.html b/vendor/phayes/geophp/doc/api.html new file mode 100644 index 0000000..0eaf039 --- /dev/null +++ b/vendor/phayes/geophp/doc/api.html @@ -0,0 +1,735 @@ +
+ +
+
+
+
+ + + + +
+
Table of Contents
+ +
+

+ + geoPHP static class + +

+ +

geoPHP provides a static class that contains useful utility functions. All methods must + be called statically.

+

+ + Example + +

+ +
$geometry = geoPHP::load('MULTILINESTRING((10 10,20 20,10 40))','wkt');
+
$reduced_geometry = geoPHP::geometryReduce($geometry);
+ +

+ + Static Methods + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method + + Description + + Returns +
version Provides the current geoPHP version. Useful if you need to check compatablity Numeric String
load Load from an adapter format (like wkt) into a geometry. The first argument is the + data, the second one is the format of the data + ('wkt','wkb','json','kml','gpx','google_geocode'). All additional arguments are + passed along to the read method of the relevant adapte Geometry
getAdapterMap Get a list of adapters as an array keyed by the value that should be passed to + geoPHP::load Array
geometryList List all geometry types Array
geosToGeometry Given a GEOSGeometry, get a geoPHP geometry Geometry
geometryReduce Reduce a geometry, or an array of geometries, into their \'lowest\' available + common geometry. For example a GeometryCollection of only points will become a + MultiPoint, while a multi-point containing a single point will return a point. An + array of geometries can be passed and they will be compiled into a single geometry. Geometry
geosInstalled Check if the GEOS php extension is installed and working Boolean
+

+ + Adapters + +

+ +

Adapters are responsible for getting data in and out of geoPHP Geometries. Generally + you will use an adapter to load data into a geoPHP geometry, do various manipulations on + the geometry, then use another adapter to write it out to another (or the same) format. + You can also use adapters by themselves to simply do conversion from one format to + another (See example-format-converter for an example of this). Adapters should be instantiated + and not called statically.

+

+ + Class Hierarchy + +

+ +
    +
  • GeoAdapter Abtract Class
      +
    • WKT Enables reading and writing WKT (Well Known Text)
    • +
    • WKB Enables reading and writing WKB (Well Known Binary). This is very fast.
    • +
    • GeoJSON Enables reading and writing GeoJSON
    • +
    • KML Enables reading and writing KML (Google Earth)
    • +
    • GoogleGeocode Enables geocoding and reverse-geocoding via google geocoding + API
    • +
    • GPX Enables reading and writing GPX (from handheld GPS devices)
    • +
    • GeoRSS Enables reading and writing of GeoRSS
    • +
    +
  • +
+

+ + Example + +

+ +
$wkb_reader = new WKB();
+
$geometry = $wkb_reader->read('0101000000000000000000f03f000000000000f03f',TRUE);
+
$wkt_writer = new wkt();
+
$wkt = $wkt_writer->write($geometry);
+ +

+ + Methods + +

+ + + + + + + + + + + + + + + + + +
+ Method + + Description + + Returns +
read Read in input (generally a string) and return a Geometry Geometry
write Write out the given geometry into the adapter formater String
+

+ + Geometries + +

+ +

Geometries form the heart of the geoPHP library. Once you have loaded your data into a + Geometry object, you have access to all the various methods detailed below for doing + conversions, transformations, and operations. While generally you would use an adapter + to get a Geometry object, they can also be built by hand. See the constructor methods in + the classes to see how to do this. GEOS-php extension needs to be installed in order to + use some of the advanced methods (detailed below).

+

+ + Class Hierarchy + +

+ +
    +
  • Geometry
      +
    • Point
    • +
    • Collection
        +
      • LineString
      • +
      • Polygon
      • +
      • MultiLineString
      • +
      • MultiPoint
      • +
      • MultiPolygon
      • +
      • GeometryCollection
      • +
      +
    • +
    +
  • +
+

+ + Example + +

+ +
$poly1 = $geoPHP::load('POLYGON((30 10,10 20,20 40,40 40,30 10))','wkt');
+
$poly2 = $geoPHP::load('POLYGON((35 10,10 20,15 40,45 45,35 10),(20 30, 35 35, 30 20, 20 30))','wkt');
+
$combined_poly = $poly1->union($poly2);
+
$kml = $combined_poly->out('kml');
+ +

+ + Methods + +

+ +

+ Common Methods +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method + + Description + + Returns +
out Outputs the geometry into the specified adapter format. Available formats are + wkt, wkb, json, kml, gpx, google_geocode + String
area The area of this Polygon (or GeometryCollection), as measured in the spatial + reference system of the geometry Float
boundary Returns the closure of the combinatorial boundary of this geometric object. LinearRing
envelope The minimum bounding box for this Geometry, returned as a Geometry. Polygon
getBBox The minimum bounding box for this Geometry, returned as an array. Also see + envelope() Array
centroid The mathematical centroid for this geometry as a Point. For polygons, the result + is not guaranteed to be interior. Point
length The length of this Curve in its associated spatial reference. Float
y The y-coordinate value for this Point. Float
x The x-coordinate value for this Point. Float
numGeometries The number of component geometries in this collection Integer
geometryN Returns the geometry N in this collection. Note that the index starts at 1. Geometry
startPoint The start Point of this LineString Point
endPoint The end Point of this LineString Point
isRing Returns 1 (TRUE) if this Curve is closed() and this Curve isSimple(). Boolean
isClosed Returns 1 (TRUE) if this Curve is closed. StartPoint() == EndPoint(). Boolean
getComponents Get all sub-geometry components of the geometry Array of geometries
numPoints The number of Points in this LineString Integer
pointN Returns the specified Point N in this LineString. Note that the index starts at + 1. Point
exteriorRing Returns the exterior ring of this Polygon. LineString
numInteriorRings Returns the number of interior rings in this Polygon. Integer
interiorRingN Returns the Nth interior ring for this Polygon as a LineString. Note that the + index starts at 1. LineString
dimension The inherent dimension of this geometric object. In non-homogeneous collections, + this will return the largest topological dimension of the contained objects. Integer
geometryType Returns the name of the instantiable subtype of Geometry of which this geometric + object is an instantiable member. The name of the subtype of Geometry is returned as + a string. String
SRID Returns the Spatial Reference System ID for this geometric object. integer
setSRID Set the Spatial Reference System ID for this geometric object. NULL
asArray Get the given geometry as an array of components (recursive) Array
getGeoInterface Get the geometryType and Coordinates as an array Array
+

+ Aliases +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method + + Description + + Returns +
getCentroid Alias for centroid() Point
getArea Alias for area() Float
getX Alias for x() Float
getY Alias for y() Float
getGeos Alias for geos() GEOSGeometry
getGeomType Alias for geometryType() String
getSRID Alias for SRID() Integer
asText Alias for $this->out('wkt') + String
asBinary Alias for $this->out('wkb') + String
+

+ Advanced Methods +

+

The GEOS-php + extension needs to be installed for these functions to be available

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method + + Description + + Returns +
geos Return a GEOSGeometry object representing this geometry GEOSGeometry
setGeos Set a GEOSGeometry object representing this geometry NULL
pointOnSurface A Point guaranteed to be within a polygon Point
equals Returns 1 (TRUE) if this geometry is “spatially equal” to another Geometry Boolean
equalsExact Returns 1 (TRUE) if this gemometric object is exactly the same as another object, + including the ordering of component parts Boolean
relate Returns 1 (TRUE) if this geometric object is spatially related to anotherGeometry + by testing for intersections between the interior, boundary and exterior of the two + geometric objects as specified by the values in the intersectionPatternMatrix. This + returns FALSE if all the tested intersections are empty except exterior (this) + intersect exterior (another). Boolean
checkValidity Boolean
isSimple Returns 1 (TRUE) if this geometry does not pass through the same point in space + more than once Boolean
project Project the geometry from from one SRID to another Geometry
buffer Returns a geometric object that represents all Points whose distance from this + geometric object is less than or equal to distance. Calculations are in the spatial + reference system of this geometric object. Because of the limitations of linear + interpolation, there will often be some relatively small error in this distance, but + it should be near the resolution of the coordinates used. Geometry
intersection Returns a geometric object that represents the Point set intersection of this + geometric object with anotherGeometry. See http://en.wikipedia.org/wiki/Intersection_(set_theory) + Geometry
convexHull Returns a geometric object that represents the convex hull of this geometric + object. See http://en.wikipedia.org/wiki/Convex_hull + Geometry
difference Returns a geometric object that represents the Point set difference of this + geometric object with anotherGeometry. Geometry
symDifference Returns a geometric object that represents the Point set symmetric difference of + this geometric object with another Geometry. See http://en.wikipedia.org/wiki/Symmetric_difference + Geometry
union Returns a geometric object that represents the Point set union of this geometric + object with anotherGeometry. See http://en.wikipedia.org/wiki/Union_(set_theory) + Geometry
simplify Simplify the geometry Geometry
disjoint Returns 1 (TRUE) if this geometric object is “spatially disjoint” from another + Geometry. Boolean
touches Returns 1 (TRUE) if this geometric object “spatially touches” another Geometry. Boolean
intersects Returns 1 (TRUE) if this geometric object “spatially intersects” another + Geometry. Boolean
crosses Returns 1 (TRUE) if this geometric object “spatially crosses? another Geometry. Boolean
within Returns 1 (TRUE) if this geometric object is “spatially within” another Geometry. Boolean
contains Returns 1 (TRUE) if this geometric object “spatially contains” another Geometry. Boolean
overlaps Returns 1 (TRUE) if this geometric object “spatially overlaps” another Geometry. Boolean
covers Alias for contains() Boolean
coveredBy Alias for within() Boolean
distance Returns the shortest distance between any two Points in the two geometric objects + as calculated in the spatial reference system of this geometric object. Because the + geometries are closed, it is possible to find a point on each geometric object + involved, such that the distance between these 2 points is the returned distance + between their geometric objects. Float
hausdorffDistance See http://en.wikipedia.org/wiki/Hausdorff_distance + Float
+

+ Placeholders +

+

These methods are part of the specification, but are not really supported by geoPHP.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method + + Description + + Returns +
hasZ returns FALSE. geoPHP does not support Z values at the moment. Boolean
is3D returns FALSE. geoPHP does not support 3D geometries at the moment. Boolean
isMeasured returns FALSE. geoPHP does not yet support M values Boolean
isEmpty returns FALSE. geoPHP does not yet support empty geometries Boolean
coordinateDimension returns 2. geoPHP only supports 2-dimentional space Integer
z returns NULL. geoPHP does not support Z values at the moment NULL
m returns NULL. geoPHP does not support M values NULL
+
+
+
+
+
+ diff --git a/vendor/phayes/geophp/geoPHP.inc b/vendor/phayes/geophp/geoPHP.inc new file mode 100644 index 0000000..83a06a5 --- /dev/null +++ b/vendor/phayes/geophp/geoPHP.inc @@ -0,0 +1,301 @@ + 'WKT', + 'ewkt' => 'EWKT', + 'wkb' => 'WKB', + 'ewkb' => 'EWKB', + 'json' => 'GeoJSON', + 'geojson' => 'GeoJSON', + 'kml' => 'KML', + 'gpx' => 'GPX', + 'georss' => 'GeoRSS', + 'google_geocode' => 'GoogleGeocode', + 'geohash' => 'GeoHash', + ); + } + + static function geometryList() { + return array( + 'point' => 'Point', + 'linestring' => 'LineString', + 'polygon' => 'Polygon', + 'multipoint' => 'MultiPoint', + 'multilinestring' => 'MultiLineString', + 'multipolygon' => 'MultiPolygon', + 'geometrycollection' => 'GeometryCollection', + ); + } + + static function geosInstalled($force = NULL) { + static $geos_installed = NULL; + if ($force !== NULL) $geos_installed = $force; + if ($geos_installed !== NULL) { + return $geos_installed; + } + $geos_installed = class_exists('GEOSGeometry'); + return $geos_installed; + } + + static function geosToGeometry($geos) { + if (!geoPHP::geosInstalled()) { + return NULL; + } + $wkb_writer = new GEOSWKBWriter(); + $wkb = $wkb_writer->writeHEX($geos); + $geometry = geoPHP::load($wkb, 'wkb', TRUE); + if ($geometry) { + $geometry->setGeos($geos); + return $geometry; + } + } + + // Reduce a geometry, or an array of geometries, into their 'lowest' available common geometry. + // For example a GeometryCollection of only points will become a MultiPoint + // A multi-point containing a single point will return a point. + // An array of geometries can be passed and they will be compiled into a single geometry + static function geometryReduce($geometry) { + // If it's an array of one, then just parse the one + if (is_array($geometry)) { + if (empty($geometry)) return FALSE; + if (count($geometry) == 1) return geoPHP::geometryReduce(array_shift($geometry)); + } + + // If the geometry cannot even theoretically be reduced more, then pass it back + if (gettype($geometry) == 'object') { + $passbacks = array('Point','LineString','Polygon'); + if (in_array($geometry->geometryType(),$passbacks)) { + return $geometry; + } + } + + // If it is a mutlti-geometry, check to see if it just has one member + // If it does, then pass the member, if not, then just pass back the geometry + if (gettype($geometry) == 'object') { + $simple_collections = array('MultiPoint','MultiLineString','MultiPolygon'); + if (in_array(get_class($geometry),$passbacks)) { + $components = $geometry->getComponents(); + if (count($components) == 1) { + return $components[0]; + } + else { + return $geometry; + } + } + } + + // So now we either have an array of geometries, a GeometryCollection, or an array of GeometryCollections + if (!is_array($geometry)) { + $geometry = array($geometry); + } + + $geometries = array(); + $geom_types = array(); + + $collections = array('MultiPoint','MultiLineString','MultiPolygon','GeometryCollection'); + + foreach ($geometry as $item) { + if ($item) { + if (in_array(get_class($item), $collections)) { + foreach ($item->getComponents() as $component) { + $geometries[] = $component; + $geom_types[] = $component->geometryType(); + } + } + else { + $geometries[] = $item; + $geom_types[] = $item->geometryType(); + } + } + } + + $geom_types = array_unique($geom_types); + + if (empty($geom_types)) { + return FALSE; + } + + if (count($geom_types) == 1) { + if (count($geometries) == 1) { + return $geometries[0]; + } + else { + $class = 'Multi'.$geom_types[0]; + return new $class($geometries); + } + } + else { + return new GeometryCollection($geometries); + } + } + + // Detect a format given a value. This function is meant to be SPEEDY. + // It could make a mistake in XML detection if you are mixing or using namespaces in weird ways (ie, KML inside an RSS feed) + static function detectFormat(&$input) { + $mem = fopen('php://memory', 'r+'); + fwrite($mem, $input, 11); // Write 11 bytes - we can detect the vast majority of formats in the first 11 bytes + fseek($mem, 0); + + $bytes = unpack("c*", fread($mem, 11)); + + // If bytes is empty, then we were passed empty input + if (empty($bytes)) return FALSE; + + // First char is a tab, space or carriage-return. trim it and try again + if ($bytes[1] == 9 || $bytes[1] == 10 || $bytes[1] == 32) { + $ltinput = ltrim($input); + return geoPHP::detectFormat($ltinput); + } + + // Detect WKB or EWKB -- first byte is 1 (little endian indicator) + if ($bytes[1] == 1) { + // If SRID byte is TRUE (1), it's EWKB + if ($bytes[5]) return 'ewkb'; + else return 'wkb'; + } + + // Detect HEX encoded WKB or EWKB (PostGIS format) -- first byte is 48, second byte is 49 (hex '01' => first-byte = 1) + if ($bytes[1] == 48 && $bytes[2] == 49) { + // The shortest possible WKB string (LINESTRING EMPTY) is 18 hex-chars (9 encoded bytes) long + // This differentiates it from a geohash, which is always shorter than 18 characters. + if (strlen($input) >= 18) { + //@@TODO: Differentiate between EWKB and WKB -- check hex-char 10 or 11 (SRID bool indicator at encoded byte 5) + return 'ewkb:1'; + } + } + + // Detect GeoJSON - first char starts with { + if ($bytes[1] == 123) { + return 'json'; + } + + // Detect EWKT - first char is S + if ($bytes[1] == 83) { + return 'ewkt'; + } + + // Detect WKT - first char starts with P (80), L (76), M (77), or G (71) + $wkt_chars = array(80, 76, 77, 71); + if (in_array($bytes[1], $wkt_chars)) { + return 'wkt'; + } + + // Detect XML -- first char is < + if ($bytes[1] == 60) { + // grab the first 256 characters + $string = substr($input, 0, 256); + if (strpos($string, 'read($wkb); + + // If there is an SRID, add it to the geometry + if ($srid) { + $geom->setSRID($srid); + } + + return $geom; + } + + /** + * Serialize geometries into an EWKB binary string. + * + * @param Geometry $geometry + * + * @return string The Extended-WKB binary string representation of the input geometries + */ + public function write(Geometry $geometry, $write_as_hex = FALSE) { + // We always write into NDR (little endian) + $wkb = pack('c',1); + + switch ($geometry->getGeomType()) { + case 'Point'; + $wkb .= pack('L',1); + $wkb .= $this->writePoint($geometry); + break; + case 'LineString'; + $wkb .= pack('L',2); + $wkb .= $this->writeLineString($geometry); + break; + case 'Polygon'; + $wkb .= pack('L',3); + $wkb .= $this->writePolygon($geometry); + break; + case 'MultiPoint'; + $wkb .= pack('L',4); + $wkb .= $this->writeMulti($geometry); + break; + case 'MultiLineString'; + $wkb .= pack('L',5); + $wkb .= $this->writeMulti($geometry); + break; + case 'MultiPolygon'; + $wkb .= pack('L',6); + $wkb .= $this->writeMulti($geometry); + break; + case 'GeometryCollection'; + $wkb .= pack('L',7); + $wkb .= $this->writeMulti($geometry); + break; + } + + if ($write_as_hex) { + $unpacked = unpack('H*',$wkb); + return $unpacked[1]; + } + else { + return $wkb; + } + } + +} diff --git a/vendor/phayes/geophp/lib/adapters/EWKT.class.php b/vendor/phayes/geophp/lib/adapters/EWKT.class.php new file mode 100644 index 0000000..e94452b --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/EWKT.class.php @@ -0,0 +1,27 @@ +SRID(); + $wkt = ''; + if ($srid) { + $wkt = 'SRID=' . $srid . ';'; + $wkt .= $geometry->out('wkt'); + return $wkt; + } + else { + return $geometry->out('wkt'); + } + } +} diff --git a/vendor/phayes/geophp/lib/adapters/GPX.class.php b/vendor/phayes/geophp/lib/adapters/GPX.class.php new file mode 100644 index 0000000..9ca18b8 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/GPX.class.php @@ -0,0 +1,180 @@ +geomFromText($gpx); + } + + /** + * Serialize geometries into a GPX string. + * + * @param Geometry $geometry + * + * @return string The GPX string representation of the input geometries + */ + public function write(Geometry $geometry, $namespace = FALSE) { + if ($geometry->isEmpty()) return NULL; + if ($namespace) { + $this->namespace = $namespace; + $this->nss = $namespace.':'; + } + return '<'.$this->nss.'gpx creator="geoPHP" version="1.0">'.$this->geometryToGPX($geometry).'nss.'gpx>'; + } + + public function geomFromText($text) { + // Change to lower-case and strip all CDATA + $text = strtolower($text); + $text = preg_replace('//s','',$text); + + // Load into DOMDocument + $xmlobj = new DOMDocument(); + @$xmlobj->loadXML($text); + if ($xmlobj === false) { + throw new Exception("Invalid GPX: ". $text); + } + + $this->xmlobj = $xmlobj; + try { + $geom = $this->geomFromXML(); + } catch(InvalidText $e) { + throw new Exception("Cannot Read Geometry From GPX: ". $text); + } catch(Exception $e) { + throw $e; + } + + return $geom; + } + + protected function geomFromXML() { + $geometries = array(); + $geometries = array_merge($geometries, $this->parseWaypoints()); + $geometries = array_merge($geometries, $this->parseTracks()); + $geometries = array_merge($geometries, $this->parseRoutes()); + + if (empty($geometries)) { + throw new Exception("Invalid / Empty GPX"); + } + + return geoPHP::geometryReduce($geometries); + } + + protected function childElements($xml, $nodename = '') { + $children = array(); + foreach ($xml->childNodes as $child) { + if ($child->nodeName == $nodename) { + $children[] = $child; + } + } + return $children; + } + + protected function parseWaypoints() { + $points = array(); + $wpt_elements = $this->xmlobj->getElementsByTagName('wpt'); + foreach ($wpt_elements as $wpt) { + $lat = $wpt->attributes->getNamedItem("lat")->nodeValue; + $lon = $wpt->attributes->getNamedItem("lon")->nodeValue; + $points[] = new Point($lon, $lat); + } + return $points; + } + + protected function parseTracks() { + $lines = array(); + $trk_elements = $this->xmlobj->getElementsByTagName('trk'); + foreach ($trk_elements as $trk) { + $components = array(); + foreach ($this->childElements($trk, 'trkseg') as $trkseg) { + foreach ($this->childElements($trkseg, 'trkpt') as $trkpt) { + $lat = $trkpt->attributes->getNamedItem("lat")->nodeValue; + $lon = $trkpt->attributes->getNamedItem("lon")->nodeValue; + $components[] = new Point($lon, $lat); + } + } + if ($components) {$lines[] = new LineString($components);} + } + return $lines; + } + + protected function parseRoutes() { + $lines = array(); + $rte_elements = $this->xmlobj->getElementsByTagName('rte'); + foreach ($rte_elements as $rte) { + $components = array(); + foreach ($this->childElements($rte, 'rtept') as $rtept) { + $lat = $rtept->attributes->getNamedItem("lat")->nodeValue; + $lon = $rtept->attributes->getNamedItem("lon")->nodeValue; + $components[] = new Point($lon, $lat); + } + $lines[] = new LineString($components); + } + return $lines; + } + + protected function geometryToGPX($geom) { + $type = strtolower($geom->getGeomType()); + switch ($type) { + case 'point': + return $this->pointToGPX($geom); + break; + case 'linestring': + return $this->linestringToGPX($geom); + break; + case 'polygon': + case 'multipoint': + case 'multilinestring': + case 'multipolygon': + case 'geometrycollection': + return $this->collectionToGPX($geom); + break; + } + } + + private function pointToGPX($geom) { + return '<'.$this->nss.'wpt lat="'.$geom->getY().'" lon="'.$geom->getX().'" />'; + } + + private function linestringToGPX($geom) { + $gpx = '<'.$this->nss.'trk><'.$this->nss.'trkseg>'; + + foreach ($geom->getComponents() as $comp) { + $gpx .= '<'.$this->nss.'trkpt lat="'.$comp->getY().'" lon="'.$comp->getX().'" />'; + } + + $gpx .= 'nss.'trkseg>nss.'trk>'; + + return $gpx; + } + + public function collectionToGPX($geom) { + $gpx = ''; + $components = $geom->getComponents(); + foreach ($geom->getComponents() as $comp) { + $gpx .= $this->geometryToGPX($comp); + } + + return $gpx; + } + +} diff --git a/vendor/phayes/geophp/lib/adapters/GeoAdapter.class.php b/vendor/phayes/geophp/lib/adapters/GeoAdapter.class.php new file mode 100644 index 0000000..7217130 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/GeoAdapter.class.php @@ -0,0 +1,31 @@ + array ( + 'even' => 'p0r21436x8zb9dcf5h7kjnmqesgutwvy', + 'odd' => 'bc01fg45238967deuvhjyznpkmstqrwx' + ), + // east + 'right' => array ( + 'even' => 'bc01fg45238967deuvhjyznpkmstqrwx', + 'odd' => 'p0r21436x8zb9dcf5h7kjnmqesgutwvy' + ), + // west + 'left' => array ( + 'even' => '238967debc01fg45kmstqrwxuvhjyznp', + 'odd' => '14365h7k9dcfesgujnmqp0r2twvyx8zb' + ), + // south + 'bottom' => array ( + 'even' => '14365h7k9dcfesgujnmqp0r2twvyx8zb', + 'odd' => '238967debc01fg45kmstqrwxuvhjyznp' + ) + ); + + /** + * array of bordering hash character maps. + */ + private $borders = array ( + // north + 'top' => array ( + 'even' => 'prxz', + 'odd' => 'bcfguvyz' + ), + // east + 'right' => array ( + 'even' => 'bcfguvyz', + 'odd' => 'prxz' + ), + // west + 'left' => array ( + 'even' => '0145hjnp', + 'odd' => '028b' + ), + // south + 'bottom' => array ( + 'even' => '028b', + 'odd' => '0145hjnp' + ) + ); + + /** + * Convert the geohash to a Point. The point is 2-dimensional. + * @return Point the converted geohash + * @param string $hash a geohash + * @see GeoAdapter::read() + */ + public function read($hash, $as_grid = FALSE) { + $ll = $this->decode($hash); + if (!$as_grid) { + return new Point($ll['medlon'], $ll['medlat']); + } + else { + return new Polygon(array( + new LineString(array( + new Point($ll['minlon'], $ll['maxlat']), + new Point($ll['maxlon'], $ll['maxlat']), + new Point($ll['maxlon'], $ll['minlat']), + new Point($ll['minlon'], $ll['minlat']), + new Point($ll['minlon'], $ll['maxlat']), + )) + )); + } + } + + /** + * Convert the geometry to geohash. + * @return string the geohash or null when the $geometry is not a Point + * @param Point $geometry + * @see GeoAdapter::write() + */ + public function write(Geometry $geometry, $precision = NULL){ + if ($geometry->isEmpty()) return ''; + + if($geometry->geometryType() === 'Point'){ + return $this->encodePoint($geometry, $precision); + } + else { + // The geohash is the hash grid ID that fits the envelope + $envelope = $geometry->envelope(); + $geohashes = array(); + $geohash = ''; + foreach ($envelope->getPoints() as $point) { + $geohashes[] = $this->encodePoint($point, 0.0000001); + } + $i = 0; + while ($i < strlen($geohashes[0])) { + $char = $geohashes[0][$i]; + foreach ($geohashes as $hash) { + if ($hash[$i] != $char) { + return $geohash; + } + } + $geohash .= $char; + $i++; + } + return $geohash; + } + } + + /** + * @return string geohash + * @param Point $point + * @author algorithm based on code by Alexander Songe + * @see https://github.com/asonge/php-geohash/issues/1 + */ + private function encodePoint($point, $precision = NULL){ + if ($precision === NULL) { + $lap = strlen($point->y())-strpos($point->y(),"."); + $lop = strlen($point->x())-strpos($point->x(),"."); + $precision = pow(10,-max($lap-1,$lop-1,0))/2; + } + + $minlat = -90; + $maxlat = 90; + $minlon = -180; + $maxlon = 180; + $latE = 90; + $lonE = 180; + $i = 0; + $error = 180; + $hash=''; + while($error>=$precision) { + $chr = 0; + for($b=4;$b>=0;--$b) { + if((1&$b) == (1&$i)) { + // even char, even bit OR odd char, odd bit...a lon + $next = ($minlon+$maxlon)/2; + if($point->x()>$next) { + $chr |= pow(2,$b); + $minlon = $next; + } else { + $maxlon = $next; + } + $lonE /= 2; + } else { + // odd char, even bit OR even char, odd bit...a lat + $next = ($minlat+$maxlat)/2; + if($point->y()>$next) { + $chr |= pow(2,$b); + $minlat = $next; + } else { + $maxlat = $next; + } + $latE /= 2; + } + } + $hash .= $this->table[$chr]; + $i++; + $error = min($latE,$lonE); + } + return $hash; + } + + /** + * @param string $hash a geohash + * @author algorithm based on code by Alexander Songe + * @see https://github.com/asonge/php-geohash/issues/1 + */ + private function decode($hash){ + $ll = array(); + $minlat = -90; + $maxlat = 90; + $minlon = -180; + $maxlon = 180; + $latE = 90; + $lonE = 180; + for($i=0,$c=strlen($hash);$i<$c;$i++) { + $v = strpos($this->table,$hash[$i]); + if(1&$i) { + if(16&$v)$minlat = ($minlat+$maxlat)/2; else $maxlat = ($minlat+$maxlat)/2; + if(8&$v) $minlon = ($minlon+$maxlon)/2; else $maxlon = ($minlon+$maxlon)/2; + if(4&$v) $minlat = ($minlat+$maxlat)/2; else $maxlat = ($minlat+$maxlat)/2; + if(2&$v) $minlon = ($minlon+$maxlon)/2; else $maxlon = ($minlon+$maxlon)/2; + if(1&$v) $minlat = ($minlat+$maxlat)/2; else $maxlat = ($minlat+$maxlat)/2; + $latE /= 8; + $lonE /= 4; + } else { + if(16&$v)$minlon = ($minlon+$maxlon)/2; else $maxlon = ($minlon+$maxlon)/2; + if(8&$v) $minlat = ($minlat+$maxlat)/2; else $maxlat = ($minlat+$maxlat)/2; + if(4&$v) $minlon = ($minlon+$maxlon)/2; else $maxlon = ($minlon+$maxlon)/2; + if(2&$v) $minlat = ($minlat+$maxlat)/2; else $maxlat = ($minlat+$maxlat)/2; + if(1&$v) $minlon = ($minlon+$maxlon)/2; else $maxlon = ($minlon+$maxlon)/2; + $latE /= 4; + $lonE /= 8; + } + } + $ll['minlat'] = $minlat; + $ll['minlon'] = $minlon; + $ll['maxlat'] = $maxlat; + $ll['maxlon'] = $maxlon; + $ll['medlat'] = round(($minlat+$maxlat)/2, max(1, -round(log10($latE)))-1); + $ll['medlon'] = round(($minlon+$maxlon)/2, max(1, -round(log10($lonE)))-1); + return $ll; + } + + /** + * Calculates the adjacent geohash of the geohash in the specified direction. + * This algorithm is available in various ports that seem to point back to + * geohash-js by David Troy under MIT notice. + * + * + * @see https://github.com/davetroy/geohash-js + * @see https://github.com/lyokato/objc-geohash + * @see https://github.com/lyokato/libgeohash + * @see https://github.com/masuidrive/pr_geohash + * @see https://github.com/sunng87/node-geohash + * @see https://github.com/davidmoten/geo + * + * @param string $hash the geohash (lowercase) + * @param string $direction the direction of the neighbor (top, bottom, left or right) + * @return string the geohash of the adjacent cell + */ + public function adjacent($hash, $direction){ + $last = substr($hash, -1); + $type = (strlen($hash) % 2)? 'odd': 'even'; + $base = substr($hash, 0, strlen($hash) - 1); + if(strpos(($this->borders[$direction][$type]), $last) !== false){ + $base = $this->adjacent($base, $direction); + } + return $base.$this->table[strpos($this->neighbours[$direction][$type], $last)]; + } +} diff --git a/vendor/phayes/geophp/lib/adapters/GeoJSON.class.php b/vendor/phayes/geophp/lib/adapters/GeoJSON.class.php new file mode 100644 index 0000000..fa0a0e2 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/GeoJSON.class.php @@ -0,0 +1,155 @@ +type)) { + throw new Exception('Invalid JSON'); + } + + // Check to see if it's a FeatureCollection + if ($input->type == 'FeatureCollection') { + $geoms = array(); + foreach ($input->features as $feature) { + $geoms[] = $this->read($feature); + } + return geoPHP::geometryReduce($geoms); + } + + // Check to see if it's a Feature + if ($input->type == 'Feature') { + return $this->read($input->geometry); + } + + // It's a geometry - process it + return $this->objToGeom($input); + } + + private function objToGeom($obj) { + $type = $obj->type; + + if ($type == 'GeometryCollection') { + return $this->objToGeometryCollection($obj); + } + $method = 'arrayTo' . $type; + return $this->$method($obj->coordinates); + } + + private function arrayToPoint($array) { + if (!empty($array)) { + return new Point($array[0], $array[1]); + } + else { + return new Point(); + } + } + + private function arrayToLineString($array) { + $points = array(); + foreach ($array as $comp_array) { + $points[] = $this->arrayToPoint($comp_array); + } + return new LineString($points); + } + + private function arrayToPolygon($array) { + $lines = array(); + foreach ($array as $comp_array) { + $lines[] = $this->arrayToLineString($comp_array); + } + return new Polygon($lines); + } + + private function arrayToMultiPoint($array) { + $points = array(); + foreach ($array as $comp_array) { + $points[] = $this->arrayToPoint($comp_array); + } + return new MultiPoint($points); + } + + private function arrayToMultiLineString($array) { + $lines = array(); + foreach ($array as $comp_array) { + $lines[] = $this->arrayToLineString($comp_array); + } + return new MultiLineString($lines); + } + + private function arrayToMultiPolygon($array) { + $polys = array(); + foreach ($array as $comp_array) { + $polys[] = $this->arrayToPolygon($comp_array); + } + return new MultiPolygon($polys); + } + + private function objToGeometryCollection($obj) { + $geoms = array(); + if (empty($obj->geometries)) { + throw new Exception('Invalid GeoJSON: GeometryCollection with no component geometries'); + } + foreach ($obj->geometries as $comp_object) { + $geoms[] = $this->objToGeom($comp_object); + } + return new GeometryCollection($geoms); + } + + /** + * Serializes an object into a geojson string + * + * + * @param Geometry $obj The object to serialize + * + * @return string The GeoJSON string + */ + public function write(Geometry $geometry, $return_array = FALSE) { + if ($return_array) { + return $this->getArray($geometry); + } + else { + return json_encode($this->getArray($geometry)); + } + } + + public function getArray($geometry) { + if ($geometry->getGeomType() == 'GeometryCollection') { + $component_array = array(); + foreach ($geometry->components as $component) { + $component_array[] = array( + 'type' => $component->geometryType(), + 'coordinates' => $component->asArray(), + ); + } + return array( + 'type'=> 'GeometryCollection', + 'geometries'=> $component_array, + ); + } + else return array( + 'type'=> $geometry->getGeomType(), + 'coordinates'=> $geometry->asArray(), + ); + } +} + + diff --git a/vendor/phayes/geophp/lib/adapters/GeoRSS.class.php b/vendor/phayes/geophp/lib/adapters/GeoRSS.class.php new file mode 100644 index 0000000..8934b99 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/GeoRSS.class.php @@ -0,0 +1,244 @@ +geomFromText($gpx); + } + + /** + * Serialize geometries into a GeoRSS string. + * + * @param Geometry $geometry + * + * @return string The georss string representation of the input geometries + */ + public function write(Geometry $geometry, $namespace = FALSE) { + if ($namespace) { + $this->namespace = $namespace; + $this->nss = $namespace.':'; + } + return $this->geometryToGeoRSS($geometry); + } + + public function geomFromText($text) { + // Change to lower-case, strip all CDATA, and de-namespace + $text = strtolower($text); + $text = preg_replace('//s','',$text); + + // Load into DOMDOcument + $xmlobj = new DOMDocument(); + @$xmlobj->loadXML($text); + if ($xmlobj === false) { + throw new Exception("Invalid GeoRSS: ". $text); + } + + $this->xmlobj = $xmlobj; + try { + $geom = $this->geomFromXML(); + } catch(InvalidText $e) { + throw new Exception("Cannot Read Geometry From GeoRSS: ". $text); + } catch(Exception $e) { + throw $e; + } + + return $geom; + } + + protected function geomFromXML() { + $geometries = array(); + $geometries = array_merge($geometries, $this->parsePoints()); + $geometries = array_merge($geometries, $this->parseLines()); + $geometries = array_merge($geometries, $this->parsePolygons()); + $geometries = array_merge($geometries, $this->parseBoxes()); + $geometries = array_merge($geometries, $this->parseCircles()); + + if (empty($geometries)) { + throw new Exception("Invalid / Empty GeoRSS"); + } + + return geoPHP::geometryReduce($geometries); + } + + protected function getPointsFromCoords($string) { + $coords = array(); + + if (empty($string)) { + return $coords; + } + + $latlon = explode(' ',$string); + foreach ($latlon as $key => $item) { + if (!($key % 2)) { + // It's a latitude + $lat = $item; + } + else { + // It's a longitude + $lon = $item; + $coords[] = new Point($lon, $lat); + } + } + return $coords; + } + + protected function parsePoints() { + $points = array(); + $pt_elements = $this->xmlobj->getElementsByTagName('point'); + foreach ($pt_elements as $pt) { + if ($pt->hasChildNodes()) { + $point_array = $this->getPointsFromCoords(trim($pt->firstChild->nodeValue)); + } + if (!empty($point_array)) { + $points[] = $point_array[0]; + } + else { + $points[] = new Point(); + } + } + return $points; + } + + protected function parseLines() { + $lines = array(); + $line_elements = $this->xmlobj->getElementsByTagName('line'); + foreach ($line_elements as $line) { + $components = $this->getPointsFromCoords(trim($line->firstChild->nodeValue)); + $lines[] = new LineString($components); + } + return $lines; + } + + protected function parsePolygons() { + $polygons = array(); + $poly_elements = $this->xmlobj->getElementsByTagName('polygon'); + foreach ($poly_elements as $poly) { + if ($poly->hasChildNodes()) { + $points = $this->getPointsFromCoords(trim($poly->firstChild->nodeValue)); + $exterior_ring = new LineString($points); + $polygons[] = new Polygon(array($exterior_ring)); + } + else { + // It's an EMPTY polygon + $polygons[] = new Polygon(); + } + } + return $polygons; + } + + // Boxes are rendered into polygons + protected function parseBoxes() { + $polygons = array(); + $box_elements = $this->xmlobj->getElementsByTagName('box'); + foreach ($box_elements as $box) { + $parts = explode(' ',trim($box->firstChild->nodeValue)); + $components = array( + new Point($parts[3], $parts[2]), + new Point($parts[3], $parts[0]), + new Point($parts[1], $parts[0]), + new Point($parts[1], $parts[2]), + new Point($parts[3], $parts[2]), + ); + $exterior_ring = new LineString($components); + $polygons[] = new Polygon(array($exterior_ring)); + } + return $polygons; + } + + // Circles are rendered into points + // @@TODO: Add good support once we have circular-string geometry support + protected function parseCircles() { + $points = array(); + $circle_elements = $this->xmlobj->getElementsByTagName('circle'); + foreach ($circle_elements as $circle) { + $parts = explode(' ',trim($circle->firstChild->nodeValue)); + $points[] = new Point($parts[1], $parts[0]); + } + return $points; + } + + protected function geometryToGeoRSS($geom) { + $type = strtolower($geom->getGeomType()); + switch ($type) { + case 'point': + return $this->pointToGeoRSS($geom); + break; + case 'linestring': + return $this->linestringToGeoRSS($geom); + break; + case 'polygon': + return $this->PolygonToGeoRSS($geom); + break; + case 'multipoint': + case 'multilinestring': + case 'multipolygon': + case 'geometrycollection': + return $this->collectionToGeoRSS($geom); + break; + } + return $output; + } + + private function pointToGeoRSS($geom) { + $out = '<'.$this->nss.'point>'; + if (!$geom->isEmpty()) { + $out .= $geom->getY().' '.$geom->getX(); + } + $out .= 'nss.'point>'; + return $out; + } + + private function linestringToGeoRSS($geom) { + $output = '<'.$this->nss.'line>'; + foreach ($geom->getComponents() as $k => $point) { + $output .= $point->getY().' '.$point->getX(); + if ($k < ($geom->numGeometries() -1)) $output .= ' '; + } + $output .= 'nss.'line>'; + return $output; + } + + private function polygonToGeoRSS($geom) { + $output = '<'.$this->nss.'polygon>'; + $exterior_ring = $geom->exteriorRing(); + foreach ($exterior_ring->getComponents() as $k => $point) { + $output .= $point->getY().' '.$point->getX(); + if ($k < ($exterior_ring->numGeometries() -1)) $output .= ' '; + } + $output .= 'nss.'polygon>'; + return $output; + } + + public function collectionToGeoRSS($geom) { + $georss = '<'.$this->nss.'where>'; + $components = $geom->getComponents(); + foreach ($geom->getComponents() as $comp) { + $georss .= $this->geometryToGeoRSS($comp); + } + + $georss .= 'nss.'where>'; + + return $georss; + } + +} diff --git a/vendor/phayes/geophp/lib/adapters/GoogleGeocode.class.php b/vendor/phayes/geophp/lib/adapters/GoogleGeocode.class.php new file mode 100644 index 0000000..4b40870 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/GoogleGeocode.class.php @@ -0,0 +1,158 @@ + + * (c) Patrick Hayes + * + * This code is open-source and licenced under the Modified BSD License. + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * PHP Google Geocoder Adapter + * + * + * @package geoPHP + * @author Patrick Hayes + */ +class GoogleGeocode extends GeoAdapter +{ + + /** + * Read an address string or array geometry objects + * + * @param string - Address to geocode + * @param string - Type of Geometry to return. Can either be 'points' or 'bounds' (polygon) + * @param Geometry|bounds-array - Limit the search area to within this region. For example + * by default geocoding "Cairo" will return the location of Cairo Egypt. + * If you pass a polygon of illinois, it will return Cairo IL. + * @param return_multiple - Return all results in a multipoint or multipolygon + * @return Geometry|GeometryCollection + */ + public function read($address, $return_type = 'point', $bounds = FALSE, $return_multiple = FALSE) { + if (is_array($address)) $address = join(',', $address); + + if (gettype($bounds) == 'object') { + $bounds = $bounds->getBBox(); + } + if (gettype($bounds) == 'array') { + $bounds_string = '&bounds='.$bounds['miny'].','.$bounds['minx'].'|'.$bounds['maxy'].','.$bounds['maxx']; + } + else { + $bounds_string = ''; + } + + $url = "http://maps.googleapis.com/maps/api/geocode/json"; + $url .= '?address='. urlencode($address); + $url .= $bounds_string; + $url .= '&sensor=false'; + $this->result = json_decode(@file_get_contents($url)); + + if ($this->result->status == 'OK') { + if ($return_multiple == FALSE) { + if ($return_type == 'point') { + return $this->getPoint(); + } + if ($return_type == 'bounds' || $return_type == 'polygon') { + return $this->getPolygon(); + } + } + if ($return_multiple == TRUE) { + if ($return_type == 'point') { + $points = array(); + foreach ($this->result->results as $delta => $item) { + $points[] = $this->getPoint($delta); + } + return new MultiPoint($points); + } + if ($return_type == 'bounds' || $return_type == 'polygon') { + $polygons = array(); + foreach ($this->result->results as $delta => $item) { + $polygons[] = $this->getPolygon($delta); + } + return new MultiPolygon($polygons); + } + } + } + else { + if ($this->result->status) throw new Exception('Error in Google Geocoder: '.$this->result->status); + else throw new Exception('Unknown error in Google Geocoder'); + return FALSE; + } + } + + /** + * Serialize geometries into a WKT string. + * + * @param Geometry $geometry + * @param string $return_type Should be either 'string' or 'array' + * + * @return string Does a reverse geocode of the geometry + */ + public function write(Geometry $geometry, $return_type = 'string') { + $centroid = $geometry->getCentroid(); + $lat = $centroid->getY(); + $lon = $centroid->getX(); + + $url = "http://maps.googleapis.com/maps/api/geocode/json"; + $url .= '?latlng='.$lat.','.$lon; + $url .= '&sensor=false'; + $this->result = json_decode(@file_get_contents($url)); + + if ($this->result->status == 'OK') { + if ($return_type == 'string') { + return $this->result->results[0]->formatted_address; + } + if ($return_type == 'array') { + return $this->result->results[0]->address_components; + } + } + else { + if ($this->result->status) throw new Exception('Error in Google Reverse Geocoder: '.$this->result->status); + else throw new Exception('Unknown error in Google Reverse Geocoder'); + return FALSE; + } + } + + private function getPoint($delta = 0) { + $lat = $this->result->results[$delta]->geometry->location->lat; + $lon = $this->result->results[$delta]->geometry->location->lng; + return new Point($lon, $lat); + } + + private function getPolygon($delta = 0) { + $points = array ( + $this->getTopLeft($delta), + $this->getTopRight($delta), + $this->getBottomRight($delta), + $this->getBottomLeft($delta), + $this->getTopLeft($delta), + ); + $outer_ring = new LineString($points); + return new Polygon(array($outer_ring)); + } + + private function getTopLeft($delta = 0) { + $lat = $this->result->results[$delta]->geometry->bounds->northeast->lat; + $lon = $this->result->results[$delta]->geometry->bounds->southwest->lng; + return new Point($lon, $lat); + } + + private function getTopRight($delta = 0) { + $lat = $this->result->results[$delta]->geometry->bounds->northeast->lat; + $lon = $this->result->results[$delta]->geometry->bounds->northeast->lng; + return new Point($lon, $lat); + } + + private function getBottomLeft($delta = 0) { + $lat = $this->result->results[$delta]->geometry->bounds->southwest->lat; + $lon = $this->result->results[$delta]->geometry->bounds->southwest->lng; + return new Point($lon, $lat); + } + + private function getBottomRight($delta = 0) { + $lat = $this->result->results[$delta]->geometry->bounds->southwest->lat; + $lon = $this->result->results[$delta]->geometry->bounds->northeast->lng; + return new Point($lon, $lat); + } +} diff --git a/vendor/phayes/geophp/lib/adapters/KML.class.php b/vendor/phayes/geophp/lib/adapters/KML.class.php new file mode 100644 index 0000000..8be9f68 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/KML.class.php @@ -0,0 +1,272 @@ + + */ +class KML extends GeoAdapter +{ + private $namespace = FALSE; + private $nss = ''; // Name-space string. eg 'georss:' + + /** + * Read KML string into geometry objects + * + * @param string $kml A KML string + * + * @return Geometry|GeometryCollection + */ + public function read($kml) { + return $this->geomFromText($kml); + } + + /** + * Serialize geometries into a KML string. + * + * @param Geometry $geometry + * + * @return string The KML string representation of the input geometries + */ + public function write(Geometry $geometry, $namespace = FALSE) { + if ($namespace) { + $this->namespace = $namespace; + $this->nss = $namespace.':'; + } + return $this->geometryToKML($geometry); + } + + public function geomFromText($text) { + // Change to lower-case and strip all CDATA + $text = mb_strtolower($text, mb_detect_encoding($text)); + $text = preg_replace('//s','',$text); + + // Load into DOMDocument + $xmlobj = new DOMDocument(); + @$xmlobj->loadXML($text); + if ($xmlobj === false) { + throw new Exception("Invalid KML: ". $text); + } + + $this->xmlobj = $xmlobj; + try { + $geom = $this->geomFromXML(); + } catch(InvalidText $e) { + throw new Exception("Cannot Read Geometry From KML: ". $text); + } catch(Exception $e) { + throw $e; + } + + return $geom; + } + + protected function geomFromXML() { + $geometries = array(); + $geom_types = geoPHP::geometryList(); + $placemark_elements = $this->xmlobj->getElementsByTagName('placemark'); + if ($placemark_elements->length) { + foreach ($placemark_elements as $placemark) { + foreach ($placemark->childNodes as $child) { + // Node names are all the same, except for MultiGeometry, which maps to GeometryCollection + $node_name = $child->nodeName == 'multigeometry' ? 'geometrycollection' : $child->nodeName; + if (array_key_exists($node_name, $geom_types)) { + $function = 'parse'.$geom_types[$node_name]; + $geometries[] = $this->$function($child); + } + } + } + } + else { + // The document does not have a placemark, try to create a valid geometry from the root element + $node_name = $this->xmlobj->documentElement->nodeName == 'multigeometry' ? 'geometrycollection' : $this->xmlobj->documentElement->nodeName; + if (array_key_exists($node_name, $geom_types)) { + $function = 'parse'.$geom_types[$node_name]; + $geometries[] = $this->$function($this->xmlobj->documentElement); + } + } + return geoPHP::geometryReduce($geometries); + } + + protected function childElements($xml, $nodename = '') { + $children = array(); + if ($xml->childNodes) { + foreach ($xml->childNodes as $child) { + if ($child->nodeName == $nodename) { + $children[] = $child; + } + } + } + return $children; + } + + protected function parsePoint($xml) { + $coordinates = $this->_extractCoordinates($xml); + if (!empty($coordinates)) { + return new Point($coordinates[0][0],$coordinates[0][1]); + } + else { + return new Point(); + } + } + + protected function parseLineString($xml) { + $coordinates = $this->_extractCoordinates($xml); + $point_array = array(); + foreach ($coordinates as $set) { + $point_array[] = new Point($set[0],$set[1]); + } + return new LineString($point_array); + } + + protected function parsePolygon($xml) { + $components = array(); + + $outer_boundary_element_a = $this->childElements($xml, 'outerboundaryis'); + if (empty($outer_boundary_element_a)) { + return new Polygon(); // It's an empty polygon + } + $outer_boundary_element = $outer_boundary_element_a[0]; + $outer_ring_element_a = $this->childElements($outer_boundary_element, 'linearring'); + $outer_ring_element = $outer_ring_element_a[0]; + $components[] = $this->parseLineString($outer_ring_element); + + if (count($components) != 1) { + throw new Exception("Invalid KML"); + } + + $inner_boundary_element_a = $this->childElements($xml, 'innerboundaryis'); + if (count($inner_boundary_element_a)) { + foreach ($inner_boundary_element_a as $inner_boundary_element) { + foreach ($this->childElements($inner_boundary_element, 'linearring') as $inner_ring_element) { + $components[] = $this->parseLineString($inner_ring_element); + } + } + } + + return new Polygon($components); + } + + protected function parseGeometryCollection($xml) { + $components = array(); + $geom_types = geoPHP::geometryList(); + foreach ($xml->childNodes as $child) { + $nodeName = ($child->nodeName == 'linearring') ? 'linestring' : $child->nodeName; + if (array_key_exists($nodeName, $geom_types)) { + $function = 'parse'.$geom_types[$nodeName]; + $components[] = $this->$function($child); + } + } + return new GeometryCollection($components); + } + + protected function _extractCoordinates($xml) { + $coord_elements = $this->childElements($xml, 'coordinates'); + $coordinates = array(); + if (count($coord_elements)) { + $coord_sets = explode(' ', preg_replace('/[\r\n]+/', ' ', $coord_elements[0]->nodeValue)); + foreach ($coord_sets as $set_string) { + $set_string = trim($set_string); + if ($set_string) { + $set_array = explode(',',$set_string); + if (count($set_array) >= 2) { + $coordinates[] = $set_array; + } + } + } + } + + return $coordinates; + } + + private function geometryToKML($geom) { + $type = strtolower($geom->getGeomType()); + switch ($type) { + case 'point': + return $this->pointToKML($geom); + break; + case 'linestring': + return $this->linestringToKML($geom); + break; + case 'polygon': + return $this->polygonToKML($geom); + break; + case 'multipoint': + case 'multilinestring': + case 'multipolygon': + case 'geometrycollection': + return $this->collectionToKML($geom); + break; + } + } + + private function pointToKML($geom) { + $out = '<'.$this->nss.'Point>'; + if (!$geom->isEmpty()) { + $out .= '<'.$this->nss.'coordinates>'.$geom->getX().",".$geom->getY().'nss.'coordinates>'; + } + $out .= 'nss.'Point>'; + return $out; + } + + private function linestringToKML($geom, $type = FALSE) { + if (!$type) { + $type = $geom->getGeomType(); + } + + $str = '<'.$this->nss . $type .'>'; + + if (!$geom->isEmpty()) { + $str .= '<'.$this->nss.'coordinates>'; + $i=0; + foreach ($geom->getComponents() as $comp) { + if ($i != 0) $str .= ' '; + $str .= $comp->getX() .','. $comp->getY(); + $i++; + } + + $str .= 'nss.'coordinates>'; + } + + $str .= 'nss . $type .'>'; + + return $str; + } + + public function polygonToKML($geom) { + $components = $geom->getComponents(); + $str = ''; + if (!empty($components)) { + $str = '<'.$this->nss.'outerBoundaryIs>' . $this->linestringToKML($components[0], 'LinearRing') . 'nss.'outerBoundaryIs>'; + foreach (array_slice($components, 1) as $comp) { + $str .= '<'.$this->nss.'innerBoundaryIs>' . $this->linestringToKML($comp) . 'nss.'innerBoundaryIs>'; + } + } + + return '<'.$this->nss.'Polygon>'. $str .'nss.'Polygon>'; + } + + public function collectionToKML($geom) { + $components = $geom->getComponents(); + $str = '<'.$this->nss.'MultiGeometry>'; + foreach ($geom->getComponents() as $comp) { + $sub_adapter = new KML(); + $str .= $sub_adapter->write($comp); + } + + return $str .'nss.'MultiGeometry>'; + } + +} diff --git a/vendor/phayes/geophp/lib/adapters/WKB.class.php b/vendor/phayes/geophp/lib/adapters/WKB.class.php new file mode 100644 index 0000000..ebaff43 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/WKB.class.php @@ -0,0 +1,250 @@ +getGeometry($mem); + fclose($mem); + return $geometry; + } + + function getGeometry(&$mem) { + $base_info = unpack("corder/ctype/cz/cm/cs", fread($mem, 5)); + if ($base_info['order'] !== 1) { + throw new Exception('Only NDR (little endian) SKB format is supported at the moment'); + } + + if ($base_info['z']) { + $this->dimension++; + $this->z = TRUE; + } + if ($base_info['m']) { + $this->dimension++; + $this->m = TRUE; + } + + // If there is SRID information, ignore it - use EWKB Adapter to get SRID support + if ($base_info['s']) { + fread($mem, 4); + } + + switch ($base_info['type']) { + case 1: + return $this->getPoint($mem); + case 2: + return $this->getLinstring($mem); + case 3: + return $this->getPolygon($mem); + case 4: + return $this->getMulti($mem,'point'); + case 5: + return $this->getMulti($mem,'line'); + case 6: + return $this->getMulti($mem,'polygon'); + case 7: + return $this->getMulti($mem,'geometry'); + } + } + + function getPoint(&$mem) { + $point_coords = unpack("d*", fread($mem,$this->dimension*8)); + if (!empty($point_coords)) { + return new Point($point_coords[1],$point_coords[2]); + } + else { + return new Point(); // EMPTY point + } + } + + function getLinstring(&$mem) { + // Get the number of points expected in this string out of the first 4 bytes + $line_length = unpack('L',fread($mem,4)); + + // Return an empty linestring if there is no line-length + if (!$line_length[1]) return new LineString(); + + // Read the nubmer of points x2 (each point is two coords) into decimal-floats + $line_coords = unpack('d*', fread($mem,$line_length[1]*$this->dimension*8)); + + // We have our coords, build up the linestring + $components = array(); + $i = 1; + $num_coords = count($line_coords); + while ($i <= $num_coords) { + $components[] = new Point($line_coords[$i],$line_coords[$i+1]); + $i += 2; + } + return new LineString($components); + } + + function getPolygon(&$mem) { + // Get the number of linestring expected in this poly out of the first 4 bytes + $poly_length = unpack('L',fread($mem,4)); + + $components = array(); + $i = 1; + while ($i <= $poly_length[1]) { + $components[] = $this->getLinstring($mem); + $i++; + } + return new Polygon($components); + } + + function getMulti(&$mem, $type) { + // Get the number of items expected in this multi out of the first 4 bytes + $multi_length = unpack('L',fread($mem,4)); + + $components = array(); + $i = 1; + while ($i <= $multi_length[1]) { + $components[] = $this->getGeometry($mem); + $i++; + } + switch ($type) { + case 'point': + return new MultiPoint($components); + case 'line': + return new MultiLineString($components); + case 'polygon': + return new MultiPolygon($components); + case 'geometry': + return new GeometryCollection($components); + } + } + + /** + * Serialize geometries into WKB string. + * + * @param Geometry $geometry + * + * @return string The WKB string representation of the input geometries + */ + public function write(Geometry $geometry, $write_as_hex = FALSE) { + // We always write into NDR (little endian) + $wkb = pack('c',1); + + switch ($geometry->getGeomType()) { + case 'Point'; + $wkb .= pack('L',1); + $wkb .= $this->writePoint($geometry); + break; + case 'LineString'; + $wkb .= pack('L',2); + $wkb .= $this->writeLineString($geometry); + break; + case 'Polygon'; + $wkb .= pack('L',3); + $wkb .= $this->writePolygon($geometry); + break; + case 'MultiPoint'; + $wkb .= pack('L',4); + $wkb .= $this->writeMulti($geometry); + break; + case 'MultiLineString'; + $wkb .= pack('L',5); + $wkb .= $this->writeMulti($geometry); + break; + case 'MultiPolygon'; + $wkb .= pack('L',6); + $wkb .= $this->writeMulti($geometry); + break; + case 'GeometryCollection'; + $wkb .= pack('L',7); + $wkb .= $this->writeMulti($geometry); + break; + } + + if ($write_as_hex) { + $unpacked = unpack('H*',$wkb); + return $unpacked[1]; + } + else { + return $wkb; + } + } + + function writePoint($point) { + // Set the coords + if (!$point->isEmpty()) { + $wkb = pack('dd',$point->x(), $point->y()); + return $wkb; + } else { + return ''; + } + } + + function writeLineString($line) { + // Set the number of points in this line + $wkb = pack('L',$line->numPoints()); + + // Set the coords + foreach ($line->getComponents() as $point) { + $wkb .= pack('dd',$point->x(), $point->y()); + } + + return $wkb; + } + + function writePolygon($poly) { + // Set the number of lines in this poly + $wkb = pack('L',$poly->numGeometries()); + + // Write the lines + foreach ($poly->getComponents() as $line) { + $wkb .= $this->writeLineString($line); + } + + return $wkb; + } + + function writeMulti($geometry) { + // Set the number of components + $wkb = pack('L',$geometry->numGeometries()); + + // Write the components + foreach ($geometry->getComponents() as $component) { + $wkb .= $this->write($component); + } + + return $wkb; + } + +} diff --git a/vendor/phayes/geophp/lib/adapters/WKT.class.php b/vendor/phayes/geophp/lib/adapters/WKT.class.php new file mode 100644 index 0000000..c364644 --- /dev/null +++ b/vendor/phayes/geophp/lib/adapters/WKT.class.php @@ -0,0 +1,258 @@ +read($wkt)); + $geom->setSRID($srid); + return $geom; + } + else { + return geoPHP::geosToGeometry($reader->read($wkt)); + } + } + $wkt = str_replace(', ', ',', $wkt); + + // For each geometry type, check to see if we have a match at the + // beginning of the string. If we do, then parse using that type + foreach (geoPHP::geometryList() as $geom_type) { + $wkt_geom = strtoupper($geom_type); + if (strtoupper(substr($wkt, 0, strlen($wkt_geom))) == $wkt_geom) { + $data_string = $this->getDataString($wkt); + $method = 'parse'.$geom_type; + + if ($srid) { + $geom = $this->$method($data_string); + $geom->setSRID($srid); + return $geom; + } + else { + return $this->$method($data_string); + } + + } + } + } + + private function parsePoint($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty point + if ($data_string == 'EMPTY') return new Point(); + + $parts = explode(' ',$data_string); + return new Point($parts[0], $parts[1]); + } + + private function parseLineString($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty line + if ($data_string == 'EMPTY') return new LineString(); + + $parts = explode(',',$data_string); + $points = array(); + foreach ($parts as $part) { + $points[] = $this->parsePoint($part); + } + return new LineString($points); + } + + private function parsePolygon($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty polygon + if ($data_string == 'EMPTY') return new Polygon(); + + $parts = explode('),(',$data_string); + $lines = array(); + foreach ($parts as $part) { + if (!$this->beginsWith($part,'(')) $part = '(' . $part; + if (!$this->endsWith($part,')')) $part = $part . ')'; + $lines[] = $this->parseLineString($part); + } + return new Polygon($lines); + } + + private function parseMultiPoint($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty MutiPoint + if ($data_string == 'EMPTY') return new MultiPoint(); + + $parts = explode(',',$data_string); + $points = array(); + foreach ($parts as $part) { + $points[] = $this->parsePoint($part); + } + return new MultiPoint($points); + } + + private function parseMultiLineString($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty multi-linestring + if ($data_string == 'EMPTY') return new MultiLineString(); + + $parts = explode('),(',$data_string); + $lines = array(); + foreach ($parts as $part) { + // Repair the string if the explode broke it + if (!$this->beginsWith($part,'(')) $part = '(' . $part; + if (!$this->endsWith($part,')')) $part = $part . ')'; + $lines[] = $this->parseLineString($part); + } + return new MultiLineString($lines); + } + + private function parseMultiPolygon($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty multi-polygon + if ($data_string == 'EMPTY') return new MultiPolygon(); + + $parts = explode(')),((',$data_string); + $polys = array(); + foreach ($parts as $part) { + // Repair the string if the explode broke it + if (!$this->beginsWith($part,'((')) $part = '((' . $part; + if (!$this->endsWith($part,'))')) $part = $part . '))'; + $polys[] = $this->parsePolygon($part); + } + return new MultiPolygon($polys); + } + + private function parseGeometryCollection($data_string) { + $data_string = $this->trimParens($data_string); + + // If it's marked as empty, then return an empty geom-collection + if ($data_string == 'EMPTY') return new GeometryCollection(); + + $geometries = array(); + $matches = array(); + $str = preg_replace('/,\s*([A-Za-z])/', '|$1', $data_string); + $components = explode('|', trim($str)); + + foreach ($components as $component) { + $geometries[] = $this->read($component); + } + return new GeometryCollection($geometries); + } + + protected function getDataString($wkt) { + $first_paren = strpos($wkt, '('); + + if ($first_paren !== FALSE) { + return substr($wkt, $first_paren); + } elseif (strstr($wkt,'EMPTY')) { + return 'EMPTY'; + } else + return FALSE; + } + + /** + * Trim the parenthesis and spaces + */ + protected function trimParens($str) { + $str = trim($str); + + // We want to only strip off one set of parenthesis + if ($this->beginsWith($str, '(')) { + return substr($str,1,-1); + } + else return $str; + } + + protected function beginsWith($str, $char) { + if (substr($str,0,strlen($char)) == $char) return TRUE; + else return FALSE; + } + + protected function endsWith($str, $char) { + if (substr($str,(0 - strlen($char))) == $char) return TRUE; + else return FALSE; + } + + /** + * Serialize geometries into a WKT string. + * + * @param Geometry $geometry + * + * @return string The WKT string representation of the input geometries + */ + public function write(Geometry $geometry) { + // If geos is installed, then we take a shortcut and let it write the WKT + if (geoPHP::geosInstalled()) { + $writer = new GEOSWKTWriter(); + $writer->setTrim(TRUE); + return $writer->write($geometry->geos()); + } + + if ($geometry->isEmpty()) { + return strtoupper($geometry->geometryType()).' EMPTY'; + } + else if ($data = $this->extractData($geometry)) { + return strtoupper($geometry->geometryType()).' ('.$data.')'; + } + } + + /** + * Extract geometry to a WKT string + * + * @param Geometry $geometry A Geometry object + * + * @return string + */ + public function extractData($geometry) { + $parts = array(); + switch ($geometry->geometryType()) { + case 'Point': + return $geometry->getX().' '.$geometry->getY(); + case 'LineString': + foreach ($geometry->getComponents() as $component) { + $parts[] = $this->extractData($component); + } + return implode(', ', $parts); + case 'Polygon': + case 'MultiPoint': + case 'MultiLineString': + case 'MultiPolygon': + foreach ($geometry->getComponents() as $component) { + $parts[] = '('.$this->extractData($component).')'; + } + return implode(', ', $parts); + case 'GeometryCollection': + foreach ($geometry->getComponents() as $component) { + $parts[] = strtoupper($component->geometryType()).' ('.$this->extractData($component).')'; + } + return implode(', ', $parts); + } + } +} diff --git a/vendor/phayes/geophp/lib/geometry/Collection.class.php b/vendor/phayes/geophp/lib/geometry/Collection.class.php new file mode 100644 index 0000000..a97666c --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/Collection.class.php @@ -0,0 +1,294 @@ +components[] = $component; + } + else { + throw new Exception("Cannot create a collection with non-geometries"); + } + } + } + + /** + * Returns Collection component geometries + * + * @return array + */ + public function getComponents() { + return $this->components; + } + + public function centroid() { + if ($this->isEmpty()) return NULL; + + if ($this->geos()) { + $geos_centroid = $this->geos()->centroid(); + if ($geos_centroid->typeName() == 'Point') { + return geoPHP::geosToGeometry($this->geos()->centroid()); + } + } + + // As a rough estimate, we say that the centroid of a colletion is the centroid of it's envelope + // @@TODO: Make this the centroid of the convexHull + // Note: Outside of polygons, geometryCollections and the trivial case of points, there is no standard on what a "centroid" is + $centroid = $this->envelope()->centroid(); + + return $centroid; + } + + public function getBBox() { + if ($this->isEmpty()) return NULL; + + if ($this->geos()) { + $envelope = $this->geos()->envelope(); + if ($envelope->typeName() == 'Point') { + return geoPHP::geosToGeometry($envelope)->getBBOX(); + } + + $geos_ring = $envelope->exteriorRing(); + return array( + 'maxy' => $geos_ring->pointN(3)->getY(), + 'miny' => $geos_ring->pointN(1)->getY(), + 'maxx' => $geos_ring->pointN(1)->getX(), + 'minx' => $geos_ring->pointN(3)->getX(), + ); + } + + // Go through each component and get the max and min x and y + $i = 0; + foreach ($this->components as $component) { + $component_bbox = $component->getBBox(); + + // On the first run through, set the bbox to the component bbox + if ($i == 0) { + $maxx = $component_bbox['maxx']; + $maxy = $component_bbox['maxy']; + $minx = $component_bbox['minx']; + $miny = $component_bbox['miny']; + } + + // Do a check and replace on each boundary, slowly growing the bbox + $maxx = $component_bbox['maxx'] > $maxx ? $component_bbox['maxx'] : $maxx; + $maxy = $component_bbox['maxy'] > $maxy ? $component_bbox['maxy'] : $maxy; + $minx = $component_bbox['minx'] < $minx ? $component_bbox['minx'] : $minx; + $miny = $component_bbox['miny'] < $miny ? $component_bbox['miny'] : $miny; + $i++; + } + + return array( + 'maxy' => $maxy, + 'miny' => $miny, + 'maxx' => $maxx, + 'minx' => $minx, + ); + } + + public function asArray() { + $array = array(); + foreach ($this->components as $component) { + $array[] = $component->asArray(); + } + return $array; + } + + public function area() { + if ($this->geos()) { + return $this->geos()->area(); + } + + $area = 0; + foreach ($this->components as $component) { + $area += $component->area(); + } + return $area; + } + + // By default, the boundary of a collection is the boundary of it's components + public function boundary() { + if ($this->isEmpty()) return new LineString(); + + if ($this->geos()) { + return $this->geos()->boundary(); + } + + $components_boundaries = array(); + foreach ($this->components as $component) { + $components_boundaries[] = $component->boundary(); + } + return geoPHP::geometryReduce($components_boundaries); + } + + public function numGeometries() { + return count($this->components); + } + + // Note that the standard is 1 based indexing + public function geometryN($n) { + $n = intval($n); + if (array_key_exists($n-1, $this->components)) { + return $this->components[$n-1]; + } + else { + return NULL; + } + } + + public function length() { + $length = 0; + foreach ($this->components as $delta => $component) { + $length += $component->length(); + } + return $length; + } + + public function greatCircleLength($radius = 6378137) { + $length = 0; + foreach ($this->components as $component) { + $length += $component->greatCircleLength($radius); + } + return $length; + } + + public function haversineLength() { + $length = 0; + foreach ($this->components as $component) { + $length += $component->haversineLength(); + } + return $length; + } + + public function dimension() { + $dimension = 0; + foreach ($this->components as $component) { + if ($component->dimension() > $dimension) { + $dimension = $component->dimension(); + } + } + return $dimension; + } + + // A collection is empty if it has no components OR all it's components are empty + public function isEmpty() { + if (!count($this->components)) { + return TRUE; + } + else { + foreach ($this->components as $component) { + if (!$component->isEmpty()) return FALSE; + } + return TRUE; + } + } + + public function numPoints() { + $num = 0; + foreach ($this->components as $component) { + $num += $component->numPoints(); + } + return $num; + } + + public function getPoints() { + $points = array(); + foreach ($this->components as $component) { + $points = array_merge($points, $component->getPoints()); + } + return $points; + } + + public function equals($geometry) { + if ($this->geos()) { + return $this->geos()->equals($geometry->geos()); + } + + // To test for equality we check to make sure that there is a matching point + // in the other geometry for every point in this geometry. + // This is slightly more strict than the standard, which + // uses Within(A,B) = true and Within(B,A) = true + // @@TODO: Eventually we could fix this by using some sort of simplification + // method that strips redundant vertices (that are all in a row) + + $this_points = $this->getPoints(); + $other_points = $geometry->getPoints(); + + // First do a check to make sure they have the same number of vertices + if (count($this_points) != count($other_points)) { + return FALSE; + } + + foreach ($this_points as $point) { + $found_match = FALSE; + foreach ($other_points as $key => $test_point) { + if ($point->equals($test_point)) { + $found_match = TRUE; + unset($other_points[$key]); + break; + } + } + if (!$found_match) { + return FALSE; + } + } + + // All points match, return TRUE + return TRUE; + } + + public function isSimple() { + if ($this->geos()) { + return $this->geos()->isSimple(); + } + + // A collection is simple if all it's components are simple + foreach ($this->components as $component) { + if (!$component->isSimple()) return FALSE; + } + + return TRUE; + } + + public function explode() { + $parts = array(); + foreach ($this->components as $component) { + $parts = array_merge($parts, $component->explode()); + } + return $parts; + } + + // Not valid for this geometry type + // -------------------------------- + public function x() { return NULL; } + public function y() { return NULL; } + public function startPoint() { return NULL; } + public function endPoint() { return NULL; } + public function isRing() { return NULL; } + public function isClosed() { return NULL; } + public function pointN($n) { return NULL; } + public function exteriorRing() { return NULL; } + public function numInteriorRings() { return NULL; } + public function interiorRingN($n) { return NULL; } + public function pointOnSurface() { return NULL; } +} + diff --git a/vendor/phayes/geophp/lib/geometry/Geometry.class.php b/vendor/phayes/geophp/lib/geometry/Geometry.class.php new file mode 100644 index 0000000..2da2cd7 --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/Geometry.class.php @@ -0,0 +1,347 @@ +srid; + } + + public function setSRID($srid) { + if ($this->geos()) { + $this->geos()->setSRID($srid); + } + $this->srid = $srid; + } + + public function envelope() { + if ($this->isEmpty()) return new Polygon(); + + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->envelope()); + } + + $bbox = $this->getBBox(); + $points = array ( + new Point($bbox['maxx'],$bbox['miny']), + new Point($bbox['maxx'],$bbox['maxy']), + new Point($bbox['minx'],$bbox['maxy']), + new Point($bbox['minx'],$bbox['miny']), + new Point($bbox['maxx'],$bbox['miny']), + ); + + $outer_boundary = new LineString($points); + return new Polygon(array($outer_boundary)); + } + + public function geometryType() { + return $this->geom_type; + } + + // Public: Non-Standard -- Common to all geometries + // ------------------------------------------------ + + // $this->out($format, $other_args); + public function out() { + $args = func_get_args(); + + $format = array_shift($args); + $type_map = geoPHP::getAdapterMap(); + $processor_type = $type_map[$format]; + $processor = new $processor_type(); + + array_unshift($args, $this); + $result = call_user_func_array(array($processor, 'write'), $args); + + return $result; + } + + + // Public: Aliases + // --------------- + public function getCentroid() { + return $this->centroid(); + } + + public function getArea() { + return $this->area(); + } + + public function getX() { + return $this->x(); + } + + public function getY() { + return $this->y(); + } + + public function getGeos() { + return $this->geos(); + } + + public function getGeomType() { + return $this->geometryType(); + } + + public function getSRID() { + return $this->SRID(); + } + + public function asText() { + return $this->out('wkt'); + } + + public function asBinary() { + return $this->out('wkb'); + } + + // Public: GEOS Only Functions + // --------------------------- + public function geos() { + // If it's already been set, just return it + if ($this->geos && geoPHP::geosInstalled()) { + return $this->geos; + } + // It hasn't been set yet, generate it + if (geoPHP::geosInstalled()) { + $reader = new GEOSWKBReader(); + $this->geos = $reader->readHEX($this->out('wkb',TRUE)); + } + else { + $this->geos = FALSE; + } + return $this->geos; + } + + public function setGeos($geos) { + $this->geos = $geos; + } + + public function pointOnSurface() { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->pointOnSurface()); + } + } + + public function equalsExact(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->equalsExact($geometry->geos()); + } + } + + public function relate(Geometry $geometry, $pattern = NULL) { + if ($this->geos()) { + if ($pattern) { + return $this->geos()->relate($geometry->geos(), $pattern); + } + else { + return $this->geos()->relate($geometry->geos()); + } + } + } + + public function checkValidity() { + if ($this->geos()) { + return $this->geos()->checkValidity(); + } + } + + public function buffer($distance) { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->buffer($distance)); + } + } + + public function intersection(Geometry $geometry) { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->intersection($geometry->geos())); + } + } + + public function convexHull() { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->convexHull()); + } + } + + public function difference(Geometry $geometry) { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->difference($geometry->geos())); + } + } + + public function symDifference(Geometry $geometry) { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->symDifference($geometry->geos())); + } + } + + // Can pass in a geometry or an array of geometries + public function union(Geometry $geometry) { + if ($this->geos()) { + if (is_array($geometry)) { + $geom = $this->geos(); + foreach ($geometry as $item) { + $geom = $geom->union($item->geos()); + } + return geoPHP::geosToGeometry($geom); + } + else { + return geoPHP::geosToGeometry($this->geos()->union($geometry->geos())); + } + } + } + + public function simplify($tolerance, $preserveTopology = FALSE) { + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->simplify($tolerance, $preserveTopology)); + } + } + + public function disjoint(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->disjoint($geometry->geos()); + } + } + + public function touches(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->touches($geometry->geos()); + } + } + + public function intersects(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->intersects($geometry->geos()); + } + } + + public function crosses(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->crosses($geometry->geos()); + } + } + + public function within(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->within($geometry->geos()); + } + } + + public function contains(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->contains($geometry->geos()); + } + } + + public function overlaps(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->overlaps($geometry->geos()); + } + } + + public function covers(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->covers($geometry->geos()); + } + } + + public function coveredBy(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->coveredBy($geometry->geos()); + } + } + + public function distance(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->distance($geometry->geos()); + } + } + + public function hausdorffDistance(Geometry $geometry) { + if ($this->geos()) { + return $this->geos()->hausdorffDistance($geometry->geos()); + } + } + + public function project(Geometry $point, $normalized = NULL) { + if ($this->geos()) { + return $this->geos()->project($point->geos(), $normalized); + } + } + + // Public - Placeholders + // --------------------- + public function hasZ() { + // geoPHP does not support Z values at the moment + return FALSE; + } + + public function is3D() { + // geoPHP does not support 3D geometries at the moment + return FALSE; + } + + public function isMeasured() { + // geoPHP does not yet support M values + return FALSE; + } + + public function coordinateDimension() { + // geoPHP only supports 2-dimensional space + return 2; + } + + public function z() { + // geoPHP only supports 2-dimensional space + return NULL; + } + + public function m() { + // geoPHP only supports 2-dimensional space + return NULL; + } + +} diff --git a/vendor/phayes/geophp/lib/geometry/GeometryCollection.class.php b/vendor/phayes/geophp/lib/geometry/GeometryCollection.class.php new file mode 100644 index 0000000..4d71119 --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/GeometryCollection.class.php @@ -0,0 +1,29 @@ +components as $component) { + $array[] = array( + 'type' => $component->geometryType(), + 'components' => $component->asArray(), + ); + } + return $array; + } + + // Not valid for this geomettry + public function boundary() { return NULL; } + public function isSimple() { return NULL; } +} + diff --git a/vendor/phayes/geophp/lib/geometry/LineString.class.php b/vendor/phayes/geophp/lib/geometry/LineString.class.php new file mode 100644 index 0000000..bef082c --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/LineString.class.php @@ -0,0 +1,190 @@ +pointN(1); + } + + public function endPoint() { + $last_n = $this->numPoints(); + return $this->pointN($last_n); + } + + public function isClosed() { + return ($this->startPoint()->equals($this->endPoint())); + } + + public function isRing() { + return ($this->isClosed() && $this->isSimple()); + } + + public function numPoints() { + return $this->numGeometries(); + } + + public function pointN($n) { + return $this->geometryN($n); + } + + public function dimension() { + if ($this->isEmpty()) return 0; + return 1; + } + + public function area() { + return 0; + } + + public function length() { + if ($this->geos()) { + return $this->geos()->length(); + } + $length = 0; + foreach ($this->getPoints() as $delta => $point) { + $previous_point = $this->geometryN($delta); + if ($previous_point) { + $length += sqrt(pow(($previous_point->getX() - $point->getX()), 2) + pow(($previous_point->getY()- $point->getY()), 2)); + } + } + return $length; + } + + public function greatCircleLength($radius = 6378137) { + $length = 0; + $points = $this->getPoints(); + for($i=0; $i<$this->numPoints()-1; $i++) { + $point = $points[$i]; + $next_point = $points[$i+1]; + if (!is_object($next_point)) {continue;} + // Great circle method + $lat1 = deg2rad($point->getY()); + $lat2 = deg2rad($next_point->getY()); + $lon1 = deg2rad($point->getX()); + $lon2 = deg2rad($next_point->getX()); + $dlon = $lon2 - $lon1; + $length += + $radius * + atan2( + sqrt( + pow(cos($lat2) * sin($dlon), 2) + + pow(cos($lat1) * sin($lat2) - sin($lat1) * cos($lat2) * cos($dlon), 2) + ) + , + sin($lat1) * sin($lat2) + + cos($lat1) * cos($lat2) * cos($dlon) + ); + } + // Returns length in meters. + return $length; + } + + public function haversineLength() { + $degrees = 0; + $points = $this->getPoints(); + for($i=0; $i<$this->numPoints()-1; $i++) { + $point = $points[$i]; + $next_point = $points[$i+1]; + if (!is_object($next_point)) {continue;} + $degree = rad2deg( + acos( + sin(deg2rad($point->getY())) * sin(deg2rad($next_point->getY())) + + cos(deg2rad($point->getY())) * cos(deg2rad($next_point->getY())) * + cos(deg2rad(abs($point->getX() - $next_point->getX()))) + ) + ); + $degrees += $degree; + } + // Returns degrees + return $degrees; + } + + public function explode() { + $parts = array(); + $points = $this->getPoints(); + + foreach ($points as $i => $point) { + if (isset($points[$i+1])) { + $parts[] = new LineString(array($point, $points[$i+1])); + } + } + return $parts; + } + + public function isSimple() { + if ($this->geos()) { + return $this->geos()->isSimple(); + } + + $segments = $this->explode(); + + foreach ($segments as $i => $segment) { + foreach ($segments as $j => $check_segment) { + if ($i != $j) { + if ($segment->lineSegmentIntersect($check_segment)) { + return FALSE; + } + } + } + } + return TRUE; + } + + // Utility function to check if any line sigments intersect + // Derived from http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect + public function lineSegmentIntersect($segment) { + $p0_x = $this->startPoint()->x(); + $p0_y = $this->startPoint()->y(); + $p1_x = $this->endPoint()->x(); + $p1_y = $this->endPoint()->y(); + $p2_x = $segment->startPoint()->x(); + $p2_y = $segment->startPoint()->y(); + $p3_x = $segment->endPoint()->x(); + $p3_y = $segment->endPoint()->y(); + + $s1_x = $p1_x - $p0_x; $s1_y = $p1_y - $p0_y; + $s2_x = $p3_x - $p2_x; $s2_y = $p3_y - $p2_y; + + $fps = (-$s2_x * $s1_y) + ($s1_x * $s2_y); + $fpt = (-$s2_x * $s1_y) + ($s1_x * $s2_y); + + if ($fps == 0 || $fpt == 0) { + return FALSE; + } + + $s = (-$s1_y * ($p0_x - $p2_x) + $s1_x * ($p0_y - $p2_y)) / $fps; + $t = ( $s2_x * ($p0_y - $p2_y) - $s2_y * ($p0_x - $p2_x)) / $fpt; + + if ($s > 0 && $s < 1 && $t > 0 && $t < 1) { + // Collision detected + return TRUE; + } + return FALSE; + } +} + diff --git a/vendor/phayes/geophp/lib/geometry/MultiLineString.class.php b/vendor/phayes/geophp/lib/geometry/MultiLineString.class.php new file mode 100644 index 0000000..3ab085a --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/MultiLineString.class.php @@ -0,0 +1,20 @@ +components as $line) { + if (!$line->isClosed()) { + return FALSE; + } + } + return TRUE; + } + +} + diff --git a/vendor/phayes/geophp/lib/geometry/MultiPoint.class.php b/vendor/phayes/geophp/lib/geometry/MultiPoint.class.php new file mode 100644 index 0000000..5b52736 --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/MultiPoint.class.php @@ -0,0 +1,21 @@ +numGeometries(); + } + + public function isSimple() { + return TRUE; + } + + // Not valid for this geometry type + // -------------------------------- + public function explode() { return NULL; } +} + diff --git a/vendor/phayes/geophp/lib/geometry/MultiPolygon.class.php b/vendor/phayes/geophp/lib/geometry/MultiPolygon.class.php new file mode 100644 index 0000000..c0fdbe0 --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/MultiPolygon.class.php @@ -0,0 +1,8 @@ +coords = array(NULL, NULL); + $this->dimension = 0; + return; + } + + // Basic validation on x and y + if (!is_numeric($x) || !is_numeric($y)) { + throw new Exception("Cannot construct Point. x and y should be numeric"); + } + + // Check to see if this is a 3D point + if ($z !== NULL) { + if (!is_numeric($z)) { + throw new Exception("Cannot construct Point. z should be numeric"); + } + $this->dimension = 3; + } + + // Convert to floatval in case they are passed in as a string or integer etc. + $x = floatval($x); + $y = floatval($y); + $z = floatval($z); + + // Add poitional elements + if ($this->dimension == 2) { + $this->coords = array($x, $y); + } + if ($this->dimension == 3) { + $this->coords = array($x, $y, $z); + } + } + + /** + * Get X (longitude) coordinate + * + * @return float The X coordinate + */ + public function x() { + return $this->coords[0]; + } + + /** + * Returns Y (latitude) coordinate + * + * @return float The Y coordinate + */ + public function y() { + return $this->coords[1]; + } + + /** + * Returns Z (altitude) coordinate + * + * @return float The Z coordinate or NULL is not a 3D point + */ + public function z() { + if ($this->dimension == 3) { + return $this->coords[2]; + } + else return NULL; + } + + // A point's centroid is itself + public function centroid() { + return $this; + } + + public function getBBox() { + return array( + 'maxy' => $this->getY(), + 'miny' => $this->getY(), + 'maxx' => $this->getX(), + 'minx' => $this->getX(), + ); + } + + public function asArray($assoc = FALSE) { + return $this->coords; + } + + public function area() { + return 0; + } + + public function length() { + return 0; + } + + public function greatCircleLength() { + return 0; + } + + public function haversineLength() { + return 0; + } + + // The boundary of a point is itself + public function boundary() { + return $this; + } + + public function dimension() { + return 0; + } + + public function isEmpty() { + if ($this->dimension == 0) { + return TRUE; + } + else { + return FALSE; + } + } + + public function numPoints() { + return 1; + } + + public function getPoints() { + return array($this); + } + + public function equals($geometry) { + if (get_class($geometry) != 'Point') { + return FALSE; + } + if (!$this->isEmpty() && !$geometry->isEmpty()) { + return ($this->x() == $geometry->x() && $this->y() == $geometry->y()); + } + else if ($this->isEmpty() && $geometry->isEmpty()) { + return TRUE; + } + else { + return FALSE; + } + } + + public function isSimple() { + return TRUE; + } + + // Not valid for this geometry type + public function numGeometries() { return NULL; } + public function geometryN($n) { return NULL; } + public function startPoint() { return NULL; } + public function endPoint() { return NULL; } + public function isRing() { return NULL; } + public function isClosed() { return NULL; } + public function pointN($n) { return NULL; } + public function exteriorRing() { return NULL; } + public function numInteriorRings() { return NULL; } + public function interiorRingN($n) { return NULL; } + public function pointOnSurface() { return NULL; } + public function explode() { return NULL; } +} + diff --git a/vendor/phayes/geophp/lib/geometry/Polygon.class.php b/vendor/phayes/geophp/lib/geometry/Polygon.class.php new file mode 100644 index 0000000..f930b18 --- /dev/null +++ b/vendor/phayes/geophp/lib/geometry/Polygon.class.php @@ -0,0 +1,215 @@ +exteriorRing(); + } + + public function area($exterior_only = FALSE, $signed = FALSE) { + if ($this->isEmpty()) return 0; + + if ($this->geos() && $exterior_only == FALSE) { + return $this->geos()->area(); + } + + $exterior_ring = $this->components[0]; + $pts = $exterior_ring->getComponents(); + + $c = count($pts); + if((int)$c == '0') return NULL; + $a = '0'; + foreach($pts as $k => $p){ + $j = ($k + 1) % $c; + $a = $a + ($p->getX() * $pts[$j]->getY()) - ($p->getY() * $pts[$j]->getX()); + } + + if ($signed) $area = ($a / 2); + else $area = abs(($a / 2)); + + if ($exterior_only == TRUE) { + return $area; + } + foreach ($this->components as $delta => $component) { + if ($delta != 0) { + $inner_poly = new Polygon(array($component)); + $area -= $inner_poly->area(); + } + } + return $area; + } + + public function centroid() { + if ($this->isEmpty()) return NULL; + + if ($this->geos()) { + return geoPHP::geosToGeometry($this->geos()->centroid()); + } + + $exterior_ring = $this->components[0]; + $pts = $exterior_ring->getComponents(); + + $c = count($pts); + if((int)$c == '0') return NULL; + $cn = array('x' => '0', 'y' => '0'); + $a = $this->area(TRUE, TRUE); + + // If this is a polygon with no area. Just return the first point. + if ($a == 0) { + return $this->exteriorRing()->pointN(1); + } + + foreach($pts as $k => $p){ + $j = ($k + 1) % $c; + $P = ($p->getX() * $pts[$j]->getY()) - ($p->getY() * $pts[$j]->getX()); + $cn['x'] = $cn['x'] + ($p->getX() + $pts[$j]->getX()) * $P; + $cn['y'] = $cn['y'] + ($p->getY() + $pts[$j]->getY()) * $P; + } + + $cn['x'] = $cn['x'] / ( 6 * $a); + $cn['y'] = $cn['y'] / ( 6 * $a); + + $centroid = new Point($cn['x'], $cn['y']); + return $centroid; + } + + /** + * Find the outermost point from the centroid + * + * @returns Point The outermost point + */ + public function outermostPoint() { + $centroid = $this->getCentroid(); + + $max = array('length' => 0, 'point' => null); + + foreach($this->getPoints() as $point) { + $lineString = new LineString(array($centroid, $point)); + + if($lineString->length() > $max['length']) { + $max['length'] = $lineString->length(); + $max['point'] = $point; + } + } + + return $max['point']; + } + + public function exteriorRing() { + if ($this->isEmpty()) return new LineString(); + return $this->components[0]; + } + + public function numInteriorRings() { + if ($this->isEmpty()) return 0; + return $this->numGeometries()-1; + } + + public function interiorRingN($n) { + return $this->geometryN($n+1); + } + + public function dimension() { + if ($this->isEmpty()) return 0; + return 2; + } + + public function isSimple() { + if ($this->geos()) { + return $this->geos()->isSimple(); + } + + $segments = $this->explode(); + + foreach ($segments as $i => $segment) { + foreach ($segments as $j => $check_segment) { + if ($i != $j) { + if ($segment->lineSegmentIntersect($check_segment)) { + return FALSE; + } + } + } + } + return TRUE; + } + + /** + * For a given point, determine whether it's bounded by the given polygon. + * Adapted from http://www.assemblysys.com/dataServices/php_pointinpolygon.php + * @see http://en.wikipedia.org/wiki/Point%5Fin%5Fpolygon + * + * @param Point $point + * @param boolean $pointOnBoundary - whether a boundary should be considered "in" or not + * @param boolean $pointOnVertex - whether a vertex should be considered "in" or not + * @return boolean + */ + public function pointInPolygon($point, $pointOnBoundary = true, $pointOnVertex = true) { + $vertices = $this->getPoints(); + + // Check if the point sits exactly on a vertex + if ($this->pointOnVertex($point, $vertices)) { + return $pointOnVertex ? TRUE : FALSE; + } + + // Check if the point is inside the polygon or on the boundary + $intersections = 0; + $vertices_count = count($vertices); + + for ($i=1; $i < $vertices_count; $i++) { + $vertex1 = $vertices[$i-1]; + $vertex2 = $vertices[$i]; + if ($vertex1->y() == $vertex2->y() + && $vertex1->y() == $point->y() + && $point->x() > min($vertex1->x(), $vertex2->x()) + && $point->x() < max($vertex1->x(), $vertex2->x())) { + // Check if point is on an horizontal polygon boundary + return $pointOnBoundary ? TRUE : FALSE; + } + if ($point->y() > min($vertex1->y(), $vertex2->y()) + && $point->y() <= max($vertex1->y(), $vertex2->y()) + && $point->x() <= max($vertex1->x(), $vertex2->x()) + && $vertex1->y() != $vertex2->y()) { + $xinters = + ($point->y() - $vertex1->y()) * ($vertex2->x() - $vertex1->x()) + / ($vertex2->y() - $vertex1->y()) + + $vertex1->x(); + if ($xinters == $point->x()) { + // Check if point is on the polygon boundary (other than horizontal) + return $pointOnBoundary ? TRUE : FALSE; + } + if ($vertex1->x() == $vertex2->x() || $point->x() <= $xinters) { + $intersections++; + } + } + } + // If the number of edges we passed through is even, then it's in the polygon. + if ($intersections % 2 != 0) { + return TRUE; + } + else { + return FALSE; + } + } + + public function pointOnVertex($point) { + foreach($this->getPoints() as $vertex) { + if ($point->equals($vertex)) { + return true; + } + } + } + + + // Not valid for this geometry type + // -------------------------------- + public function length() { return NULL; } + +} + diff --git a/vendor/phayes/geophp/tests/input/20120702.gpx b/vendor/phayes/geophp/tests/input/20120702.gpx new file mode 100644 index 0000000..5d655f3 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/20120702.gpx @@ -0,0 +1,11462 @@ + + + + ACTIVE LOG195540 + + + 49.734 + + + + 49.734 + + + + 49.668 + + + + 49.565 + + + + 49.829 + + + + 49.462 + + + + 50.291 + + + + 50.389 + + + + 50.556 + + + + 50.064 + + + + 50.011 + + + + 49.890 + + + + 50.022 + + + + 49.919 + + + + 49.837 + + + + 49.736 + + + + 49.964 + + + + 50.046 + + + + 49.990 + + + + 50.069 + + + + 50.201 + + + + 50.130 + + + + 50.201 + + + + 50.225 + + + + 50.127 + + + + 50.175 + + + + 50.122 + + + + 50.088 + + + + 49.956 + + + + + + ACTIVE LOG195605 + + + 49.956 + + + + 49.847 + + + + 50.035 + + + + 49.879 + + + + 50.003 + + + + 50.582 + + + + + + ACTIVE LOG195613 + + + 50.154 + + + + 50.154 + + + + 50.141 + + + + 49.948 + + + + 49.728 + + + + 49.879 + + + + 50.164 + + + + 49.916 + + + + 49.821 + + + + 49.184 + + + + 49.993 + + + + 49.850 + + + + 49.631 + + + + 49.620 + + + + 49.702 + + + + 49.546 + + + + 49.348 + + + + 49.216 + + + + 49.427 + + + + 49.470 + + + + 49.427 + + + + 49.438 + + + + 49.549 + + + + 49.332 + + + + 49.319 + + + + 49.543 + + + + 49.538 + + + + 49.528 + + + + 49.765 + + + + 49.842 + + + + 49.660 + + + + 49.691 + + + + 49.615 + + + + 49.710 + + + + 49.669 + + + + 49.609 + + + + 49.705 + + + + 49.727 + + + + 49.841 + + + + 49.684 + + + + 49.801 + + + + 49.693 + + + + 49.596 + + + + 49.637 + + + + 49.683 + + + + 49.641 + + + + 49.708 + + + + 49.643 + + + + 49.512 + + + + 49.714 + + + + 49.672 + + + + 49.708 + + + + 49.661 + + + + 49.709 + + + + 49.620 + + + + 49.619 + + + + 49.675 + + + + 49.673 + + + + 49.817 + + + + 49.699 + + + + 49.689 + + + + 49.706 + + + + 49.739 + + + + 49.795 + + + + 49.769 + + + + 49.773 + + + + 49.755 + + + + 49.566 + + + + 49.374 + + + + 49.570 + + + + 49.421 + + + + 49.462 + + + + 49.278 + + + + 49.129 + + + + 48.656 + + + + 48.488 + + + + 48.373 + + + + 48.140 + + + + 48.170 + + + + 48.182 + + + + 47.814 + + + + 47.728 + + + + 47.629 + + + + 47.640 + + + + 47.327 + + + + 47.032 + + + + 46.972 + + + + 46.936 + + + + 47.212 + + + + 47.660 + + + + 47.513 + + + + 47.549 + + + + 47.582 + + + + 47.461 + + + + 47.956 + + + + 48.202 + + + + 47.862 + + + + 47.719 + + + + 48.081 + + + + 48.491 + + + + 48.461 + + + + 48.577 + + + + 48.722 + + + + 48.644 + + + + 48.828 + + + + 48.955 + + + + 48.848 + + + + 49.268 + + + + 49.761 + + + + 49.422 + + + + 49.649 + + + + 49.487 + + + + 49.804 + + + + 50.129 + + + + 50.160 + + + + 50.173 + + + + 49.929 + + + + 50.093 + + + + 50.121 + + + + 50.084 + + + + 50.348 + + + + 50.596 + + + + 50.612 + + + + 50.390 + + + + 50.831 + + + + 50.807 + + + + 51.112 + + + + 51.500 + + + + 51.855 + + + + 51.773 + + + + 52.170 + + + + 52.402 + + + + 52.360 + + + + 52.392 + + + + 52.323 + + + + 52.548 + + + + 52.681 + + + + 53.024 + + + + 52.911 + + + + 53.148 + + + + 53.618 + + + + 53.703 + + + + 53.850 + + + + 53.874 + + + + 54.005 + + + + 54.275 + + + + 54.401 + + + + 54.491 + + + + 54.805 + + + + 54.945 + + + + 55.163 + + + + 54.923 + + + + 54.836 + + + + 55.142 + + + + 55.174 + + + + 55.554 + + + + 55.726 + + + + 55.589 + + + + 55.763 + + + + 55.914 + + + + 55.932 + + + + 56.117 + + + + 56.307 + + + + 56.621 + + + + 56.806 + + + + 56.948 + + + + 56.773 + + + + 56.628 + + + + 56.617 + + + + 56.705 + + + + 57.268 + + + + 57.189 + + + + 57.353 + + + + 57.269 + + + + 57.655 + + + + 57.975 + + + + 58.090 + + + + 58.101 + + + + 58.018 + + + + 57.895 + + + + 57.863 + + + + 57.863 + + + + 57.971 + + + + 57.971 + + + + 58.146 + + + + 58.395 + + + + 58.434 + + + + 58.285 + + + + 58.294 + + + + 58.221 + + + + 58.325 + + + + 58.146 + + + + 58.247 + + + + 58.597 + + + + 58.638 + + + + 58.636 + + + + 58.777 + + + + 58.884 + + + + 58.829 + + + + 58.904 + + + + 58.918 + + + + 58.840 + + + + 59.164 + + + + 59.455 + + + + 59.419 + + + + 59.359 + + + + 59.891 + + + + 59.947 + + + + 60.030 + + + + 60.326 + + + + 60.490 + + + + 60.450 + + + + 60.413 + + + + 60.477 + + + + 60.556 + + + + 60.691 + + + + 60.730 + + + + 60.734 + + + + 60.996 + + + + 61.300 + + + + 61.395 + + + + 61.665 + + + + 61.834 + + + + 61.943 + + + + 61.974 + + + + 62.019 + + + + 61.911 + + + + 61.950 + + + + 62.035 + + + + 62.381 + + + + 62.917 + + + + 62.997 + + + + 63.075 + + + + 62.908 + + + + 62.757 + + + + 62.678 + + + + 62.749 + + + + 62.812 + + + + 62.992 + + + + 63.338 + + + + 63.473 + + + + 63.801 + + + + 63.948 + + + + 64.271 + + + + 64.773 + + + + 64.794 + + + + 65.011 + + + + 65.534 + + + + 65.609 + + + + 65.779 + + + + 65.627 + + + + 65.655 + + + + 65.550 + + + + 65.845 + + + + 65.797 + + + + 65.945 + + + + 66.000 + + + + 65.974 + + + + 66.071 + + + + 66.167 + + + + 66.127 + + + + 66.235 + + + + 66.005 + + + + 66.256 + + + + 66.771 + + + + 66.974 + + + + 66.963 + + + + 67.097 + + + + 67.204 + + + + 67.175 + + + + 67.391 + + + + 67.387 + + + + 67.313 + + + + 67.437 + + + + 67.489 + + + + 67.568 + + + + 67.748 + + + + 67.750 + + + + 67.810 + + + + 67.937 + + + + 68.158 + + + + 68.268 + + + + 68.220 + + + + 68.275 + + + + 68.568 + + + + 68.520 + + + + 68.776 + + + + 68.715 + + + + 68.812 + + + + 68.973 + + + + 69.073 + + + + 69.109 + + + + 69.394 + + + + 69.447 + + + + 69.470 + + + + 69.693 + + + + 69.631 + + + + 69.749 + + + + 69.740 + + + + 69.862 + + + + 69.890 + + + + 69.788 + + + + 69.816 + + + + 69.802 + + + + 69.877 + + + + 69.957 + + + + 69.977 + + + + 69.954 + + + + 70.235 + + + + 70.276 + + + + 70.226 + + + + 69.962 + + + + 70.159 + + + + 70.297 + + + + 70.446 + + + + 70.558 + + + + 70.681 + + + + 70.643 + + + + 70.681 + + + + 70.707 + + + + 70.732 + + + + 70.945 + + + + 71.029 + + + + 71.442 + + + + 71.468 + + + + 71.529 + + + + 71.491 + + + + 71.412 + + + + 71.590 + + + + 71.557 + + + + 71.756 + + + + 71.802 + + + + 72.006 + + + + 72.126 + + + + 72.174 + + + + 72.203 + + + + 72.294 + + + + 72.344 + + + + 72.519 + + + + 72.469 + + + + 72.543 + + + + 72.662 + + + + 72.903 + + + + 73.067 + + + + 73.236 + + + + 73.172 + + + + 73.405 + + + + 73.524 + + + + 73.516 + + + + 73.611 + + + + 73.539 + + + + 73.843 + + + + 73.927 + + + + 74.017 + + + + 73.879 + + + + 74.043 + + + + 74.125 + + + + 74.141 + + + + 74.083 + + + + 74.154 + + + + 74.260 + + + + 74.303 + + + + 74.379 + + + + 74.550 + + + + 74.601 + + + + 74.793 + + + + 74.794 + + + + 74.791 + + + + 74.564 + + + + 74.360 + + + + 74.934 + + + + 75.166 + + + + 75.354 + + + + 75.346 + + + + 75.271 + + + + 75.141 + + + + 75.337 + + + + 75.492 + + + + 75.542 + + + + 75.658 + + + + 75.600 + + + + 75.657 + + + + 75.638 + + + + 75.590 + + + + 75.463 + + + + 75.796 + + + + 75.687 + + + + 75.805 + + + + 75.638 + + + + 75.771 + + + + 75.934 + + + + 75.988 + + + + 75.875 + + + + 75.961 + + + + 75.856 + + + + 76.047 + + + + 75.897 + + + + 76.029 + + + + 75.884 + + + + 75.995 + + + + 75.993 + + + + 76.006 + + + + 76.033 + + + + 75.972 + + + + 75.948 + + + + 75.999 + + + + 75.898 + + + + 75.962 + + + + 75.920 + + + + 75.949 + + + + 75.976 + + + + 75.973 + + + + 75.926 + + + + 75.997 + + + + 76.061 + + + + 75.884 + + + + 75.987 + + + + 76.024 + + + + 75.972 + + + + 75.916 + + + + 75.858 + + + + 75.999 + + + + 76.010 + + + + 75.896 + + + + 75.949 + + + + 75.942 + + + + 75.971 + + + + 75.942 + + + + 75.789 + + + + 75.969 + + + + 76.007 + + + + 75.875 + + + + 75.865 + + + + 75.992 + + + + 75.977 + + + + 75.966 + + + + 75.938 + + + + 75.959 + + + + 75.899 + + + + 75.955 + + + + 75.953 + + + + 75.892 + + + + 75.964 + + + + 75.956 + + + + 75.965 + + + + 75.944 + + + + 75.878 + + + + 75.887 + + + + 75.821 + + + + 75.927 + + + + 75.711 + + + + 75.725 + + + + 75.744 + + + + 75.581 + + + + 75.687 + + + + 75.672 + + + + 75.717 + + + + 75.625 + + + + 75.594 + + + + 75.642 + + + + 75.667 + + + + 75.641 + + + + 75.668 + + + + 75.613 + + + + 75.762 + + + + 75.755 + + + + 75.655 + + + + 75.592 + + + + 75.693 + + + + 75.607 + + + + 75.671 + + + + 75.608 + + + + 75.656 + + + + 75.681 + + + + 75.591 + + + + 75.529 + + + + 75.588 + + + + 75.586 + + + + 75.465 + + + + 75.524 + + + + 75.541 + + + + 75.452 + + + + 75.511 + + + + 75.168 + + + + 75.211 + + + + 75.212 + + + + 75.142 + + + + 75.439 + + + + 75.506 + + + + 75.391 + + + + 75.442 + + + + 75.533 + + + + 75.513 + + + + 75.514 + + + + 75.536 + + + + 75.553 + + + + 75.569 + + + + 75.621 + + + + 75.796 + + + + 75.617 + + + + 75.557 + + + + 75.619 + + + + 75.633 + + + + 75.578 + + + + 75.540 + + + + 75.673 + + + + 75.613 + + + + 75.614 + + + + 75.612 + + + + 75.627 + + + + 75.590 + + + + 75.671 + + + + 75.643 + + + + 75.702 + + + + 75.637 + + + + 75.722 + + + + 75.681 + + + + 75.669 + + + + 75.643 + + + + 75.687 + + + + 75.674 + + + + 75.760 + + + + 75.676 + + + + 75.587 + + + + 75.562 + + + + 75.534 + + + + 75.474 + + + + 75.608 + + + + 75.622 + + + + 75.549 + + + + 75.537 + + + + 75.541 + + + + 75.589 + + + + 75.620 + + + + 75.634 + + + + 75.625 + + + + 75.663 + + + + 75.643 + + + + 75.623 + + + + 75.643 + + + + 75.530 + + + + 75.500 + + + + 75.583 + + + + 75.600 + + + + 75.530 + + + + 75.421 + + + + 75.507 + + + + 75.487 + + + + 75.428 + + + + 75.459 + + + + 75.352 + + + + 75.460 + + + + 75.422 + + + + 75.252 + + + + 75.460 + + + + 75.354 + + + + 75.586 + + + + 75.490 + + + + 75.416 + + + + 75.494 + + + + 75.497 + + + + 75.438 + + + + 75.446 + + + + 75.372 + + + + 75.416 + + + + 75.474 + + + + 75.583 + + + + 75.562 + + + + 75.612 + + + + 75.626 + + + + 75.557 + + + + 75.595 + + + + 75.508 + + + + 75.617 + + + + 75.533 + + + + 75.503 + + + + 75.660 + + + + 75.684 + + + + 75.559 + + + + 75.560 + + + + 75.646 + + + + 75.648 + + + + 75.563 + + + + 75.623 + + + + 75.535 + + + + 75.532 + + + + 75.571 + + + + 75.595 + + + + 75.659 + + + + 75.569 + + + + 75.633 + + + + 75.736 + + + + 75.655 + + + + 75.547 + + + + 75.585 + + + + 75.658 + + + + 75.622 + + + + 75.687 + + + + 75.631 + + + + 75.696 + + + + 75.648 + + + + 75.713 + + + + 75.808 + + + + 75.612 + + + + 75.763 + + + + 75.657 + + + + 75.679 + + + + 75.727 + + + + 75.677 + + + + 75.734 + + + + 75.722 + + + + 75.646 + + + + 75.526 + + + + 75.684 + + + + 75.817 + + + + 75.782 + + + + 75.837 + + + + 75.787 + + + + 75.649 + + + + 75.775 + + + + 75.583 + + + + 75.757 + + + + 75.766 + + + + 75.621 + + + + 75.753 + + + + 75.796 + + + + 75.641 + + + + 75.584 + + + + 75.815 + + + + 75.829 + + + + 75.886 + + + + 75.929 + + + + 75.915 + + + + 75.943 + + + + 75.889 + + + + 75.954 + + + + 76.058 + + + + 75.986 + + + + 75.966 + + + + 75.981 + + + + 76.020 + + + + 75.969 + + + + 75.976 + + + + 75.883 + + + + 75.877 + + + + 75.903 + + + + 76.024 + + + + 76.028 + + + + 75.830 + + + + 76.106 + + + + 75.866 + + + + 76.016 + + + + 75.957 + + + + 76.171 + + + + 76.083 + + + + 76.149 + + + + 76.206 + + + + 76.050 + + + + 76.110 + + + + 76.157 + + + + 76.228 + + + + 76.188 + + + + 76.195 + + + + 76.284 + + + + 76.226 + + + + 76.204 + + + + 76.124 + + + + 76.300 + + + + 76.242 + + + + 76.225 + + + + 76.188 + + + + 76.242 + + + + 76.081 + + + + 76.077 + + + + 76.119 + + + + 76.047 + + + + 76.134 + + + + 76.160 + + + + 76.159 + + + + 76.246 + + + + 76.192 + + + + 76.200 + + + + 76.262 + + + + 76.307 + + + + 76.306 + + + + 76.274 + + + + 76.450 + + + + 76.449 + + + + 76.388 + + + + 76.218 + + + + 76.312 + + + + 76.245 + + + + 76.271 + + + + 76.477 + + + + 76.492 + + + + 76.488 + + + + 76.419 + + + + 76.629 + + + + 76.560 + + + + 76.696 + + + + 76.640 + + + + 76.673 + + + + 76.649 + + + + 76.629 + + + + 76.488 + + + + 76.627 + + + + 76.687 + + + + 76.594 + + + + 76.503 + + + + 76.484 + + + + 76.729 + + + + 76.532 + + + + 76.716 + + + + 76.726 + + + + 76.686 + + + + 76.722 + + + + 76.618 + + + + 76.773 + + + + 76.774 + + + + 76.747 + + + + 76.675 + + + + 76.706 + + + + 76.906 + + + + 76.810 + + + + 76.838 + + + + 76.898 + + + + 76.727 + + + + 76.631 + + + + 76.723 + + + + 76.709 + + + + 76.674 + + + + 76.927 + + + + 76.598 + + + + 76.645 + + + + 76.673 + + + + 76.698 + + + + 76.793 + + + + 76.787 + + + + 76.765 + + + + 76.756 + + + + 76.755 + + + + 76.812 + + + + 76.875 + + + + 76.823 + + + + 77.002 + + + + 76.940 + + + + 77.066 + + + + 77.187 + + + + 77.146 + + + + 77.298 + + + + 77.117 + + + + 77.090 + + + + 77.200 + + + + 77.238 + + + + 77.057 + + + + 77.149 + + + + 77.195 + + + + 77.173 + + + + 77.317 + + + + 77.298 + + + + 77.183 + + + + 77.285 + + + + 77.291 + + + + 77.195 + + + + 77.239 + + + + 77.375 + + + + 77.200 + + + + 77.386 + + + + 77.327 + + + + 77.310 + + + + 77.227 + + + + 77.305 + + + + 77.304 + + + + 77.324 + + + + 77.302 + + + + 77.253 + + + + 77.334 + + + + 77.465 + + + + 77.266 + + + + 77.365 + + + + 77.369 + + + + 77.532 + + + + 77.441 + + + + 77.419 + + + + 77.391 + + + + 77.509 + + + + 77.545 + + + + 77.575 + + + + 77.508 + + + + 77.353 + + + + 77.471 + + + + 77.515 + + + + 77.582 + + + + 77.351 + + + + 77.559 + + + + 77.476 + + + + 77.409 + + + + 77.643 + + + + 77.430 + + + + 77.519 + + + + 77.555 + + + + 77.582 + + + + 77.674 + + + + 77.403 + + + + 77.412 + + + + 77.470 + + + + 77.405 + + + + 77.415 + + + + 77.503 + + + + 77.523 + + + + 77.517 + + + + 77.458 + + + + 77.459 + + + + 77.508 + + + + 77.542 + + + + 77.538 + + + + 77.613 + + + + 77.530 + + + + 77.630 + + + + 77.599 + + + + 77.593 + + + + 77.626 + + + + 77.614 + + + + 77.605 + + + + 77.638 + + + + 77.637 + + + + 77.581 + + + + 77.698 + + + + 77.676 + + + + 77.677 + + + + 77.700 + + + + 77.733 + + + + 77.647 + + + + 77.738 + + + + 77.766 + + + + 77.858 + + + + 77.959 + + + + 78.000 + + + + 77.877 + + + + 77.860 + + + + 77.840 + + + + 77.847 + + + + 78.041 + + + + 77.995 + + + + 77.909 + + + + 78.045 + + + + 77.898 + + + + 78.087 + + + + 78.041 + + + + 78.055 + + + + 77.937 + + + + 77.991 + + + + 78.141 + + + + 77.975 + + + + 77.969 + + + + 77.983 + + + + 77.971 + + + + 77.975 + + + + 78.011 + + + + 78.197 + + + + 78.034 + + + + 78.107 + + + + 78.095 + + + + 78.128 + + + + 78.187 + + + + 78.072 + + + + 78.063 + + + + 78.154 + + + + 78.152 + + + + 78.100 + + + + 78.207 + + + + 78.193 + + + + 78.120 + + + + 78.211 + + + + 78.104 + + + + 78.300 + + + + 78.180 + + + + 78.173 + + + + 78.185 + + + + 78.189 + + + + 78.174 + + + + 78.204 + + + + 78.243 + + + + 78.233 + + + + 78.361 + + + + 78.444 + + + + 78.390 + + + + 78.454 + + + + 78.469 + + + + 78.536 + + + + 78.590 + + + + 78.461 + + + + 78.536 + + + + 78.566 + + + + 78.562 + + + + 78.394 + + + + 78.561 + + + + 78.660 + + + + 78.603 + + + + 78.469 + + + + 78.412 + + + + 78.508 + + + + 78.422 + + + + 78.452 + + + + 78.561 + + + + 78.470 + + + + 78.569 + + + + 78.522 + + + + 78.415 + + + + 78.524 + + + + 78.491 + + + + 78.476 + + + + 78.512 + + + + 78.536 + + + + 78.461 + + + + 78.462 + + + + 78.508 + + + + 78.538 + + + + 78.735 + + + + 78.683 + + + + 78.570 + + + + 78.542 + + + + 78.596 + + + + 78.563 + + + + 78.577 + + + + 78.573 + + + + 78.563 + + + + 78.694 + + + + 78.816 + + + + 78.680 + + + + 78.622 + + + + 78.629 + + + + 78.654 + + + + 78.644 + + + + 78.685 + + + + 78.694 + + + + 78.745 + + + + 78.659 + + + + 78.675 + + + + 78.711 + + + + 78.717 + + + + 78.700 + + + + 78.690 + + + + 78.733 + + + + 78.819 + + + + 78.785 + + + + 78.723 + + + + 78.766 + + + + 78.849 + + + + 78.810 + + + + 78.898 + + + + 79.034 + + + + 79.141 + + + + 78.914 + + + + 78.944 + + + + 78.863 + + + + 78.954 + + + + 79.076 + + + + 79.008 + + + + 78.914 + + + + 78.915 + + + + 79.050 + + + + 78.885 + + + + 78.946 + + + + 78.971 + + + + 79.120 + + + + 78.986 + + + + 78.926 + + + + 78.948 + + + + 79.115 + + + + 79.095 + + + + 79.114 + + + + 79.228 + + + + 79.105 + + + + 79.151 + + + + 79.241 + + + + 79.189 + + + + 79.240 + + + + 79.056 + + + + 79.033 + + + + 79.068 + + + + 79.125 + + + + 79.091 + + + + 79.132 + + + + 79.226 + + + + 79.340 + + + + 79.193 + + + + 79.141 + + + + 79.135 + + + + 79.122 + + + + 79.140 + + + + 79.154 + + + + 79.359 + + + + 79.246 + + + + 79.208 + + + + 79.196 + + + + 79.227 + + + + 79.231 + + + + 79.327 + + + + 79.435 + + + + 79.312 + + + + 79.272 + + + + 79.279 + + + + 79.373 + + + + 79.356 + + + + 79.411 + + + + 79.366 + + + + 79.370 + + + + 79.430 + + + + 79.372 + + + + 79.472 + + + + 79.358 + + + + 79.411 + + + + 79.545 + + + + 79.458 + + + + 79.640 + + + + 79.698 + + + + 79.740 + + + + 79.722 + + + + 79.709 + + + + 79.804 + + + + 79.651 + + + + 79.791 + + + + 79.759 + + + + 79.804 + + + + 79.567 + + + + 79.614 + + + + 79.533 + + + + 79.588 + + + + 79.772 + + + + 79.875 + + + + 79.880 + + + + 80.077 + + + + 80.033 + + + + 79.995 + + + + 79.969 + + + + 79.977 + + + + 79.963 + + + + 80.026 + + + + 80.035 + + + + 80.004 + + + + 79.806 + + + + 79.770 + + + + 79.680 + + + + 79.555 + + + + 79.658 + + + + 79.755 + + + + 79.675 + + + + 79.584 + + + + 79.656 + + + + 79.470 + + + + 79.484 + + + + 79.503 + + + + 79.426 + + + + 79.437 + + + + 79.062 + + + + 78.966 + + + + 79.166 + + + + 79.018 + + + + 79.157 + + + + 79.027 + + + + 79.066 + + + + 79.012 + + + + 78.942 + + + + 78.951 + + + + 79.041 + + + + 79.052 + + + + 78.979 + + + + 79.178 + + + + 79.202 + + + + 79.207 + + + + 79.205 + + + + 79.463 + + + + 79.442 + + + + 79.434 + + + + 79.403 + + + + 79.383 + + + + 79.536 + + + + 79.443 + + + + 79.390 + + + + 79.390 + + + + 79.422 + + + + 79.638 + + + + 79.603 + + + + 79.669 + + + + 79.501 + + + + 79.456 + + + + 79.669 + + + + 79.677 + + + + 79.602 + + + + 79.495 + + + + 79.565 + + + + 79.649 + + + + 79.594 + + + + 79.669 + + + + 79.599 + + + + 79.642 + + + + 79.691 + + + + 79.655 + + + + 79.604 + + + + 79.499 + + + + 79.321 + + + + 79.161 + + + + 79.312 + + + + 79.278 + + + + 79.308 + + + + 79.307 + + + + 79.120 + + + + 78.921 + + + + 79.024 + + + + 78.817 + + + + 78.766 + + + + 78.746 + + + + 78.576 + + + + 78.551 + + + + 78.499 + + + + 78.455 + + + + 78.530 + + + + 78.481 + + + + 78.501 + + + + 78.293 + + + + 78.220 + + + + 78.292 + + + + 78.074 + + + + 77.993 + + + + 77.933 + + + + 77.940 + + + + 77.869 + + + + 77.838 + + + + 77.770 + + + + 77.699 + + + + 77.702 + + + + 77.591 + + + + 77.673 + + + + 77.493 + + + + 77.263 + + + + 77.145 + + + + 77.394 + + + + 77.370 + + + + 77.223 + + + + 77.356 + + + + 77.337 + + + + 77.187 + + + + 77.198 + + + + 77.182 + + + + 77.093 + + + + 77.051 + + + + 77.223 + + + + 77.041 + + + + 77.086 + + + + 76.917 + + + + 77.013 + + + + 77.206 + + + + 77.347 + + + + 77.572 + + + + 77.850 + + + + 78.003 + + + + 77.877 + + + + 78.190 + + + + 78.465 + + + + 78.521 + + + + 78.596 + + + + 78.687 + + + + 78.851 + + + + 78.866 + + + + 79.089 + + + + 79.082 + + + + 79.345 + + + + 79.410 + + + + 79.618 + + + + 79.868 + + + + 79.986 + + + + 80.270 + + + + 80.269 + + + + 80.387 + + + + 80.378 + + + + 80.238 + + + + 80.393 + + + + 80.528 + + + + 80.548 + + + + 80.547 + + + + 80.754 + + + + 81.224 + + + + 81.288 + + + + 81.265 + + + + 81.386 + + + + 81.556 + + + + 81.448 + + + + 81.638 + + + + 81.745 + + + + 81.759 + + + + 81.773 + + + + 81.775 + + + + 81.829 + + + + 81.794 + + + + 81.829 + + + + 81.861 + + + + 82.035 + + + + 82.077 + + + + 82.085 + + + + 82.164 + + + + 82.222 + + + + 82.206 + + + + 82.237 + + + + 82.144 + + + + 82.209 + + + + 82.106 + + + + 82.235 + + + + 82.209 + + + + 82.301 + + + + 82.206 + + + + 82.356 + + + + 82.479 + + + + 82.439 + + + + 82.501 + + + + 82.299 + + + + 82.417 + + + + 82.302 + + + + 82.327 + + + + 82.257 + + + + 82.089 + + + + 82.080 + + + + 82.078 + + + + 82.177 + + + + 82.080 + + + + 81.957 + + + + 81.786 + + + + 81.435 + + + + 81.715 + + + + 81.748 + + + + 81.740 + + + + 81.484 + + + + 81.466 + + + + 81.424 + + + + 81.256 + + + + 81.328 + + + + 81.271 + + + + 81.270 + + + + 81.242 + + + + 81.338 + + + + 81.318 + + + + 81.316 + + + + 81.283 + + + + 81.284 + + + + 80.965 + + + + 80.903 + + + + 81.028 + + + + 80.853 + + + + 80.947 + + + + 80.587 + + + + 80.697 + + + + 80.580 + + + + 80.437 + + + + 80.461 + + + + 80.463 + + + + 80.183 + + + + 80.320 + + + + 80.082 + + + + 79.981 + + + + 79.918 + + + + 79.955 + + + + 79.825 + + + + 79.746 + + + + 79.924 + + + + 79.829 + + + + 79.844 + + + + 79.954 + + + + 79.853 + + + + 79.958 + + + + 79.951 + + + + 80.066 + + + + 80.234 + + + + 80.285 + + + + 80.406 + + + + 80.674 + + + + 80.725 + + + + 80.821 + + + + 80.867 + + + + 80.606 + + + + 80.520 + + + + 80.507 + + + + 80.384 + + + + 80.438 + + + + 80.394 + + + + 80.241 + + + + 80.211 + + + + 79.660 + + + + 79.426 + + + + 79.194 + + + + 79.277 + + + + 79.260 + + + + 78.936 + + + + 78.702 + + + + 78.597 + + + + 78.448 + + + + 78.375 + + + + 78.254 + + + + 78.002 + + + + 78.256 + + + + 78.066 + + + + 77.977 + + + + 77.951 + + + + 77.989 + + + + 77.985 + + + + 77.894 + + + + 77.947 + + + + 77.666 + + + + 77.429 + + + + 77.195 + + + + 77.222 + + + + 77.192 + + + + 77.188 + + + + 77.036 + + + + 77.053 + + + + 77.176 + + + + 77.357 + + + + 77.366 + + + + 77.525 + + + + 77.566 + + + + 77.704 + + + + 78.162 + + + + 78.300 + + + + 78.494 + + + + 78.370 + + + + 78.706 + + + + 78.529 + + + + 78.378 + + + + 78.560 + + + + 78.587 + + + + 78.574 + + + + 78.595 + + + + 78.325 + + + + 78.505 + + + + 78.516 + + + + 78.381 + + + + 78.518 + + + + 78.516 + + + + 78.455 + + + + 78.318 + + + + 78.268 + + + + 78.229 + + + + 78.086 + + + + 77.796 + + + + 77.672 + + + + 77.125 + + + + 77.014 + + + + 77.009 + + + + 76.875 + + + + 76.595 + + + + 76.252 + + + + 76.113 + + + + 76.188 + + + + 75.994 + + + + 75.773 + + + + 75.798 + + + + 75.741 + + + + 75.792 + + + + 75.750 + + + + 75.685 + + + + 75.578 + + + + 75.140 + + + + 74.943 + + + + 74.833 + + + + 74.778 + + + + 74.645 + + + + 73.808 + + + + 73.566 + + + + 73.630 + + + + 73.560 + + + + 73.386 + + + + 73.118 + + + + 73.176 + + + + 73.412 + + + + 73.788 + + + + 73.698 + + + + 73.831 + + + + 73.821 + + + + 73.871 + + + + 74.052 + + + + 73.841 + + + + 73.791 + + + + 73.353 + + + + 73.235 + + + + 73.107 + + + + 72.997 + + + + 72.784 + + + + 72.452 + + + + 72.361 + + + + 72.193 + + + + 71.970 + + + + 71.916 + + + + 71.722 + + + + 71.684 + + + + 71.276 + + + + 71.269 + + + + 70.943 + + + + 70.682 + + + + 70.404 + + + + 69.964 + + + + 69.859 + + + + 69.631 + + + + 69.457 + + + + 69.298 + + + + 69.310 + + + + 69.201 + + + + 69.141 + + + + 68.812 + + + + 68.256 + + + + 68.188 + + + + 67.891 + + + + 67.710 + + + + 67.746 + + + + 67.420 + + + + 67.393 + + + + 67.096 + + + + 67.061 + + + + 66.616 + + + + 66.369 + + + + 66.313 + + + + 66.249 + + + + 66.171 + + + + 66.065 + + + + 65.519 + + + + 65.706 + + + + 65.745 + + + + 66.167 + + + + 66.335 + + + + 66.313 + + + + 65.837 + + + + 65.802 + + + + 65.481 + + + + 65.008 + + + + 64.787 + + + + 64.588 + + + + 64.257 + + + + 64.015 + + + + 64.305 + + + + 64.367 + + + + 64.140 + + + + 64.115 + + + + 64.069 + + + + 64.087 + + + + 64.185 + + + + 63.917 + + + + 63.927 + + + + 63.890 + + + + 63.758 + + + + 63.784 + + + + 63.540 + + + + 63.453 + + + + 63.621 + + + + 63.515 + + + + 63.292 + + + + 63.225 + + + + 63.147 + + + + 62.966 + + + + 62.862 + + + + 62.510 + + + + 62.332 + + + + 62.336 + + + + 62.145 + + + + 61.671 + + + + 60.962 + + + + 60.897 + + + + 60.804 + + + + 60.732 + + + + 60.551 + + + + 60.244 + + + + 60.230 + + + + 60.325 + + + + 60.316 + + + + 60.427 + + + + 60.455 + + + + 60.451 + + + + 60.445 + + + + 60.230 + + + + 60.321 + + + + 60.444 + + + + 60.499 + + + + 60.471 + + + + 60.253 + + + + 60.080 + + + + 60.087 + + + + 60.039 + + + + 60.023 + + + + 59.790 + + + + 59.922 + + + + 59.696 + + + + 59.656 + + + + 59.719 + + + + 59.882 + + + + 59.697 + + + + 59.364 + + + + 59.380 + + + + 59.425 + + + + 59.018 + + + + 58.838 + + + + 58.487 + + + + 58.254 + + + + 58.208 + + + + 58.575 + + + + 58.711 + + + + 58.816 + + + + 58.624 + + + + 58.421 + + + + 58.322 + + + + 58.191 + + + + 58.480 + + + + 58.772 + + + + 59.146 + + + + 59.356 + + + + 59.299 + + + + 59.273 + + + + 59.298 + + + + 59.241 + + + + 59.242 + + + + 59.338 + + + + 59.265 + + + + 59.353 + + + + 59.430 + + + + 59.354 + + + + 59.389 + + + + 59.476 + + + + 59.382 + + + + 59.319 + + + + 59.315 + + + + 59.357 + + + + 59.292 + + + + 59.256 + + + + 59.265 + + + + 59.184 + + + + 59.264 + + + + 59.164 + + + + 59.212 + + + + 59.205 + + + + 59.158 + + + + 58.807 + + + + 58.607 + + + + 58.359 + + + + 58.183 + + + + 58.099 + + + + 57.933 + + + + 57.799 + + + + 57.303 + + + + 57.188 + + + + 56.899 + + + + 56.568 + + + + 56.316 + + + + 55.986 + + + + 55.872 + + + + 55.885 + + + + 55.740 + + + + 55.727 + + + + 55.445 + + + + 55.858 + + + + 55.326 + + + + 55.134 + + + + 55.035 + + + + 54.961 + + + + 54.824 + + + + 54.943 + + + + 54.919 + + + + 54.914 + + + + 54.885 + + + + 55.244 + + + + 55.304 + + + + 55.280 + + + + 55.424 + + + + 55.413 + + + + 55.439 + + + + 55.710 + + + + 55.770 + + + + 56.068 + + + + 56.072 + + + + 56.359 + + + + 56.477 + + + + 56.457 + + + + 56.735 + + + + 56.633 + + + + 56.792 + + + + 56.890 + + + + 56.962 + + + + 57.071 + + + + 57.138 + + + + 57.186 + + + + 57.234 + + + + 57.281 + + + + 57.277 + + + + 57.327 + + + + 57.452 + + + + 57.487 + + + + 57.714 + + + + 57.707 + + + + 57.943 + + + + 57.991 + + + + 57.978 + + + + 58.050 + + + + 58.122 + + + + 58.149 + + + + 58.203 + + + + 58.330 + + + + 58.434 + + + + 58.583 + + + + 58.547 + + + + 58.738 + + + + 58.688 + + + + 58.753 + + + + 58.645 + + + + 58.638 + + + + 58.919 + + + + 59.193 + + + + 59.265 + + + + 59.434 + + + + 59.533 + + + + 59.679 + + + + 59.642 + + + + 59.562 + + + + 59.444 + + + + 59.266 + + + + 59.259 + + + + 59.297 + + + + 59.446 + + + + 59.408 + + + + 59.728 + + + + 59.676 + + + + 59.671 + + + + 59.717 + + + + 59.688 + + + + 59.401 + + + + 59.242 + + + + 58.967 + + + + 58.857 + + + + 58.697 + + + + 58.634 + + + + 58.368 + + + + 58.289 + + + + 58.376 + + + + 58.229 + + + + 58.100 + + + + 58.043 + + + + 58.065 + + + + 58.050 + + + + 58.109 + + + + 58.239 + + + + 58.294 + + + + 58.078 + + + + 58.046 + + + + 57.962 + + + + 58.039 + + + + 58.009 + + + + 57.996 + + + + 58.051 + + + + 57.860 + + + + 57.703 + + + + 57.704 + + + + 57.447 + + + + 57.379 + + + + 57.299 + + + + 57.116 + + + + 57.094 + + + + 57.025 + + + + 56.931 + + + + 56.842 + + + + 56.797 + + + + 56.640 + + + + 56.716 + + + + 56.536 + + + + 56.598 + + + + 56.405 + + + + 56.402 + + + + 56.219 + + + + 56.335 + + + + 56.350 + + + + 56.233 + + + + 56.160 + + + + 56.070 + + + + 56.090 + + + + 55.971 + + + + 56.005 + + + + 55.858 + + + + 55.955 + + + + 55.901 + + + + 55.626 + + + + 55.532 + + + + 55.409 + + + + 55.202 + + + + 55.198 + + + + 55.424 + + + + 55.414 + + + + 55.220 + + + + 55.458 + + + + 55.451 + + + + 55.272 + + + + 55.056 + + + + 54.766 + + + + 54.648 + + + + 54.623 + + + + 54.611 + + + + 54.643 + + + + 54.412 + + + + 54.383 + + + + 54.411 + + + + 54.412 + + + + 54.567 + + + + 54.592 + + + + 54.609 + + + + 54.560 + + + + 54.332 + + + + 54.301 + + + + 54.284 + + + + 54.415 + + + + 54.322 + + + + 54.289 + + + + 53.907 + + + + 54.103 + + + + 54.025 + + + + 53.913 + + + + 53.846 + + + + 53.591 + + + + 53.657 + + + + 53.495 + + + + 53.289 + + + + 52.821 + + + + 52.529 + + + + 52.769 + + + + 52.719 + + + + 52.920 + + + + 52.774 + + + + 52.562 + + + + 52.287 + + + + 52.390 + + + + 52.210 + + + + 51.872 + + + + 51.671 + + + + 51.349 + + + + 51.191 + + + + 51.350 + + + + 51.120 + + + + 51.056 + + + + 51.001 + + + + 50.963 + + + + 50.841 + + + + 50.789 + + + + 50.665 + + + + 50.633 + + + + 50.467 + + + + 50.319 + + + + 50.070 + + + + 50.030 + + + + 50.128 + + + + 50.189 + + + + 49.975 + + + + 49.856 + + + + 49.607 + + + + 49.733 + + + + 49.561 + + + + 49.352 + + + + 49.277 + + + + 49.290 + + + + 49.041 + + + + 48.932 + + + + 48.730 + + + + 48.730 + + + + 48.710 + + + + 48.767 + + + + 48.976 + + + + 48.619 + + + + 48.381 + + + + 48.349 + + + + 48.285 + + + + 48.107 + + + + 47.954 + + + + 47.686 + + + + 47.628 + + + + 47.878 + + + + 47.872 + + + + 47.856 + + + + 47.626 + + + + 47.425 + + + + 47.337 + + + + 47.281 + + + + 47.273 + + + + 47.365 + + + + 47.150 + + + + 46.898 + + + + 46.873 + + + + 46.703 + + + + 46.652 + + + + 46.558 + + + + 46.430 + + + + 46.355 + + + + 46.307 + + + + 46.211 + + + + 46.097 + + + + 46.141 + + + + 46.111 + + + + 46.182 + + + + 46.044 + + + + 46.079 + + + + 46.051 + + + + 45.911 + + + + 45.775 + + + + 45.766 + + + + 45.750 + + + + 45.834 + + + + 45.994 + + + + 46.037 + + + + 46.013 + + + + 45.989 + + + + 46.065 + + + + 46.247 + + + + 46.293 + + + + 46.437 + + + + 46.483 + + + + 46.588 + + + + 46.882 + + + + 47.155 + + + + 47.080 + + + + 46.973 + + + + 46.805 + + + + 46.864 + + + + 46.662 + + + + 46.727 + + + + 46.843 + + + + 46.632 + + + + 46.671 + + + + 46.526 + + + + 46.667 + + + + 46.666 + + + + 46.561 + + + + 46.710 + + + + 46.616 + + + + 46.688 + + + + 46.722 + + + + 46.753 + + + + 46.482 + + + + 46.574 + + + + 46.574 + + + + 46.377 + + + + 46.361 + + + + 46.178 + + + + 46.059 + + + + 46.106 + + + + 45.955 + + + + 45.752 + + + + 45.682 + + + + 45.445 + + + + 45.375 + + + + 45.509 + + + + 45.468 + + + + 45.461 + + + + 45.354 + + + + 45.606 + + + + 45.374 + + + + 45.282 + + + + 45.341 + + + + 45.717 + + + + 45.638 + + + + 45.593 + + + + 45.427 + + + + 45.316 + + + + 45.131 + + + + 44.901 + + + + 44.754 + + + + 44.685 + + + + 44.538 + + + + 44.364 + + + + 44.145 + + + + 44.155 + + + + 44.103 + + + + 44.005 + + + + 43.784 + + + + 43.596 + + + + 43.522 + + + + 43.453 + + + + 43.250 + + + + 43.194 + + + + 43.193 + + + + 43.098 + + + + 43.044 + + + + 42.712 + + + + 42.615 + + + + 42.333 + + + + 42.223 + + + + 42.182 + + + + 42.204 + + + + 42.003 + + + + 41.782 + + + + 41.763 + + + + 41.704 + + + + 42.079 + + + + 42.092 + + + + 41.830 + + + + 41.864 + + + + 41.848 + + + + 41.420 + + + + 41.444 + + + + 41.401 + + + + 41.136 + + + + 40.874 + + + + 40.989 + + + + 40.975 + + + + 40.860 + + + + 40.568 + + + + 40.390 + + + + 40.253 + + + + 40.318 + + + + 40.337 + + + + 40.106 + + + + 40.049 + + + + 39.971 + + + + 39.795 + + + + 39.868 + + + + 40.322 + + + + 40.496 + + + + 40.363 + + + + 40.373 + + + + 40.332 + + + + 40.659 + + + + 40.850 + + + + 40.798 + + + + 40.949 + + + + 40.680 + + + + 40.709 + + + + 40.675 + + + + 40.450 + + + + 40.470 + + + + 40.314 + + + + 40.274 + + + + 40.218 + + + + 39.967 + + + + 39.922 + + + + 39.965 + + + + 39.844 + + + + 39.937 + + + + 39.942 + + + + 39.877 + + + + 39.867 + + + + 39.868 + + + + 39.808 + + + + 39.845 + + + + 39.830 + + + + 39.920 + + + + 39.962 + + + + 39.833 + + + + 39.860 + + + + 39.830 + + + + 39.664 + + + + 39.793 + + + + 39.804 + + + + 39.812 + + + + 39.872 + + + + 39.980 + + + + 39.937 + + + + 39.931 + + + + 40.018 + + + + 39.959 + + + + 39.971 + + + + 39.862 + + + + 39.940 + + + + 40.027 + + + + 39.829 + + + + 39.863 + + + + 39.820 + + + + 39.683 + + + + 39.580 + + + + 39.376 + + + + 39.284 + + + + 39.361 + + + + 39.276 + + + + 38.949 + + + + 38.815 + + + + 38.738 + + + + 38.614 + + + + 38.461 + + + + 38.298 + + + + 38.229 + + + + 37.942 + + + + 37.886 + + + + 37.868 + + + + 37.702 + + + + 37.694 + + + + 37.573 + + + + 37.608 + + + + 37.429 + + + + 37.420 + + + + 37.408 + + + + 37.428 + + + + 37.472 + + + + 37.252 + + + + 37.246 + + + + 37.063 + + + + 36.895 + + + + 36.681 + + + + 36.614 + + + + 36.658 + + + + 36.757 + + + + 36.702 + + + + 36.706 + + + + 36.678 + + + + 36.842 + + + + 37.039 + + + + 37.296 + + + + 37.165 + + + + 37.260 + + + + 37.327 + + + + 37.264 + + + + 37.204 + + + + 37.135 + + + + 36.948 + + + + 37.070 + + + + 37.047 + + + + 36.926 + + + + 36.874 + + + + 36.768 + + + + 36.661 + + + + 36.529 + + + + 36.343 + + + + 36.335 + + + + 36.392 + + + + 36.133 + + + + 36.054 + + + + 35.962 + + + + 35.740 + + + + 35.655 + + + + 35.721 + + + + 35.782 + + + + 35.727 + + + + 35.645 + + + + 35.574 + + + + 35.627 + + + + 35.607 + + + + 35.630 + + + + 35.607 + + + + 35.614 + + + + 35.660 + + + + 35.651 + + + + 35.741 + + + + 35.840 + + + + 35.627 + + + + 35.699 + + + + 35.871 + + + + 35.667 + + + + 35.697 + + + + 35.795 + + + + 35.774 + + + + 35.980 + + + + 35.891 + + + + 36.018 + + + + 36.265 + + + + 36.347 + + + + 36.458 + + + + 36.422 + + + + 36.488 + + + + 36.168 + + + + 35.982 + + + + 36.064 + + + + 35.862 + + + + 35.885 + + + + 35.868 + + + + 35.820 + + + + 35.805 + + + + 35.744 + + + + 35.816 + + + + 36.069 + + + + 36.308 + + + + 36.247 + + + + 36.050 + + + + 36.287 + + + + 36.146 + + + + 36.129 + + + + 35.753 + + + + 35.863 + + + + 35.686 + + + + 36.203 + + + + 35.978 + + + + 35.847 + + + + 35.981 + + + + 35.931 + + + + 35.809 + + + + 35.774 + + + + 35.848 + + + + 35.953 + + + + 35.858 + + + + 35.908 + + + + 35.986 + + + + 35.988 + + + + 36.024 + + + + 36.161 + + + + 36.005 + + + + 35.986 + + + + 36.184 + + + + 36.207 + + + + 36.122 + + + + 36.188 + + + + 36.248 + + + + 36.242 + + + + 36.163 + + + + 36.049 + + + + 36.255 + + + + 36.315 + + + + 36.241 + + + + 36.039 + + + + 36.115 + + + + 36.083 + + + + 36.253 + + + + 36.374 + + + + 36.511 + + + + 36.611 + + + + 36.578 + + + + 36.561 + + + + 36.685 + + + + 36.692 + + + + 36.681 + + + + 36.701 + + + + 36.685 + + + + 36.716 + + + + 36.713 + + + + 36.730 + + + + 36.693 + + + + 36.700 + + + + 36.631 + + + + 36.530 + + + + 36.487 + + + + 36.476 + + + + 36.401 + + + + 36.393 + + + + 36.437 + + + + 36.375 + + + + 36.416 + + + + 36.426 + + + + 36.412 + + + + 36.324 + + + + 36.192 + + + + 36.223 + + + + 36.441 + + + + 35.991 + + + + 36.000 + + + + 35.965 + + + + 35.885 + + + + 36.066 + + + + 36.131 + + + + 36.074 + + + + 36.088 + + + + 36.245 + + + + 36.167 + + + + 36.324 + + + + 36.253 + + + + 36.246 + + + + 35.887 + + + + 36.036 + + + + 36.105 + + + + 36.070 + + + + 36.115 + + + + 36.038 + + + + 36.088 + + + + 36.178 + + + + 36.189 + + + + 36.123 + + + + 36.067 + + + + 36.150 + + + + 36.238 + + + + 36.307 + + + + 36.195 + + + + 36.291 + + + + 36.205 + + + + 36.322 + + + + 36.172 + + + + 36.205 + + + + 36.195 + + + + 36.293 + + + + 36.357 + + + + 36.222 + + + + 36.193 + + + + 36.167 + + + + 36.185 + + + + 36.243 + + + + 36.112 + + + + 36.093 + + + + 36.200 + + + + 36.236 + + + + 36.325 + + + + 36.311 + + + + 36.320 + + + + 36.335 + + + + 36.158 + + + + 36.280 + + + + 36.090 + + + + 36.350 + + + + 36.265 + + + + 36.183 + + + + 36.172 + + + + 36.066 + + + + 36.024 + + + + 36.019 + + + + 36.133 + + + + 36.084 + + + + 36.037 + + + + 36.165 + + + + 36.062 + + + + 36.243 + + + + 36.238 + + + + 36.165 + + + + 36.072 + + + + 35.982 + + + + 36.019 + + + + 35.905 + + + + 36.065 + + + + 36.045 + + + + 35.969 + + + + 35.811 + + + + 35.661 + + + + 35.558 + + + + 35.501 + + + + 35.396 + + + + 35.421 + + + + 35.475 + + + + 35.497 + + + + 35.476 + + + + 35.376 + + + + 35.395 + + + + 35.544 + + + + 35.431 + + + + 35.456 + + + + 35.472 + + + + 35.597 + + + + 35.495 + + + + 35.501 + + + + 35.415 + + + + 35.477 + + + + 35.406 + + + + 35.296 + + + + 35.302 + + + + 35.298 + + + + 35.236 + + + + 35.258 + + + + 35.608 + + + + 35.637 + + + + 35.707 + + + + 35.957 + + + + 35.879 + + + + 36.071 + + + + 36.044 + + + + 35.890 + + + + 35.995 + + + + 35.985 + + + + 35.942 + + + + 35.974 + + + + 36.063 + + + + 35.981 + + + + 36.089 + + + + 36.007 + + + + 35.869 + + + + 35.991 + + + + 35.804 + + + + 35.696 + + + + 35.479 + + + + 35.503 + + + + 35.303 + + + + 34.981 + + + + 35.030 + + + + 34.634 + + + + 34.662 + + + + 34.695 + + + + 34.855 + + + + 34.947 + + + + 34.686 + + + + 34.614 + + + + 34.830 + + + + 34.797 + + + + 34.455 + + + + 33.928 + + + + 33.990 + + + + 34.044 + + + + 34.071 + + + + 33.802 + + + + 33.610 + + + + 33.373 + + + + 33.558 + + + + 33.622 + + + + 33.246 + + + + 32.969 + + + + 33.212 + + + + 33.259 + + + + 33.414 + + + + 33.591 + + + + 33.543 + + + + 33.332 + + + + 33.746 + + + + 33.757 + + + + 33.873 + + + + 33.807 + + + + 33.633 + + + + 33.707 + + + + 33.802 + + + + 33.911 + + + + 33.695 + + + + 33.819 + + + + 33.819 + + + + 33.798 + + + + 33.798 + + + + 33.769 + + + + 33.783 + + + + 33.851 + + + + 33.622 + + + + 33.893 + + + + 33.720 + + + + 33.804 + + + + 34.214 + + + + 33.885 + + + + 33.807 + + + + 33.713 + + + + 33.764 + + + + 33.869 + + + + 33.844 + + + + 33.916 + + + + 33.825 + + + + 33.972 + + + + 33.870 + + + + 33.985 + + + + 33.889 + + + + 33.711 + + + + 33.958 + + + + 33.965 + + + + 33.776 + + + + 33.830 + + + + 34.064 + + + + 33.836 + + + + 33.676 + + + + 33.785 + + + + 33.575 + + + + 33.360 + + + + 33.274 + + + + 33.355 + + + + 33.687 + + + + 33.445 + + + + 33.116 + + + + 33.054 + + + + 33.098 + + + + 33.224 + + + + 33.427 + + + + 33.464 + + + + 33.154 + + + + 33.199 + + + + 32.717 + + + + 32.626 + + + + 32.535 + + + + 32.543 + + + + 32.314 + + + + 32.121 + + + + 32.074 + + + + 32.074 + + + + 31.913 + + + + 31.857 + + + + 31.799 + + + + 31.876 + + + + 31.609 + + + + 31.546 + + + + 31.520 + + + + 31.588 + + + + 31.633 + + + + 31.373 + + + + 31.406 + + + + 31.176 + + + + 31.066 + + + + 30.925 + + + + 31.016 + + + + 30.719 + + + + 30.508 + + + + 30.319 + + + + 30.207 + + + + 30.321 + + + + 29.985 + + + + 29.980 + + + + 29.773 + + + + 29.868 + + + + 29.828 + + + + 30.055 + + + + 29.769 + + + + 29.904 + + + + 30.128 + + + + 29.898 + + + + 29.530 + + + + 29.563 + + + + 29.493 + + + + 29.540 + + + + 29.547 + + + + 29.642 + + + + 29.741 + + + + 29.704 + + + + 29.594 + + + + 29.447 + + + + 29.260 + + + + 29.740 + + + + 29.403 + + + + 29.482 + + + + 29.426 + + + + 29.357 + + + + 29.293 + + + + 29.409 + + + + 29.488 + + + + 29.543 + + + + 29.781 + + + + 30.203 + + + + 30.303 + + + + 30.556 + + + + 30.907 + + + + 31.083 + + + + 31.212 + + + + 31.412 + + + + 31.473 + + + + 31.697 + + + + 31.795 + + + + 31.837 + + + + 31.802 + + + + 31.937 + + + + 31.764 + + + + 31.381 + + + + 31.284 + + + + 31.013 + + + + 30.375 + + + + 29.964 + + + + 29.182 + + + + 28.814 + + + + 28.476 + + + + 28.389 + + + + 28.632 + + + + 28.786 + + + + 28.871 + + + + 29.141 + + + + 29.394 + + + + 29.567 + + + + 29.485 + + + + 29.660 + + + + 29.962 + + + + 29.944 + + + + 30.077 + + + + 30.065 + + + + 30.076 + + + + 30.119 + + + + 30.289 + + + + 30.448 + + + + 30.498 + + + + 30.575 + + + + 30.596 + + + + 30.635 + + + + 30.656 + + + + 30.627 + + + + 30.866 + + + + 31.021 + + + + 31.162 + + + + 31.232 + + + + 31.299 + + + + 31.614 + + + + 31.725 + + + + 31.942 + + + + 32.027 + + + + 32.264 + + + + 32.108 + + + + 32.346 + + + + 32.443 + + + + 32.588 + + + + 32.743 + + + + 32.843 + + + + 32.982 + + + + 32.953 + + + + 33.063 + + + + 33.256 + + + + 33.433 + + + + 33.729 + + + + 33.800 + + + + 34.126 + + + + 34.142 + + + + 34.231 + + + + 34.425 + + + + 34.652 + + + + 34.780 + + + + 34.739 + + + + 35.134 + + + + 35.302 + + + + 35.324 + + + + 35.505 + + + + 35.754 + + + + 35.935 + + + + 35.910 + + + + 35.990 + + + + 36.226 + + + + 36.266 + + + + 36.452 + + + + 36.514 + + + + 36.729 + + + + 36.869 + + + + 36.958 + + + + 37.230 + + + + 37.322 + + + + 37.398 + + + + 37.574 + + + + 37.764 + + + + 37.824 + + + + 37.984 + + + + 38.198 + + + + 38.345 + + + + 38.394 + + + + 38.473 + + + + 38.560 + + + + 38.771 + + + + 38.995 + + + + 39.132 + + + + 39.200 + + + + 39.336 + + + + 39.444 + + + + 39.635 + + + + 39.863 + + + + 39.937 + + + + 39.848 + + + + 40.056 + + + + 40.262 + + + + 40.399 + + + + 40.438 + + + + 40.448 + + + + 40.625 + + + + 40.783 + + + + 40.748 + + + + 40.874 + + + + 41.090 + + + + 41.182 + + + + 41.269 + + + + 41.380 + + + + 41.406 + + + + 41.463 + + + + 41.489 + + + + 41.756 + + + + 41.850 + + + + 42.141 + + + + 42.401 + + + + 42.417 + + + + 42.524 + + + + 42.650 + + + + 42.903 + + + + 43.016 + + + + 42.913 + + + + 43.041 + + + + 43.218 + + + + 43.434 + + + + 43.661 + + + + 43.821 + + + + 43.687 + + + + 43.808 + + + + 43.849 + + + + 43.784 + + + + 43.654 + + + + 43.830 + + + + 43.961 + + + + 43.834 + + + + 43.989 + + + + 44.058 + + + + 44.062 + + + + 44.029 + + + + 44.015 + + + + 44.024 + + + + 44.061 + + + + 44.147 + + + + 44.242 + + + + 44.144 + + + + 44.170 + + + + 44.146 + + + + 44.186 + + + + 44.202 + + + + 44.134 + + + + 44.134 + + + + 44.140 + + + + 44.013 + + + + 43.652 + + + + 43.784 + + + + 43.531 + + + + 43.537 + + + + 43.446 + + + + 43.317 + + + + 43.062 + + + + 42.976 + + + + 42.950 + + + + 42.975 + + + + 42.278 + + + + 42.218 + + + + 42.205 + + + + 42.145 + + + + 41.932 + + + + 41.985 + + + + 41.692 + + + + 41.463 + + + + 41.289 + + + + 41.187 + + + + 41.122 + + + + 40.973 + + + + 40.861 + + + + 40.815 + + + + 40.861 + + + + 40.826 + + + + 40.245 + + + + 40.022 + + + + 39.513 + + + + 39.390 + + + + 38.550 + + + + 38.290 + + + + 37.876 + + + + 37.764 + + + + 37.305 + + + + 36.971 + + + + 36.700 + + + + 36.392 + + + + 36.304 + + + + 35.896 + + + + 35.595 + + + + 35.036 + + + + 34.585 + + + + 34.293 + + + + 33.940 + + + + 33.087 + + + + 32.805 + + + + 32.357 + + + + 32.243 + + + + 32.223 + + + + 32.564 + + + + 32.037 + + + + 32.057 + + + + 32.196 + + + + 31.767 + + + + 31.544 + + + + 31.574 + + + + 31.639 + + + + 31.652 + + + + 31.762 + + + + 31.796 + + + + 31.724 + + + + 31.012 + + + + 31.029 + + + + 31.064 + + + + 31.551 + + + + 31.551 + + + + 31.438 + + + + 31.644 + + + + 31.887 + + + + 31.964 + + + + 32.203 + + + + 32.119 + + + + 31.948 + + + + 31.995 + + + + 31.874 + + + + 32.074 + + + + 32.155 + + + + 32.289 + + + + 32.512 + + + + 32.564 + + + + 32.663 + + + + 32.715 + + + + 32.724 + + + + 32.878 + + + + 32.961 + + + + 33.092 + + + + 33.341 + + + + 33.426 + + + + 33.471 + + + + 33.777 + + + + 34.089 + + + + 34.522 + + + + 34.656 + + + + 34.804 + + + + 35.141 + + + + 35.262 + + + + 35.700 + + + + 36.011 + + + + 36.045 + + + + 36.576 + + + + 36.685 + + + + 36.888 + + + + 37.221 + + + + 37.827 + + + + 37.920 + + + + 38.044 + + + + 38.438 + + + + 38.595 + + + + 38.746 + + + + 38.522 + + + + 38.676 + + + + 39.020 + + + + 39.126 + + + + 39.222 + + + + 39.493 + + + + 39.858 + + + + 39.935 + + + + 40.095 + + + + 40.251 + + + + 40.461 + + + + 40.707 + + + + 40.789 + + + + 41.059 + + + + 41.265 + + + + 41.629 + + + + 41.920 + + + + 41.874 + + + + 42.289 + + + + 42.392 + + + + 42.574 + + + + 42.878 + + + + 42.955 + + + + 43.265 + + + + 43.449 + + + + 43.703 + + + + 43.853 + + + + 43.864 + + + + 44.067 + + + + 44.203 + + + + 44.306 + + + + 44.504 + + + + 44.431 + + + + 44.564 + + + + 44.837 + + + + 45.295 + + + + 45.262 + + + + 45.400 + + + + 45.460 + + + + 45.651 + + + + 46.054 + + + + 46.018 + + + + 46.187 + + + + 46.484 + + + + 46.632 + + + + 46.765 + + + + 46.901 + + + + 47.134 + + + + 47.228 + + + + 47.411 + + + + 47.665 + + + + 47.706 + + + + 47.875 + + + + 47.966 + + + + 48.037 + + + + 48.170 + + + + 48.184 + + + + 48.446 + + + + 48.536 + + + + 48.796 + + + + 48.891 + + + + 48.928 + + + + 48.965 + + + + 49.116 + + + + 49.196 + + + + 49.236 + + + + 49.537 + + + + 49.392 + + + + 49.417 + + + + 49.629 + + + + 49.564 + + + + 49.853 + + + + 49.983 + + + + 50.066 + + + + 50.275 + + + + 50.247 + + + + 50.314 + + + + 50.437 + + + + 50.361 + + + + 50.803 + + + + 50.693 + + + + 50.921 + + + + 51.133 + + + + 51.044 + + + + 51.065 + + + + 51.203 + + + + 51.148 + + + + 51.268 + + + + 51.226 + + + + 51.230 + + + + 51.427 + + + + 51.359 + + + + 51.522 + + + + 51.380 + + + + 51.328 + + + + 51.317 + + + + 51.300 + + + + 51.261 + + + + 51.300 + + + + 51.272 + + + + 51.086 + + + + 51.133 + + + + 51.162 + + + + 51.082 + + + + 51.012 + + + + 51.159 + + + + 50.768 + + + + 50.835 + + + + 50.673 + + + + 50.649 + + + + 50.815 + + + + 50.655 + + + + 50.448 + + + + 50.394 + + + + 50.449 + + + + 50.387 + + + + 50.468 + + + + 50.451 + + + + 50.598 + + + + 50.511 + + + + 50.573 + + + + 50.523 + + + + 50.584 + + + + 50.568 + + + + 50.636 + + + + 50.795 + + + + 50.586 + + + + 50.831 + + + + 50.868 + + + + 50.763 + + + + 50.802 + + + + 50.749 + + + + 50.717 + + + + 50.804 + + + + 50.762 + + + + 50.645 + + + + 50.709 + + + + 50.611 + + + + 50.653 + + + + 50.581 + + + + 50.732 + + + + 50.769 + + + + 50.076 + + + + 49.831 + + + + + diff --git a/vendor/phayes/geophp/tests/input/an_empty_polygon.wkt b/vendor/phayes/geophp/tests/input/an_empty_polygon.wkt new file mode 100644 index 0000000..04c7519 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/an_empty_polygon.wkt @@ -0,0 +1 @@ +POLYGON EMPTY \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/barret_spur.gpx b/vendor/phayes/geophp/tests/input/barret_spur.gpx new file mode 100644 index 0000000..9d48160 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/barret_spur.gpx @@ -0,0 +1,219 @@ + + 1374Vista Ridge TrailheadTrail Head + 1777Wy'East Basin + 1823Dollar Lake + 2394Barrett SpurSummit + + Barrett Spur 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Barrett Spur 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/phayes/geophp/tests/input/big_n_ugly.kml b/vendor/phayes/geophp/tests/input/big_n_ugly.kml new file mode 100644 index 0000000..59ae0a3 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/big_n_ugly.kml @@ -0,0 +1,915 @@ + + + + KML Samples + 1 + Unleash your creativity with the help of these examples! + + + + + + + + + + + + + + Placemarks + These are just some of the different kinds of placemarks with + which you can mark your favorite places + + -122.0839597145766 + 37.42222904525232 + 0 + -148.4122922628044 + 40.5575073395506 + 500.6566641072245 + + + Simple placemark + Attached to the ground. Intelligently places itself at the + height of the underlying terrain. + + -122.0822035425683,37.42228990140251,0 + + + + Floating placemark + 0 + Floats a defined distance above the ground. + + -122.0839597145766 + 37.42222904525232 + 0 + -148.4122922628044 + 40.5575073395506 + 500.6566641072245 + + #downArrowIcon + + relativeToGround + -122.084075,37.4220033612141,50 + + + + Extruded placemark + 0 + Tethered to the ground by a customizable + "tail" + + -122.0845787421525 + 37.42215078737763 + 0 + -148.4126684946234 + 40.55750733918048 + 365.2646606980322 + + #globeIcon + + 1 + relativeToGround + -122.0857667006183,37.42156927867553,50 + + + + + Styles and Markup + 0 + With KML it is easy to create rich, descriptive markup to + annotate and enrich your placemarks + + -122.0845787422371 + 37.42215078726837 + 0 + -148.4126777488172 + 40.55750733930874 + 365.2646826292919 + + #noDrivingDirections + + Highlighted Icon + 0 + Place your mouse over the icon to see it display the new + icon + + -122.0856552124024 + 37.4224281311035 + 0 + 0 + 0 + 265.8520424250024 + + + + + + normal + #normalPlacemark + + + highlight + #highlightPlacemark + + + + Roll over this icon + 0 + #exampleStyleMap + + -122.0856545755255,37.42243077405461,0 + + + + + Descriptive HTML + 0 +
+Placemark descriptions can be enriched by using many standard HTML tags.
+For example: +
+Styles:
+Italics, +Bold, +Underlined, +Strike Out, +subscriptsubscript, +superscriptsuperscript, +Big, +Small, +Typewriter, +Emphasized, +Strong, +Code +
+Fonts:
+red by name, +leaf green by hexadecimal RGB +
+size 1, +size 2, +size 3, +size 4, +size 5, +size 6, +size 7 +
+Times, +Verdana, +Arial
+
+Links: +
+Google Earth! +
+ or: Check out our website at www.google.com +
+Alignment:
+

left

+

center

+

right

+
+Ordered Lists:
+
  1. First
  2. Second
  3. Third
+
  1. First
  2. Second
  3. Third
+
  1. First
  2. Second
  3. Third
+
+Unordered Lists:
+
  • A
  • B
  • C
+
  • A
  • B
  • C
+
  • A
  • B
  • C
+
+Definitions:
+
+
Google:
The best thing since sliced bread
+
+
+Centered:
+Time present and time past
+Are both perhaps present in time future,
+And time future contained in time past.
+If all time is eternally present
+All time is unredeemable.
+
+
+Block Quote: +
+
+We shall not cease from exploration
+And the end of all our exploring
+Will be to arrive where we started
+And know the place for the first time.
+-- T.S. Eliot +
+
+
+Headings:
+

Header 1

+

Header 2

+

Header 3

+

Header 4

+

Header 5

+
+Images:
+Remote image
+
+Scaled image
+
+
+Simple Tables:
+ + + +
12345
abcde
+
+[Did you notice that double-clicking on the placemark doesn't cause the viewer to take you anywhere? This is because it is possible to directly author a "placeless placemark". If you look at the code for this example, you will see that it has neither a point coordinate nor a LookAt element.]]]>
+
+
+ + Ground Overlays + 0 + Examples of ground overlays + + Large-scale overlay on terrain + 0 + Overlay shows Mount Etna erupting on July 13th, 2001. + + 15.02468937557116 + 37.67395167941667 + 0 + -16.5581842842829 + 58.31228652890705 + 30350.36838438907 + + + http://code.google.com/apis/kml/documentation/etna.jpg + + + 37.91904192681665 + 37.46543388598137 + 15.35832653742206 + 14.60128369746704 + -0.1556640799496235 + + + + + Screen Overlays + 0 + Screen overlays have to be authored directly in KML. These + examples illustrate absolute and dynamic positioning in screen space. + + Simple crosshairs + 0 + This screen overlay uses fractional positioning to put the + image in the exact center of the screen + + http://code.google.com/apis/kml/documentation/crosshairs.png + + + + + + + + Absolute Positioning: Top left + 0 + + http://code.google.com/apis/kml/documentation/top_left.jpg + + + + + + + + Absolute Positioning: Top right + 0 + + http://code.google.com/apis/kml/documentation/top_right.jpg + + + + + + + + Absolute Positioning: Bottom left + 0 + + http://code.google.com/apis/kml/documentation/bottom_left.jpg + + + + + + + + Absolute Positioning: Bottom right + 0 + + http://code.google.com/apis/kml/documentation/bottom_right.jpg + + + + + + + + Dynamic Positioning: Top of screen + 0 + + http://code.google.com/apis/kml/documentation/dynamic_screenoverlay.jpg + + + + + + + + Dynamic Positioning: Right of screen + 0 + + http://code.google.com/apis/kml/documentation/dynamic_right.jpg + + + + + + + + + Paths + 0 + Examples of paths. Note that the tessellate tag is by default + set to 0. If you want to create tessellated lines, they must be authored + (or edited) directly in KML. + + Tessellated + 0 + tag has a value of 1, the line will contour to the underlying terrain]]> + + -112.0822680013139 + 36.09825589333556 + 0 + 103.8120432044965 + 62.04855796276328 + 2889.145007690472 + + + 1 + -112.0814237830345,36.10677870477137,0 + -112.0870267752693,36.0905099328766,0 + + + + Untessellated + 0 + tag has a value of 0, the line follow a simple straight-line path from point to point]]> + + -112.0822680013139 + 36.09825589333556 + 0 + 103.8120432044965 + 62.04855796276328 + 2889.145007690472 + + + 0 + -112.080622229595,36.10673460007995,0 + -112.085242575315,36.09049598612422,0 + + + + Absolute + 0 + Transparent purple line + + -112.2719329043177 + 36.08890633450894 + 0 + -106.8161545998597 + 44.60763714063257 + 2569.386744398339 + + #transPurpleLineGreenPoly + + 1 + absolute + -112.265654928602,36.09447672602546,2357 + -112.2660384528238,36.09342608838671,2357 + -112.2668139013453,36.09251058776881,2357 + -112.2677826834445,36.09189827357996,2357 + -112.2688557510952,36.0913137941187,2357 + -112.2694810717219,36.0903677207521,2357 + -112.2695268555611,36.08932171487285,2357 + -112.2690144567276,36.08850916060472,2357 + -112.2681528815339,36.08753813597956,2357 + -112.2670588176031,36.08682685262568,2357 + -112.2657374587321,36.08646312301303,2357 + + + + Absolute Extruded + 0 + Transparent green wall with yellow outlines + + -112.2643334742529 + 36.08563154742419 + 0 + -125.7518698668815 + 44.61038665812578 + 4451.842204068102 + + #yellowLineGreenPoly + + 1 + 1 + absolute + -112.2550785337791,36.07954952145647,2357 + -112.2549277039738,36.08117083492122,2357 + -112.2552505069063,36.08260761307279,2357 + -112.2564540158376,36.08395660588506,2357 + -112.2580238976449,36.08511401044813,2357 + -112.2595218489022,36.08584355239394,2357 + -112.2608216347552,36.08612634548589,2357 + -112.262073428656,36.08626019085147,2357 + -112.2633204928495,36.08621519860091,2357 + -112.2644963846444,36.08627897945274,2357 + -112.2656969554589,36.08649599090644,2357 + + + + Relative + 0 + Black line (10 pixels wide), height tracks terrain + + -112.2580438551384 + 36.1072674824385 + 0 + 4.947421249553717 + 44.61324882043339 + 2927.61105910266 + + #thickBlackLine + + 1 + relativeToGround + -112.2532845153347,36.09886943729116,645 + -112.2540466121145,36.09919570465255,645 + -112.254734666947,36.09984998366178,645 + -112.255493345654,36.10051310621746,645 + -112.2563157098468,36.10108441943419,645 + -112.2568033076439,36.10159722088088,645 + -112.257494011321,36.10204323542867,645 + -112.2584106072308,36.10229131995655,645 + -112.2596588987972,36.10240001286358,645 + -112.2610581199487,36.10213176873407,645 + -112.2626285262793,36.10157011437219,645 + + + + Relative Extruded + 0 + Opaque blue walls with red outline, height tracks terrain + + -112.2683594333433 + 36.09884362144909 + 0 + -72.24271551768405 + 44.60855445139561 + 2184.193522571467 + + #redLineBluePoly + + 1 + 1 + relativeToGround + -112.2656634181359,36.09445214722695,630 + -112.2652238941097,36.09520916122063,630 + -112.2645079986395,36.09580763864907,630 + -112.2638827428817,36.09628572284063,630 + -112.2635746835406,36.09679275951239,630 + -112.2635711822407,36.09740038871899,630 + -112.2640296531825,36.09804913435539,630 + -112.264327720538,36.09880337400301,630 + -112.2642436562271,36.09963644790288,630 + -112.2639148687042,36.10055381117246,630 + -112.2626894973474,36.10149062823369,630 + + + + + Polygons + 0 + Examples of polygon shapes + + Google Campus + 0 + A collection showing how easy it is to create 3-dimensional + buildings + + -122.084120030116 + 37.42174011925477 + 0 + -34.82469740081282 + 53.454348562403 + 276.7870053764046 + + + Building 40 + 0 + #transRedPoly + + 1 + relativeToGround + + + -122.0848938459612,37.42257124044786,17 + -122.0849580979198,37.42211922626856,17 + -122.0847469573047,37.42207183952619,17 + -122.0845725380962,37.42209006729676,17 + -122.0845954886723,37.42215932700895,17 + -122.0838521118269,37.42227278564371,17 + -122.083792243335,37.42203539112084,17 + -122.0835076656616,37.42209006957106,17 + -122.0834709464152,37.42200987395161,17 + -122.0831221085748,37.4221046494946,17 + -122.0829247374572,37.42226503990386,17 + -122.0829339169385,37.42231242843094,17 + -122.0833837359737,37.42225046087618,17 + -122.0833607854248,37.42234159228745,17 + -122.0834204551642,37.42237075460644,17 + -122.083659133885,37.42251292011001,17 + -122.0839758438952,37.42265873093781,17 + -122.0842374743331,37.42265143972521,17 + -122.0845036949503,37.4226514386435,17 + -122.0848020460801,37.42261133916315,17 + -122.0847882750515,37.42256395055121,17 + -122.0848938459612,37.42257124044786,17 + + + + + + Building 41 + 0 + #transBluePoly + + 1 + relativeToGround + + + -122.0857412771483,37.42227033155257,17 + -122.0858169768481,37.42231408832346,17 + -122.085852582875,37.42230337469744,17 + -122.0858799945639,37.42225686138789,17 + -122.0858860101409,37.4222311076138,17 + -122.0858069157288,37.42220250173855,17 + -122.0858379542653,37.42214027058678,17 + -122.0856732640519,37.42208690214408,17 + -122.0856022926407,37.42214885429042,17 + -122.0855902778436,37.422128290487,17 + -122.0855841672237,37.42208171967246,17 + -122.0854852065741,37.42210455874995,17 + -122.0855067264352,37.42214267949824,17 + -122.0854430712915,37.42212783846172,17 + -122.0850990714904,37.42251282407603,17 + -122.0856769818632,37.42281815323651,17 + -122.0860162273783,37.42244918858722,17 + -122.0857260327004,37.42229239604253,17 + -122.0857412771483,37.42227033155257,17 + + + + + + Building 42 + 0 + #transGreenPoly + + 1 + relativeToGround + + + -122.0857862287242,37.42136208886969,25 + -122.0857312990603,37.42136935989481,25 + -122.0857312992918,37.42140934910903,25 + -122.0856077073679,37.42138390166565,25 + -122.0855802426516,37.42137299550869,25 + -122.0852186221971,37.42137299504316,25 + -122.0852277765639,37.42161656508265,25 + -122.0852598189347,37.42160565894403,25 + -122.0852598185499,37.42168200156,25 + -122.0852369311478,37.42170017860346,25 + -122.0852643957828,37.42176197982575,25 + -122.0853239032746,37.42176198013907,25 + -122.0853559454324,37.421852864452,25 + -122.0854108752463,37.42188921823734,25 + -122.0854795379357,37.42189285337048,25 + -122.0855436229819,37.42188921797546,25 + -122.0856260178042,37.42186013499926,25 + -122.085937287963,37.42186013453605,25 + -122.0859428718666,37.42160898590042,25 + -122.0859655469861,37.42157992759144,25 + -122.0858640462341,37.42147115002957,25 + -122.0858548911215,37.42140571326184,25 + -122.0858091162768,37.4214057134039,25 + -122.0857862287242,37.42136208886969,25 + + + + + + Building 43 + 0 + #transYellowPoly + + 1 + relativeToGround + + + -122.0844371128284,37.42177253003091,19 + -122.0845118855746,37.42191111542896,19 + -122.0850470999805,37.42178755121535,19 + -122.0850719913391,37.42143663023161,19 + -122.084916406232,37.42137237822116,19 + -122.0842193868167,37.42137237801626,19 + -122.08421938659,37.42147617161496,19 + -122.0838086419991,37.4214613409357,19 + -122.0837899728564,37.42131306410796,19 + -122.0832796534698,37.42129328840593,19 + -122.0832609819207,37.42139213944298,19 + -122.0829373621737,37.42137236399876,19 + -122.0829062425667,37.42151569778871,19 + -122.0828502269665,37.42176282576465,19 + -122.0829435788635,37.42176776969635,19 + -122.083217411188,37.42179248552686,19 + -122.0835970430103,37.4217480074456,19 + -122.0839455556771,37.42169364237603,19 + -122.0840077894637,37.42176283815853,19 + -122.084113587521,37.42174801104392,19 + -122.0840762473784,37.42171341292375,19 + -122.0841447047739,37.42167881534569,19 + -122.084144704223,37.42181720660197,19 + -122.0842503333074,37.4218170700446,19 + -122.0844371128284,37.42177253003091,19 + + + + + + + Extruded Polygon + A simple way to model a building + + The Pentagon + + -77.05580139178142 + 38.870832443487 + 59.88865561738225 + 48.09646074797388 + 742.0552506670548 + + + 1 + relativeToGround + + + -77.05788457660967,38.87253259892824,100 + -77.05465973756702,38.87291016281703,100 + -77.05315536854791,38.87053267794386,100 + -77.05552622493516,38.868757801256,100 + -77.05844056290393,38.86996206506943,100 + -77.05788457660967,38.87253259892824,100 + + + + + -77.05668055019126,38.87154239798456,100 + -77.05542625960818,38.87167890344077,100 + -77.05485125901024,38.87076535397792,100 + -77.05577677433152,38.87008686581446,100 + -77.05691162017543,38.87054446963351,100 + -77.05668055019126,38.87154239798456,100 + + + + + + + Absolute and Relative + 0 + Four structures whose roofs meet exactly. Turn on/off + terrain to see the difference between relative and absolute + positioning. + + -112.3348969157552 + 36.14845533214919 + 0 + -86.91235037566909 + 49.30695423894192 + 990.6761201087104 + + + Absolute + 0 + #transBluePoly + + 1 + absolute + + + -112.3382510731295,36.14888505105318,1784 + -112.3356128688403,36.14781540589019,1784 + -112.3368169371048,36.14658677734382,1784 + -112.3374408457543,36.14762778914076,1784 + -112.3382510731295,36.14888505105318,1784 + + + + + + Absolute Extruded + 0 + #transRedPoly + + 1 + 1 + absolute + + + -112.3396586818843,36.14637618647505,1784 + -112.3380597654315,36.14531751871353,1784 + -112.3368254237788,36.14659596244607,1784 + -112.3384555043203,36.14762621763982,1784 + -112.3396586818843,36.14637618647505,1784 + + + + + + Relative + 0 + + -112.3350152490417 + 36.14943123077423 + 0 + -118.9214100848499 + 37.92486261093203 + 345.5169113679813 + + #transGreenPoly + + 1 + relativeToGround + + + -112.3349463145932,36.14988705767721,100 + -112.3354019540677,36.14941108398372,100 + -112.3344428289146,36.14878490381308,100 + -112.3331289492913,36.14780840132443,100 + -112.3317019516947,36.14680755678357,100 + -112.331131440106,36.1474173426228,100 + -112.332616324338,36.14845453364654,100 + -112.3339876620524,36.14926570522069,100 + -112.3349463145932,36.14988705767721,100 + + + + + + Relative Extruded + 0 + + -112.3351587892382 + 36.14979247129029 + 0 + -55.42811560891606 + 56.10280503739589 + 401.0997279712519 + + #transYellowPoly + + 1 + 1 + relativeToGround + + + -112.3348783983763,36.1514008468736,100 + -112.3372535345629,36.14888517553886,100 + -112.3356068927954,36.14781612679284,100 + -112.3350034807972,36.14846469024177,100 + -112.3358353861232,36.1489624162954,100 + -112.3345888301373,36.15026229372507,100 + -112.3337937856278,36.14978096026463,100 + -112.3331798208424,36.1504472788618,100 + -112.3348783983763,36.1514008468736,100 + + + + + + +
+
diff --git a/vendor/phayes/geophp/tests/input/box.georss b/vendor/phayes/geophp/tests/input/box.georss new file mode 100644 index 0000000..9dc5a2f --- /dev/null +++ b/vendor/phayes/geophp/tests/input/box.georss @@ -0,0 +1 @@ +42.943 -71.032 43.039 -69.856 diff --git a/vendor/phayes/geophp/tests/input/cdata.kml b/vendor/phayes/geophp/tests/input/cdata.kml new file mode 100644 index 0000000..f5bbe74 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/cdata.kml @@ -0,0 +1,19 @@ + + + + + CDATA example + + CDATA Tags are useful! +

Text is more readable and + easier to write when you can avoid using entity + references.

+ ]]> +
+ + 102.595626,14.996729 + +
+
+
diff --git a/vendor/phayes/geophp/tests/input/circle.georss b/vendor/phayes/geophp/tests/input/circle.georss new file mode 100644 index 0000000..8f6a18e --- /dev/null +++ b/vendor/phayes/geophp/tests/input/circle.georss @@ -0,0 +1 @@ +42.943 -71.032 500 diff --git a/vendor/phayes/geophp/tests/input/empty_point.wkt b/vendor/phayes/geophp/tests/input/empty_point.wkt new file mode 100644 index 0000000..41dec0b --- /dev/null +++ b/vendor/phayes/geophp/tests/input/empty_point.wkt @@ -0,0 +1 @@ +POINT EMPTY \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/fells_loop.gpx b/vendor/phayes/geophp/tests/input/fells_loop.gpx new file mode 100644 index 0000000..d8a1df5 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/fells_loop.gpx @@ -0,0 +1,1077 @@ + + + + + + 44.586548 + + 5066 + + Crossing + + + + 57.607200 + + 5067 + + Dot + + + + 44.826904 + + 5096 + + Dot + + + + 50.594727 + + 5142 + + Dot + + + + 127.711200 + + 5156 + + Dot + + + + 96.926400 + + 5224 + + Dot + + + + 82.600800 + + 5229 + + Dot + + + + 82.905600 + + 5237 + + Dot + + + + 66.696655 + + 5254 + + Dot + + + + 74.627442 + + 5258 + + Dot + + + + 65.254761 + + 5264 + + Dot + + + + 77.419200 + + 526708 + + Dot + + + + 74.676000 + + 526750 + + Dot + + + + 78.713135 + + 527614 + + Dot + + + + 78.713135 + + 527631 + + Dot + + + + 68.275200 + + 5278 + + Dot + + + + 64.008000 + + 5289 + + Dot + + + + 52.997925 + + 5374FIRE + + Dot + + + + 56.388000 + + 5376 + + Dot + + + + 56.388000 + + 6006 + + Dot + + + + 46.028564 + + 6006BLUE + + Dot + + + + 37.616943 + + 6014MEADOW + + Dot + + + + 56.388000 + + 6029 + + Dot + + + + 50.292000 + + 6053 + + Dot + + + + 25.603200 + + 6066 + + Dot + + + + 34.442400 + + 6067 + + Dot + + + + 30.480000 + + 6071 + + Dot + + + + 15.240000 + + 6073 + + Dot + + + + 37.795200 + + 6084 + + Dot + + + + 64.008000 + + 6130 + + Dot + + + + 64.008000 + + 6131 + + Dot + + + + 62.788800 + + 6153 + + Dot + + + + 55.473600 + + 6171 + + Dot + + + + 62.484000 + + 6176 + + Dot + + + + 62.179200 + + 6177 + + Dot + + + + 69.799200 + + 6272 + + Dot + + + + 73.152000 + + 6272 + + Dot + + + + 70.104000 + + 6278 + + Dot + + + + 57.564209 + + 6280 + + Dot + + + + 66.696655 + + 6283 + + Dot + + + + 72.945191 + + 6289 + + Dot + + + + 72.847200 + + 6297 + + Dot + + + + 53.644800 + + 6328 + + Dot + + + + 43.891200 + + 6354 + + Dot + + + + 48.768000 + + 635722 + + Dot + + + + 49.072800 + + 635783 + + Dot + + + + 62.484000 + + 6373 + + Dot + + + + 3.962400 + + 6634 + + Dot + + + + 13.411200 + + 6979 + + Dot + + + + 34.012085 + + 6997 + + Dot + + + + 87.782400 + + BEAR HILL + BEAR HILL TOWER + + Tall Tower + + + + 23.469600 + + BELLEVUE + BELLEVUE + + Parking Area + + + + 43.384766 + + 6016 + + Trailhead + + + + 89.916000 + + 5236BRIDGE + + Bridge + + + + 55.473600 + + 5376BRIDGE + + Bridge + + + + 52.730400 + + 6181CROSS + + Crossing + + + + 45.110400 + + 6042CROSS + + Crossing + + + + DARKHOLLPO + + Fishing Area + + + 56.083200 + + 6121DEAD + + Danger Area + + + + 117.043200 + + 5179DEAD + + Danger Area + + + + 69.494400 + + 5299DEAD + + Danger Area + + + + 56.997600 + + 5376DEAD + + Danger Area + + + + 46.939200 + + 6353DEAD + + Danger Area + + + + 61.264800 + + 6155DEAD + + Danger Area + + + + 110.947200 + + GATE14 + + Truck Stop + + + + 77.724000 + + GATE16 + + Truck Stop + + + + 65.836800 + + GATE17 + + Truck Stop + + + + 57.302400 + + GATE19 + + Truck Stop + + + + 49.377600 + + GATE21 + + Truck Stop + + + + 81.076800 + + GATE24 + + Truck Stop + + + + 21.515015 + + GATE5 + + Truck Stop + + + + 26.561890 + + GATE6 + + Trailhead + + + + 32.004000 + + 6077LOGS + + Amusement Park + + + + 119.809082 + + 5148NANEPA + + Trailhead + + + + 73.761600 + + 5267OBSTAC + + Amusement Park + + + + 45.307495 + + PANTHRCAVE + + Tunnel + + + + 77.992066 + + 5252PURPLE + + Summit + + + + 67.970400 + + 5287WATER + + Swimming Area + + + + 81.076800 + + 5239ROAD + + Truck Stop + + + + 67.360800 + + 5278ROAD + + Truck Stop + + + + 53.949600 + + 5058ROAD + ROAD CROSSING + + Dot + + + + 69.799200 + + SHEEPFOLD + + Parking Area + + + + 64.008000 + + SOAPBOX + + Cemetery + + + + 64.533692 + + 5376STREAM + + Bridge + + + + 61.649902 + + 5144SUMMIT + + Summit + + + + 67.360800 + + 5150TANK + WATER TANK + + Museum + + + + BELLEVUE + + 1 + + 23.469600 + + BELLEVUE + BELLEVUE + + Parking Area + + + + 26.561890 + + GATE6 + + Trailhead + + + + 45.307495 + + PANTHRCAVE + + Tunnel + + + + 37.616943 + + 6014MEADOW + + Dot + + + + 56.388000 + + 6006 + + Dot + + + + 46.028564 + + 6006BLUE + + Dot + + + + 44.826904 + + 5096 + + Dot + + + + 44.586548 + + 5066 + + Crossing + + + + 57.607200 + + 5067 + + Dot + + + + 53.949600 + + 5058ROAD + ROAD CROSSING + + Dot + + + + 67.360800 + + 5150TANK + WATER TANK + + Museum + + + + 50.594727 + + 5142 + + Dot + + + + 61.649902 + + 5144SUMMIT + + Summit + + + + 127.711200 + + 5156 + + Dot + + + + 119.809082 + + 5148NANEPA + + Trailhead + + + + 74.627442 + + 5258 + + Dot + + + + 77.992066 + + 5252PURPLE + + Summit + + + + 78.713135 + + 527631 + + Dot + + + + 78.713135 + + 527614 + + Dot + + + + 73.761600 + + 5267OBSTAC + + Amusement Park + + + + 68.275200 + + 5278 + + Dot + + + + 64.008000 + + 5289 + + Dot + + + + 52.997925 + + 5374FIRE + + Dot + + + + 56.388000 + + 5376 + + Dot + + + + 64.533692 + + 5376STREAM + + Bridge + + + + 53.644800 + + 6328 + + Dot + + + + 48.768000 + + 635722 + + Dot + + + + 49.072800 + + 635783 + + Dot + + + + 62.484000 + + 6373 + + Dot + + + + 87.782400 + + BEAR HILL + BEAR HILL TOWER + + Tall Tower + + + + 72.945191 + + 6289 + + Dot + + + + 72.847200 + + 6297 + + Dot + + + + 66.696655 + + 6283 + + Dot + + + + 57.564209 + + 6280 + + Dot + + + + 62.179200 + + 6177 + + Dot + + + + 62.484000 + + 6176 + + Dot + + + + 62.788800 + + 6153 + + Dot + + + + 55.473600 + + 6171 + + Dot + + + + 64.008000 + + 6131 + + Dot + + + + 64.008000 + + 6130 + + Dot + + + + 56.388000 + + 6029 + + Dot + + + + 56.388000 + + 6006 + + Dot + + + + 37.616943 + + 6014MEADOW + + Dot + + + + 45.307495 + + PANTHRCAVE + + Tunnel + + + + 26.561890 + + GATE6 + + Trailhead + + + + 23.469600 + + BELLEVUE + BELLEVUE + + Parking Area + + + + \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/geometrycollection.georss b/vendor/phayes/geophp/tests/input/geometrycollection.georss new file mode 100644 index 0000000..92bf895 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/geometrycollection.georss @@ -0,0 +1,29 @@ + + + Earthquakes + International earthquake observation labs + + 2005-12-13T18:30:02Z + + Dr. Thaddeus Remor + tremor@quakelab.edu + + urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 + + This has multiple georss entries in it + + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + 2005-08-17T07:02:32Z + We just had a big one. + 45.256 -71.92 + 42.256 -69.92 + 45.256 -110.45 46.46 -109.48 43.84 -109.86 + 45.256 -110.45 46.46 -109.48 43.84 -109.86 45.256 -110.45 + + + Another Entryd + Another point. + 46.256 -70.92 + + \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/geometrycollection.wkt b/vendor/phayes/geophp/tests/input/geometrycollection.wkt new file mode 100644 index 0000000..ef2fee5 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/geometrycollection.wkt @@ -0,0 +1 @@ +GEOMETRYCOLLECTION (POINT (4 6), LINESTRING (4 6,7 10)) diff --git a/vendor/phayes/geophp/tests/input/line.georss b/vendor/phayes/geophp/tests/input/line.georss new file mode 100644 index 0000000..3ade523 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/line.georss @@ -0,0 +1 @@ +45.256 -110.45 46.46 -109.48 43.84 -109.86 diff --git a/vendor/phayes/geophp/tests/input/linestring.wkt b/vendor/phayes/geophp/tests/input/linestring.wkt new file mode 100644 index 0000000..cc54277 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/linestring.wkt @@ -0,0 +1 @@ +LINESTRING (30 10, 10 30, 40 40) diff --git a/vendor/phayes/geophp/tests/input/long.geohash b/vendor/phayes/geophp/tests/input/long.geohash new file mode 100644 index 0000000..7793c56 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/long.geohash @@ -0,0 +1 @@ +xn76urx4epb0 diff --git a/vendor/phayes/geophp/tests/input/multilinestring.ewkt b/vendor/phayes/geophp/tests/input/multilinestring.ewkt new file mode 100644 index 0000000..9fe05b4 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/multilinestring.ewkt @@ -0,0 +1 @@ +SRID=4269;MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)) diff --git a/vendor/phayes/geophp/tests/input/multilinestring.wkt b/vendor/phayes/geophp/tests/input/multilinestring.wkt new file mode 100644 index 0000000..f21a403 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/multilinestring.wkt @@ -0,0 +1 @@ +MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10)) diff --git a/vendor/phayes/geophp/tests/input/multipolygon.wkb b/vendor/phayes/geophp/tests/input/multipolygon.wkb new file mode 100644 index 0000000000000000000000000000000000000000..f8e9b826b1c639061284bff9c38267b8ffb0b51b GIT binary patch literal 179 zcmZQ%V_;xl0%AsH5COz2KnwwP4iMS|N~=I=7YNnqY>) NXqaU%bue*+egL_d2yXxY literal 0 HcmV?d00001 diff --git a/vendor/phayes/geophp/tests/input/multipolygon.wkt b/vendor/phayes/geophp/tests/input/multipolygon.wkt new file mode 100644 index 0000000..ddd06bf --- /dev/null +++ b/vendor/phayes/geophp/tests/input/multipolygon.wkt @@ -0,0 +1 @@ +MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5))) diff --git a/vendor/phayes/geophp/tests/input/multipolygon2.wkt b/vendor/phayes/geophp/tests/input/multipolygon2.wkt new file mode 100644 index 0000000..8a8e30a --- /dev/null +++ b/vendor/phayes/geophp/tests/input/multipolygon2.wkt @@ -0,0 +1 @@ +MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),((20 35, 45 20, 30 5, 10 10, 10 30, 20 35),(30 20, 20 25, 20 15, 30 20))) \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/multipolygon_big.wkt b/vendor/phayes/geophp/tests/input/multipolygon_big.wkt new file mode 100644 index 0000000..3105141 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/multipolygon_big.wkt @@ -0,0 +1 @@ +MULTIPOLYGON(((-111.557386371065249 56.684410828632991,-111.544980383084948 56.682722495117694,-111.547288554185783 56.682722128260217,-111.560588075947805 56.682719181298069,-111.557386371065249 56.684410828632991)),((-110.655582437704567 56.807505664432796,-110.647218116177612 56.80671710810411,-110.643673148613047 56.80670703768957,-110.634661802700208 56.806680985279918,-110.626296209431871 56.806082076023685,-110.619789771966879 56.80561606125984,-110.5970409749429 56.80197278849441,-110.567745946116929 56.801874761074451,-110.548280302758144 56.796448204044054,-110.528820744389193 56.791018371914532,-110.50936637365119 56.785585752864272,-110.499103824807818 56.779870244503989,-110.493664505516506 56.779682321259727,-110.459232293195328 56.774966230302333,-110.452380964820449 56.7553437574648,-110.460973901640784 56.73644164816924,-110.468543133012872 56.733989511060045,-110.468734744069124 56.733927426379722,-110.49081191233563 56.726770760707375,-110.504939293196699 56.730725178028258,-110.51009929403682 56.7293322843976,-110.517293546198189 56.726409894398806,-110.51740142820934 56.726366064822571,-110.518497304347093 56.725920828546457,-110.524819818539541 56.72135261004626,-110.53298393373845 56.717811508104461,-110.539501382430203 56.716050024775306,-110.551205211566966 56.715021179989229,-110.557051038337889 56.715042093200836,-110.580468421403637 56.711908263778916,-110.586313787793046 56.711927803774849,-110.598015077092683 56.710894559920987,-110.605335181932546 56.709578597305672,-110.627292440376905 56.705627879873539,-110.663393794830597 56.705730623582014,-110.663538147305005 56.705731013412404,-110.685733407778628 56.705788963215937,-110.700206118150547 56.708482132316114,-110.70716012535172 56.706590221683513,-110.712865090422667 56.705037800495646,-110.716703851889847 56.703324734967815,-110.741711396878614 56.692276649666439,-110.755996054226088 56.685774597223499,-110.763555924376149 56.682561807037608,-110.786065807609532 56.682658062055957,-110.786291755103306 56.682659007614262,-110.792653432098987 56.682685462107784,-110.792784153484533 56.682686002294886,-110.798848751416898 56.682710912543328,-110.799139846187586 56.6827121007843,-110.803154094737508 56.682728417465995,-110.803395644126624 56.682729395163207,-110.878371475521206 56.682749524228022,-110.842601133057414 56.691138787132822,-110.804527596605666 56.709371183118691,-110.804444377663174 56.709418115779826,-110.812386805922699 56.711617602716046,-110.829909318254479 56.716467059924653,-110.83864107900483 56.726127500382901,-110.843008838106513 56.73095737621427,-110.845618246469144 56.736749787830583,-110.856118433775805 56.745446286568786,-110.84554700937008 56.754117568824391,-110.842888085499581 56.759903378999716,-110.837223940619438 56.764031364102792,-110.829680334301614 56.767122561766321,-110.822135486908806 56.77021329996947,-110.816467511436898 56.774340333187212,-110.809129122886475 56.777545645401091,-110.803262239232467 56.779144471662335,-110.793369460953144 56.78003318215687,-110.792463649253023 56.781020234103892,-110.787553339424136 56.786369548702815,-110.772863045554871 56.794380158043118,-110.763083078717614 56.797040882218859,-110.743518547797734 56.802359777655127,-110.714222753358612 56.802296133135961,-110.692218066552414 56.806262050811284,-110.684882143536583 56.807583078045376,-110.655582437704567 56.807505664432796)),((-113.229119892737344 57.017440289033701,-113.225737165173769 57.016295214053798,-113.21708768328989 57.013366567110353,-113.211072678087248 57.01132938513755,-113.2092476894736 57.010711206063391,-113.207790520939668 57.010217584717289,-113.202051170124278 57.008273063384891,-113.198901798741744 57.006986889924526,-113.195750789844126 57.005699878010773,-113.194945446664846 57.005370912866049,-113.193664258781425 57.004847552670519,-113.193267941600581 57.004594355164357,-113.192644632579302 57.004196128419622,-113.192559085669927 57.004141472321301,-113.191800755343039 57.003656963814564,-113.189039854555844 57.001892836272205,-113.188906517620751 57.001807632383461,-113.186861633570743 57.0005008597197,-113.186472060246842 57.000203066002193,-113.185191133772506 56.999223870409665,-113.185154382128928 56.999195774897977,-113.181880641550833 56.996692883817275,-113.180693703009695 56.995785321481947,-113.176582401977441 56.992641538091178,-113.168362335220493 56.986353538708485,-113.159910801255208 56.979885623788924,-113.159784583097064 56.979789008068693,-113.156037217818778 56.976920237067326,-113.149414439823445 56.964172534646195,-113.147759358486127 56.960985608523025,-113.14644547542386 56.956414617390578,-113.146049760688939 56.949531447781538,-113.144386534557967 56.94496643003567,-113.144284334630797 56.94318654385075,-113.144280210654969 56.943114717479766,-113.144118180130235 56.940292402007948,-113.144114038820348 56.940220260145864,-113.143464734220686 56.928905144337101,-113.144600261487469 56.924292097213957,-113.144205370561025 56.917408883705278,-113.144990803753913 56.912801828279413,-113.14627460595392 56.909564400709307,-113.146391482792083 56.909269606873913,-113.146874653338415 56.90805087584333,-113.151407194327703 56.896614320881795,-113.151823310997443 56.895564022581375,-113.151851958309521 56.895491713244368,-113.1554629413112 56.886374923444301,-113.155491361003229 56.886303153626116,-113.156536335385539 56.883664032121146,-113.157818198359436 56.880426486510345,-113.161847704751906 56.873925978981816,-113.163006892733065 56.871404865312876,-113.163603520424147 56.870696238971618,-113.163664572834378 56.87062372418314,-113.172162276555696 56.860527615475149,-113.173689370936771 56.85720349888409,-113.173735755015301 56.857102522635223,-113.173777259010734 56.857012169664074,-113.173979212332995 56.856572516997801,-113.177951742237028 56.847922203810981,-113.206316490765232 56.831346507011489,-113.234656195696175 56.814764517624035,-113.24946788156501 56.814498342116977,-113.249760987900729 56.814493057035797,-113.261759778885704 56.814276111460693,-113.262855083231756 56.81425625010565,-113.285306352952887 56.813847014867058,-113.285569900529723 56.813842186965431,-113.286229005540733 56.813830110445735,-113.286417509766466 56.813826655916273,-113.293221241761501 56.813701779693311,-113.307183084084315 56.815971396557714,-113.307998534798202 56.816103898023691,-113.309875851856901 56.816408916774385,-113.31053034924706 56.816515248976813,-113.31542979992075 56.817311104127306,-113.321885803281376 56.818359385095647,-113.322053055565306 56.818386537119203,-113.322833576147971 56.818513244674229,-113.334813899909093 56.822577322158914,-113.340190544732323 56.824400476766286,-113.340308183996157 56.824440362195645,-113.352789079655977 56.828670871626237,-113.358641991615968 56.833142427388346,-113.358718430806235 56.833200817030978,-113.365113457498964 56.838084967863374,-113.369051158123639 56.841091529410825,-113.369127672402101 56.841149944438847,-113.373333005650579 56.84436016002163,-113.377444040484917 56.847497538265408,-113.381711945853297 56.850754187540275,-113.381802615923519 56.850823366013721,-113.3818040267588 56.850824442435162,-113.381880579221033 56.850882849350192,-113.383611561732494 56.852203467879932,-113.386753000523996 56.854985616618343,-113.386882165138289 56.855099997818499,-113.389044294374116 56.857014537063328,-113.389230939357844 56.857179797827868,-113.389266311475708 56.857211117105884,-113.390912320380778 56.858219380661012,-113.391031403823888 56.85829232229775,-113.393894440870625 56.860045884079931,-113.395509864875578 56.861670869584479,-113.395573740134978 56.861735119527623,-113.400623223981754 56.866813407986534,-113.412084459160738 56.870184827219205,-113.41220610449578 56.870220601258232,-113.431796004364458 56.875979236146641,-113.439010204487886 56.879472789335601,-113.439109412859352 56.879520824513925,-113.452743667678973 56.886120379360172,-113.452892101789232 56.886192206508852,-113.461492257941529 56.890353034874607,-113.461590818396346 56.890400710365725,-113.462425000207716 56.890804211265262,-113.473367967011882 56.898978687222908,-113.473447300124676 56.899037932849616,-113.476478263594117 56.901301262379818,-113.476995545819008 56.901687500414432,-113.483839962276051 56.906797039736752,-113.484237061676183 56.907093429857376,-113.49208263187387 56.912948026943795,-113.495332125761536 56.915299786891993,-113.513923764294304 56.928747716235968,-113.520930806864385 56.935752263178436,-113.521885065426403 56.936705943966111,-113.526459078494099 56.944372743673206,-113.528586000028113 56.947936654294224,-113.52661019289998 56.954609476493196,-113.526588884178878 56.954681429107723,-113.525922386883224 56.95693183821497,-113.525581080566852 56.958084147749865,-113.524957903123166 56.960187925921275,-113.516709800481905 56.970096534756038,-113.510819447686444 56.973328489001425,-113.509186602856516 56.974224261161162,-113.508908443175713 56.974376852093229,-113.508468142903482 56.974618385215798,-113.508247989798221 56.974739151666505,-113.507807684313164 56.974980680691019,-113.497879825719636 56.980425363984395,-113.497660096487849 56.980545842266856,-113.497550229746366 56.980606082140568,-113.496700769871836 56.981071830777204,-113.495202115798918 56.981893482712671,-113.469331947124161 56.995396432866407,-113.467626195352068 56.996105346728783,-113.466131274143464 56.996726597979048,-113.44612325078225 57.005037737663955,-113.445523263230882 57.00528686078804,-113.444716227583584 57.0056219434192,-113.433093764522027 57.008261922236969,-113.432962369822107 57.008291759553238,-113.419479826274369 57.011352414148071,-113.417752304808573 57.011744435877461,-113.409524838933038 57.013611033865104,-113.402748147923191 57.014398614286073,-113.401770609056726 57.014512189959731,-113.384413093216438 57.016527495765708,-113.370873104493057 57.015781115379944,-113.370741785839229 57.015773869220361,-113.353656465464496 57.014829900659798,-113.352770329761725 57.015176810297703,-113.347650497446821 57.017180805393615,-113.344041028015567 57.0185933632483,-113.343222390896585 57.018913705865977,-113.341869914502752 57.019442922602892,-113.341193208110255 57.019707703112594,-113.335510000195924 57.02193112777671,-113.306065359747507 57.022477103749587,-113.299701775111558 57.023596615106271,-113.299558641120498 57.023621791424901,-113.283382119391959 57.026465865133176,-113.276865223651299 57.027031064893592,-113.270926430469174 57.026335027041874,-113.260482756141187 57.025110393770646,-113.258660550450045 57.02489662269371,-113.247172976310026 57.023548294783239,-113.234972877159535 57.019421072381711,-113.234837437321531 57.019375241971133,-113.229119892737344 57.017440289033701)),((-111.165388373977493 58.035068864753036,-111.16538533521944 57.991634713891315,-111.163367802223675 57.991635955929446,-111.163202530188926 57.991636056256837,-111.152531767337834 57.99164207949314,-111.152376572076477 57.991642160492347,-111.13720363107349 57.991649165585031,-111.136752376665967 57.991649346215119,-111.135648040531336 57.991649781512955,-111.135472094368978 57.991649849980682,-111.119491612205465 57.991655054025699,-111.119235605671193 57.991655121059722,-111.07015984168703 57.991658457494133,-111.070003046478988 57.991658437818856,-111.061630236556027 57.991657106513117,-111.061444982751553 57.991657070826825,-111.053910904241775 57.991655390960979,-111.053771748879157 57.991655355737592,-111.053033170088128 57.991655166239056,-111.052671485240651 57.99165507187702,-111.05260912707287 57.991688704852173,-111.037069173083111 58.00006728054818,-111.036971257365266 58.000120054674049,-111.0365480615324 58.000348143998359,-111.036418910895534 58.000417751294648,-111.035032382493398 58.001165012211615,-111.034921125707569 58.001224971361431,-111.027127843449918 58.00542422997232,-111.027030836290649 58.005476491174612,-111.024326675372706 58.00693322748397,-111.02422990084689 58.006985356829254,-111.003012922001417 58.018408821726844,-111.002908515952186 58.018465008352671,-110.996230941079489 58.022058033157826,-110.996134001549038 58.022110185832886,-110.98777538710489 58.026606202180204,-110.987667671947563 58.026664130136851,-110.983992179794441 58.028640599841566,-110.98388966260255 58.028695723074826,-110.98123559373191 58.030122721221503,-110.980973373045515 58.030263698738793,-110.962304038702158 58.040296632814865,-110.958722255673578 58.042220532242013,-110.958844684558642 58.042350586270885,-110.958899552106402 58.042408870746279,-110.958975179637662 58.042489207702026,-110.960923799917467 58.044559031005356,-110.9610063627686 58.044646723261302,-110.9612374624067 58.044892177915592,-110.961305184903892 58.044964106353724,-110.961559043790885 58.045233728380829,-110.96158308684528 58.045259264129641,-110.961852425986748 58.045408854247,-110.961963364293567 58.045470468505755,-110.962183197399142 58.04559256116157,-110.962702978550865 58.045881236515584,-110.962815563605659 58.045943762956853,-110.963355881007772 58.04624383498151,-110.963523278420226 58.04633679973918,-110.963673304253589 58.046420116529269,-110.963322309512932 58.0463136340801,-110.962999223328993 58.046215616926588,-110.962693511378134 58.046122869478651,-110.96257353084907 58.046086469235114,-110.959469341846159 58.045144641042256,-110.959023506287465 58.045009361762752,-110.958669007345151 58.044901794783613,-110.958431543071228 58.044829739170396,-110.958403294402501 58.044821167410561,-110.958250154085988 58.044774698419587,-110.957055886672222 58.044412298722499,-110.955494954624243 58.043997775045952,-110.954941480370337 58.043850786609603,-110.95428791784714 58.043677212664164,-110.94979115146451 58.042207393142242,-110.936718136798049 58.037576902741705,-110.919292413282434 58.031400981459065,-110.906227288001062 58.026767354895199,-110.90219637389572 58.025051443848341,-110.898971743109215 58.023678764289521,-110.886076137046416 58.018186756079366,-110.86996207358267 58.011320021453649,-110.856327039760913 58.00314422569911,-110.84679235365725 57.995878739164397,-110.841008843025946 57.990733095214715,-110.832742402669268 57.984849931642763,-110.826544680763078 57.980437203441078,-110.82470274109599 57.978862587025155,-110.820419482114175 57.978629007673383,-110.808147423000193 57.977161413430267,-110.808011258067438 57.977145122387618,-110.799656766742658 57.976145267359513,-110.799520497965602 57.976128953873669,-110.795686656218223 57.975669917656099,-110.765941003160222 57.975618661208827,-110.765805691049721 57.975618412151348,-110.765439671134288 57.975617737727802,-110.757440616938638 57.974387245327392,-110.757304288762242 57.974366268908916,-110.741940186277674 57.97200114602898,-110.740476170760246 57.971900883091124,-110.74034046683046 57.971891588541098,-110.735222424675669 57.971540937543615,-110.731954724037408 57.971099565837143,-110.731818553076153 57.971081171027016,-110.72686023900286 57.970411259361683,-110.726377673646837 57.970346048899231,-110.725151693478779 57.970180369328013,-110.723585177177938 57.969968671722249,-110.723449345001669 57.969950314457392,-110.717095196819557 57.969091389473093,-110.706579689243028 57.96766908214412,-110.706443563910611 57.967650663654986,-110.705012063955508 57.967456964051244,-110.694034535538393 57.965239720722224,-110.674844965280769 57.959348404998956,-110.663953351863029 57.957387108535414,-110.663817189794926 57.957362582027123,-110.655401462381136 57.955846331629537,-110.655265361949048 57.955821804968117,-110.652209149382102 57.955270997665778,-110.644665024353799 57.953910926467877,-110.642845383547765 57.953258640201106,-110.642651089494919 57.953188988712974,-110.632617698526644 57.949591398523481,-110.62113993075576 57.945474081072767,-110.621002863900728 57.945424900335951,-110.614551686877206 57.943109844455982,-110.612569055641757 57.942043404582144,-110.612430514242163 57.941968880861616,-110.601071074828866 57.935856883844146,-110.600940025476788 57.935786354100323,-110.584518344076855 57.926945071969378,-110.577981310837515 57.919879729819648,-110.577841617328218 57.919728712632256,-110.576392914991288 57.918162493438103,-110.576327214232137 57.91809145949582,-110.574576716282706 57.916198751135113,-110.569607894862884 57.91082523428318,-110.569733724666875 57.900298262524885,-110.569734583483012 57.900226388232589,-110.569991781734231 57.878685973644934,-110.567052321092504 57.872247829435182,-110.55510769447163 57.862564346158607,-110.555305840076073 57.84649464502742,-110.537305335232602 57.840002097678607,-110.513243141475456 57.836698039419261,-110.498367306413826 57.831324224295521,-110.498176619871344 57.829046625569021,-110.498779213933744 57.829109145828561,-110.506735274631993 57.826794759455531,-110.508522030907727 57.826274848172972,-110.520104159539642 57.826977931204588,-110.52782453329371 57.827446021884768,-110.54387659610066 57.833213762264641,-110.543909877018521 57.833213188720407,-110.551316464925776 57.833063186855085,-110.566978514770383 57.83274461881841,-110.581832199140052 57.828303129544089,-110.58518216127122 57.827301082965228,-110.592521034591826 57.826516690963565,-110.594465936186182 57.826308665650501,-110.601806570030433 57.825523411003942,-110.608116155925956 57.822715704535199,-110.611343443197697 57.817661252954899,-110.610809430852512 57.816238033802414,-110.608955330021061 57.811294527473677,-110.613937306038565 57.807361596139302,-110.617207346210193 57.807702537089085,-110.623817553345631 57.808391580500391,-110.628067226275903 57.804145975449579,-110.6332855567248 57.798931099045092,-110.637919676819038 57.796799115933091,-110.642944293026503 57.794486984442379,-110.65046322293631 57.793646717532987,-110.666785513361958 57.791820787076738,-110.683814905951451 57.789913255598535,-110.683956896624252 57.789826900810326,-110.689474248362956 57.786469924782864,-110.692993059975095 57.784328447194888,-110.696609443627622 57.778808564734085,-110.695242967010259 57.775910131961545,-110.693017752690778 57.771189837839039,-110.692863491509172 57.770862558470277,-110.693609995324834 57.765097949257367,-110.693839999268363 57.763320938694839,-110.688174500680319 57.756514286719103,-110.687379478203567 57.755558766775579,-110.682129554230244 57.749248608881771,-110.677665699862757 57.743881194794888,-110.679970746622374 57.741665881667643,-110.682272225600968 57.739453662217876,-110.687522968180005 57.734405495886165,-110.68956271424095 57.733386815919474,-110.694778658319123 57.730781167259984,-110.695472614352283 57.730434487675026,-110.710807858210615 57.729564669795607,-110.712252257800245 57.729227038881625,-110.72401512499448 57.726476696725484,-110.725181608620801 57.726203902313699,-110.738942839329354 57.725423537568076,-110.745620751174897 57.725044259846499,-110.754267494953297 57.719994125437523,-110.755195559215167 57.719451979356258,-110.761205948290339 57.71706239061907,-110.765470516862649 57.715366646011752,-110.769766502785743 57.713657925498225,-110.775329545190701 57.711444869569839,-110.775636753375991 57.708653044628832,-110.776241181585064 57.703160122276486,-110.776863219946961 57.697505940688487,-110.780998226725274 57.694484639865635,-110.782828482550741 57.694109216271556,-110.791581772073741 57.692312771483962,-110.807429991440358 57.689058430829576,-110.810577408898041 57.688411633975818,-110.815246745984794 57.684393104429887,-110.818382387645173 57.681694039691607,-110.820835325792345 57.680659147273978,-110.825073383784442 57.678871213774237,-110.818572919431958 57.676437392926978,-110.818233100817295 57.676422001000844,-110.812426212219762 57.676159639325171,-110.806062995708729 57.675871779402428,-110.798927396446061 57.675548511364127,-110.791572612762195 57.673126213205983,-110.789765979765221 57.673079667516383,-110.767677362828337 57.672508226269343,-110.76693641878677 57.672424904847404,-110.757582421913071 57.671372155953655,-110.747551149354422 57.670242247768329,-110.747464325512254 57.670191676616795,-110.744491679406792 57.668453225953733,-110.732496010311607 57.671106131124112,-110.731399569651217 57.671348570144261,-110.715458593023953 57.671195649993059,-110.70023515881411 57.671047574095738,-110.699424602227111 57.671039610561358,-110.691443771899031 57.674151388026758,-110.690971740804116 57.674335438407738,-110.684326151642836 57.67692568542568,-110.682529212042851 57.676835658972003,-110.674455578270582 57.676430811382076,-110.673217645240626 57.676368681642145,-110.667443114193077 57.68012241953101,-110.662330064489893 57.683445122638162,-110.658287145494569 57.686071873919886,-110.654169450627634 57.686113429861336,-110.652922395587154 57.686126013306023,-110.651335710191546 57.686141903186545,-110.650050973264044 57.686154843476274,-110.649958210729849 57.686155784768111,-110.635160426311231 57.68616331230831,-110.621313613174507 57.686168832204672,-110.607804058339255 57.686172732173368,-110.59395719354039 57.686175378834392,-110.580447827955794 57.686176270302624,-110.566600654776323 57.686175794238459,-110.553091028584817 57.6861739448739,-110.539244051518409 57.68617048599306,-110.52573437350118 57.686165816671419,-110.511887673956437 57.686160683222923,-110.498376093567217 57.686154293871468,-110.498375577788252 57.642451045338845,-110.498375464539464 57.635222488569511,-110.498375294596215 57.627998026339633,-110.498374830219134 57.620773535434566,-110.498374507836218 57.613639160616181,-110.49837435636654 57.613368313805786,-110.498374244149105 57.606143823440902,-110.498373747492948 57.598919109962949,-110.498373420838618 57.591694538860168,-110.498373178995891 57.587109129724567,-110.498373172278136 57.586982605313004,-110.49837304319972 57.584560183115236,-110.498373107197764 57.584289294912523,-110.498372949630209 57.581203825725886,-110.498708480126666 57.581115370176335,-110.500769711609578 57.581123530780438,-110.50092230590802 57.58112413357842,-110.51483347379488 57.581178313063326,-110.515059424768197 57.581179180428173,-110.559186246253716 57.581340826371566,-110.55932527029195 57.581341311293166,-110.603422881595023 57.581487406094666,-110.618466368154671 57.573498201411432,-110.64837870823952 57.573584990338944,-110.648519411005338 57.558985065341446,-110.648520105572587 57.558912959114323,-110.64853357691652 57.557514368731077,-110.645904552229155 57.555370575368521,-110.645678902579434 57.555186558913647,-110.636670073984135 57.547838045909849,-110.633745257208616 57.541401248776154,-110.627388168246355 57.53679079215167,-110.610385730072622 57.529852042005658,-110.605046222155565 57.525975669373004,-110.604965517679929 57.525917071541521,-110.597683069895922 57.520628451961045,-110.580693796877739 57.513685701552326,-110.568004241108738 57.504459120167901,-110.559612132864856 57.492950721020648,-110.543120124973257 57.485749293281003,-110.529972564065446 57.476772429581331,-110.516318105806249 57.468066883719899,-110.507814072030882 57.460616493968708,-110.504980010646193 57.458132983722017,-110.500432248441044 57.455230397016443,-110.490568518772989 57.449833608716105,-110.480707237616983 57.444436293411904,-110.475778142678905 57.441737225941409,-110.470849315326333 57.439038208268052,-110.460994297883502 57.433639108492791,-110.451141725827441 57.428239482142658,-110.446216984168416 57.425539258895178,-110.441292507625008 57.422839087485322,-110.431446194651414 57.41743767964433,-110.421602322262288 57.412035746546863,-110.416296524334584 57.409538827724418,-110.411740337405433 57.407972172209938,-110.39906359621294 57.402746479049611,-110.382167045902577 57.395776827347085,-110.366266932011911 57.388280191299508,-110.352613417675613 57.383574561278046,-110.348393205367643 57.381830746768721,-110.342766726351613 57.379505603174785,-110.332946074195775 57.374096763611348,-110.330260213477402 57.372616948098738,-110.32312877085333 57.36868691636456,-110.318606459061357 57.365777792581099,-110.313314350613453 57.363276551763242,-110.303502366490648 57.357865421674347,-110.29369372802654 57.352453285434031,-110.288790257965616 57.349747175895445,-110.283887969326315 57.347040633262594,-110.274084643817787 57.34162721602403,-110.264284659116882 57.33621279595085,-110.259385517167416 57.333505544540948,-110.254487554181296 57.33079786048939,-110.253633166008726 57.330088018624998,-110.2139045470215 57.327528874272566,-110.186821031354739 57.316268815577509,-110.16601628278211 57.299870228429057,-110.165977848549602 57.293232403940763,-110.249156791961482 57.293364888969052,-110.317037475897337 57.293432240146302,-110.32975335775086 57.29344078233175,-110.330253607992631 57.293440402811697,-110.330253608150358 57.293424362506791,-110.33025367379021 57.286215529851887,-110.330253639375059 57.278990632748183,-110.330253505566006 57.271765608239733,-110.330253822963314 57.26463093771585,-110.330253604504477 57.264359922554419,-110.330253796226657 57.257135066461828,-110.330253474061962 57.249910009409994,-110.33025348688895 57.242685257930965,-110.330253704718544 57.235550734060254,-110.330253699104361 57.235279781891457,-110.33025370276107 57.231000598943211,-110.347463779642737 57.232567225630966,-110.361729690044172 57.239867140280793,-110.37289331896865 57.241440096413605,-110.3847230818469 57.243105887448841,-110.3945600832336 57.245832434888229,-110.421882212382073 57.253398721948756,-110.422021324419518 57.253437222974057,-110.433923566083948 57.256730452728739,-110.443767847624997 57.259453155665625,-110.452847182844209 57.2625837582396,-110.473309885606483 57.267616403438133,-110.491019405636223 57.274118030982031,-110.502843359759126 57.277379921750899,-110.511296736506438 57.279249648190884,-110.532433250662066 57.283922091958061,-110.552152830518992 57.289351069019034,-110.562014573498743 57.292064520602281,-110.57278300550395 57.294293238347578,-110.583177874362065 57.295580293894687,-110.59164459899003 57.296985804421141,-110.596586792349228 57.297537348523441,-110.646015073645358 57.303043579918366,-110.650517302931632 57.303543921284046,-110.650671281596019 57.287299469652559,-110.653670062074184 57.280942324927793,-110.653699946767645 57.277759441384212,-110.655718031307302 57.271399535134933,-110.656041527935912 57.27037957458549,-110.657158771324291 57.266856546052765,-110.665653924035269 57.255512464191689,-110.665797967866695 57.239598921087094,-110.675674384242996 57.229015416970803,-110.680610689923128 57.223723486719813,-110.686935659696559 57.219192452546352,-110.695410676388178 57.207846252629864,-110.696347494762094 57.206343474350092,-110.696459153270837 57.206164350947581,-110.699826805491668 57.20076107156455,-110.699977760036177 57.200518831012666,-110.702837852702785 57.195928531048885,-110.705312363050794 57.191955852849503,-110.713178713555465 57.185608546144913,-110.724972508234259 57.176086402371872,-110.726637036220211 57.172969688732174,-110.72675041855787 57.172757368135159,-110.726820445732415 57.172626233459773,-110.726858696548078 57.172554603594349,-110.73157354787709 57.163723177410048,-110.734852987232898 57.160193572695057,-110.742707522701053 57.153844374302771,-110.7544836094945 57.144319393697806,-110.761879017856998 57.132398034307492,-110.7643429464474 57.128424144808427,-110.772185696587641 57.122073059955554,-110.776118693149058 57.118886837053857,-110.777073342198193 57.11811334951264,-110.777151079613986 57.118050362397739,-110.783944120830014 57.112545252598068,-110.784387907730576 57.112305323631958,-110.782763605089656 57.107812578003632,-110.78285759151585 57.091740571367843,-110.788854038380052 57.07567860596285,-110.792812666481552 57.071399348751157,-110.800715702881178 57.064983120284225,-110.804666199004018 57.061774938648853,-110.806643974559975 57.059635071030463,-110.810746374852783 57.055933157012817,-110.815533410882821 57.051612337583641,-110.830316045437868 57.043597088396432,-110.843960914798672 57.034960416355958,-110.851087109640005 57.031645114028002,-110.859862222988411 57.02756131782013,-110.875491066741532 57.02001449434821,-110.889373418755596 57.014732942697599,-110.89305973647707 57.013530767835725,-110.899202920244264 57.011526819039844,-110.91148775748286 57.007518015997427,-110.918857301915153 57.005112251010566,-110.922138932306851 57.004219460351386,-110.922376722587273 57.004154762820853,-110.930645219092014 57.001904664793308,-110.939904748643301 57.000072811916809,-110.94832225595502 56.998163166940969,-110.952004344770558 56.997494868515126,-110.963049819221894 56.995489567252307,-110.971707347914673 56.99360212504498,-110.97356861320786 56.993196244263366,-110.977775588241897 56.992278617691667,-110.986189198185656 56.990902040051168,-110.995443265825756 56.989066075987544,-111.007219830579615 56.987458612018678,-111.019837014918963 56.986309252993657,-111.024883760557969 56.985849006582541,-111.036658565667921 56.984774633979917,-111.045251280042464 56.984380962506542,-111.045395065910199 56.984374369930286,-111.045716323704255 56.984359639667765,-111.05955270103621 56.982980199197996,-111.062760594519943 56.982803399248745,-111.063583212039759 56.982758047962818,-111.066094004356827 56.982619592695833,-111.071445885433263 56.982324564511195,-111.08180578745646 56.982318221491219,-111.104726903254885 56.969767232199438,-111.104820999820461 56.969715681339324,-111.105291361057624 56.969457990451318,-111.115855425467785 56.95932114715891,-111.119809257808342 56.953530371422652,-111.123761863694156 56.947739466758414,-111.127261519954132 56.944377976253264,-111.134314783722715 56.937601034045137,-111.134314565616648 56.937540347932114,-111.134314174915502 56.937431638164178,-111.134260816818895 56.922577910339911,-111.1342604406493 56.92247314202784,-111.134200507496203 56.905771826117508,-111.128866717744472 56.892756391429629,-111.128328354857487 56.889863267962433,-111.127669876189358 56.886327223046713,-111.127662682389143 56.88421715581466,-111.127650576770861 56.880665713639644,-111.127639740387053 56.877485933563776,-111.126820565265902 56.873950041353105,-111.12242999535205 56.864405446301554,-111.119844542492956 56.85878331938553,-111.119503898095914 56.858042449950929,-111.119356152776888 56.857827765961595,-111.118944147465257 56.857229080276213,-111.118815720486339 56.857042458590456,-111.117221459220673 56.854725616049706,-111.116923537941389 56.854292631101906,-111.115524402586161 56.852259048931508,-111.108034869877216 56.845104212938686,-111.107925805285277 56.844999998724361,-111.106428062316255 56.843568795715278,-111.106331393365906 56.843476417075252,-111.104933702385523 56.842140698266093,-111.104929609571528 56.840677651406075,-111.104929406113214 56.840604918127831,-111.104908085762034 56.832981308662333,-111.104907883080514 56.832908816880341,-111.104882599814189 56.823863239088119,-111.104882397501981 56.823790836562367,-111.104872833177012 56.820367614227962,-111.104871785057639 56.8199924295768,-111.104860313399612 56.815885440143994,-111.104859864575431 56.815724733542545,-111.104858767862765 56.815332036056994,-111.104857513422203 56.814882849005699,-111.104856903323309 56.814664381539011,-111.104856702600031 56.814592504774382,-111.10483847916332 56.808065501827016,-111.10483827854479 56.807993631816267,-111.104818178908431 56.800791401153035,-111.104817978369113 56.800719525667738,-111.104800338907566 56.794396039810835,-111.105847600649966 56.793531097964696,-111.105922026997632 56.793469626795563,-111.108297042456059 56.791507894228772,-111.108384528545642 56.791435627047733,-111.11637141861921 56.78483668848699,-111.123683404863257 56.778793384828958,-111.123771408070724 56.778720636345987,-111.124082646560723 56.778463346053272,-111.12415372823763 56.778384934590882,-111.124785612815444 56.777687875285494,-111.127291413361604 56.774923331418421,-111.133717453324522 56.770495869680381,-111.139496377372879 56.765714975133648,-111.143348180190827 56.762527641982281,-111.151050267268815 56.756152614446904,-111.155948333506842 56.752096770107592,-111.156027444243989 56.75203125368526,-111.158290254942187 56.750157164239852,-111.158833412148965 56.749707280388968,-111.162597846427218 56.74658893022989,-111.176673618334178 56.741405005074441,-111.184542445194609 56.734880842937514,-111.190810979632616 56.730549611542465,-111.190917221823923 56.730476192394903,-111.196744542057743 56.726448618462939,-111.197186570288736 56.726253067241856,-111.197313208139178 56.726197042586008,-111.212010888476769 56.71969277238091,-111.228499857338534 56.713605960821951,-111.238139150996389 56.710045451669011,-111.238271448925957 56.709996574316186,-111.239489259876109 56.709546642582538,-111.245597396751691 56.707852218780204,-111.247645280198057 56.707525993022507,-111.247787592571854 56.707503321345165,-111.26698857046955 56.704442687596419,-111.268880459149486 56.70417819619928,-111.269010214380231 56.704160054861958,-111.286004602522198 56.701782717048232,-111.286006910997045 56.701781756754343,-111.288796371476082 56.700620736348135,-111.288900624089649 56.700577342057308,-111.290357609984781 56.699970864103584,-111.287230802670919 56.699266091105933,-111.287007076445718 56.699215659861864,-111.278005035551587 56.697186019122476,-111.277860699913219 56.697153469471672,-111.261218997960285 56.693399039271526,-111.226451698668484 56.692132708396699,-111.184411988739626 56.690867654377648,-111.164703987187139 56.691131035895133,-111.163887709717528 56.691141877472184,-111.147231692280513 56.691361928973301,-111.129441101941737 56.689157733343194,-111.120187480566798 56.688148909054554,-111.118883498799974 56.688006690128141,-111.109227922153636 56.686953145271985,-111.082259189729868 56.682734833315713,-111.095641434463118 56.682729167349528,-111.118481760301066 56.682716487891689,-111.119774347512816 56.682715645129917,-111.12204640779629 56.682714131248623,-111.122211097813292 56.682714019904452,-111.122216347221311 56.682714014754616,-111.148796332983906 56.682725610993955,-111.175378477684077 56.682731893185085,-111.20196047986768 56.682732413567571,-111.228542465646981 56.682727261823651,-111.255125232660021 56.682716345571045,-111.281708903505958 56.682699486123695,-111.28171065329083 56.682699482166853,-111.293533151765956 56.682706037360759,-111.304092417022957 56.682710943556032,-111.30809240156168 56.682712568340783,-111.308312337230461 56.682712653953011,-111.314629454601445 56.682714949485664,-111.327128690675863 56.687924521100825,-111.329728938103031 56.687200463679687,-111.330654476896711 56.687096036576811,-111.331101284457091 56.687045621306993,-111.333376809490289 56.686788836823176,-111.333528654362951 56.68677170009417,-111.334644179925476 56.686645799279596,-111.346392437177485 56.685319206114315,-111.351622008065988 56.684728305599137,-111.355086483906859 56.684336835052662,-111.356000438794808 56.684233544754576,-111.361841245767025 56.683894945034581,-111.37100320513207 56.682950291437628,-111.371140863577239 56.682936092518965,-111.373226660775856 56.682720931003701,-111.380520298614854 56.682719726098192,-111.381175238533885 56.682719597007321,-111.381455527828393 56.682719540709421,-111.382774828877956 56.682719267248167,-111.388015425219905 56.682718043006304,-111.391871885807063 56.682717053205174,-111.40274636223387 56.68376941622288,-111.40859363469032 56.684072147213023,-111.413377833909749 56.684319391183735,-111.423032058987189 56.684286981614846,-111.423220378385736 56.68428634198019,-111.42972759693464 56.68426406506228,-111.429886721579919 56.684263516054678,-111.430111720466726 56.684262739422415,-111.434895576606849 56.684465430450466,-111.438407347900878 56.684935669884879,-111.442062391960533 56.685652543678628,-111.442219341418522 56.685683323589515,-111.445371917237566 56.686301533748484,-111.445495139223794 56.686325695156121,-111.448072523109914 56.686831034358605,-111.457489925883891 56.688864369565117,-111.461257010203482 56.689677547750001,-111.463937412884277 56.690256028259896,-111.472953632910063 56.688772049691778,-111.48382351545655 56.684723442006231,-111.484608056046923 56.684431160895095,-111.485019968273718 56.684277698934622,-111.487491587890972 56.682717780069247,-111.491630535174195 56.68271904742916,-111.503239198545657 56.68272164556295,-111.520711375881248 56.682723761564731,-111.520944737427172 56.682723773242323,-111.529884139099039 56.682723839689437,-111.516033165252423 56.686297012140159,-111.498394870636716 56.698861753900609,-111.505245611608288 56.701085682429238,-111.510750801989275 56.702872411370748,-111.513951460584678 56.703910938063835,-111.514054246921091 56.703944287118546,-111.514068511443284 56.703949692790552,-111.526501751027908 56.708660169227365,-111.54053006441849 56.715411015826795,-111.567065548410923 56.729766498140606,-111.577077010012871 56.738766413564363,-111.583086349399778 56.744165965406452,-111.585240590615498 56.746483742686955,-111.590679469460667 56.748832764550379,-111.603695179558201 56.757612120842992,-111.612052931907684 56.761218485568605,-111.612909796582002 56.761588151127206,-111.614354382027855 56.762211339234554,-111.614501518419459 56.762274811151698,-111.619906920080666 56.76460633162651,-111.627447641383057 56.769686776875368,-111.632934915415376 56.773382588413597,-111.639718195469655 56.77630585108907,-111.651215860683081 56.774135273758581,-111.658510466182534 56.772757612453368,-111.674702919244481 56.76969743340134,-111.680391051980948 56.768621827977412,-111.715243259504931 56.768426845961102,-111.715404476833641 56.768425921393124,-111.725324797703763 56.768368628207284,-111.725783964938216 56.768365957254048,-111.738926030991408 56.768288793846295,-111.744133300820863 56.769679995056528,-111.745536402706122 56.770054800095444,-111.74674277218493 56.770377034143067,-111.758545595754001 56.773528783870759,-111.778170165285204 56.778765917464568,-111.784139283609974 56.780357857450632,-111.784294249780274 56.780399180692882,-111.797800621723539 56.783999695028797,-111.810944197343673 56.788687537549897,-111.811244885256642 56.788794752158651,-111.815507604307271 56.790314541753801,-111.817560010646631 56.791961239131368,-111.817648133890728 56.792031938618514,-111.818421148593643 56.792652098433393,-111.818495538967767 56.792711777613398,-111.8393649553975 56.809444829937057,-111.845514505246399 56.822261971538808,-111.850254264853675 56.826057669412499,-111.850334493119405 56.826121909659577,-111.85426075692753 56.829265407203444,-111.854393638804851 56.829371785405698,-111.85745798600901 56.831824731675091,-111.857825447771106 56.847895724472259,-111.854011847614018 56.851116825726599,-111.853880180081916 56.851228024835372,-111.84795817913907 56.856228595529601,-111.847867392103737 56.856305244071876,-111.847005218808761 56.857033130088574,-111.846790853730369 56.857214101564786,-111.846311873454582 56.85761845909127,-111.840732670550281 56.870514684128466,-111.838517418907543 56.872383699885738,-111.838432196136026 56.872455598144462,-111.829207749144174 56.880235839730204,-111.82951283960756 56.894009174674949,-111.82951443120055 56.894080994970082,-111.829563760962955 56.896306823876685,-111.836277920317414 56.901675270733882,-111.836370610491073 56.901749369712206,-111.84152698826766 56.905870940165855,-111.843676464856117 56.910339608793166,-111.843793590238036 56.910583075235728,-111.844726548655046 56.912522280641397,-111.844794317882346 56.912663134498686,-111.845741525470174 56.914631726441122,-111.845775658822049 56.914702662106649,-111.847693441429797 56.918687729873092,-111.854140853148266 56.923836864159512,-111.854176807188992 56.923865573403738,-111.854268202913673 56.923938552497617,-111.85442856214604 56.924066597800511,-111.854897769117372 56.924441248786835,-111.854923327633301 56.924461656406606,-111.859668504784864 56.928250041707891,-111.863315164474542 56.930194300238774,-111.863446219512483 56.930264167962825,-111.863811189599772 56.930458737763622,-111.863945910264803 56.930530558132482,-111.879717139733955 56.938935366523076,-111.879850162952081 56.939006232628586,-111.886543956358395 56.942571717072461,-111.886675604735672 56.942641829803904,-111.889442128963765 56.944115120045353,-111.911505411809543 56.943956264908131,-111.911652310149151 56.943955194196256,-111.932048092510669 56.943804857998899,-111.932179579388858 56.943803878022621,-111.953836678604333 56.943640579832717,-111.954752790745786 56.943217439065847,-111.956834178431805 56.942122983485277,-111.956933947057863 56.942070519697126,-111.964142332043238 56.938279358096651,-111.964281616586433 56.938206091455001,-111.966270854603763 56.937159661624577,-111.966397276676645 56.937093154810121,-111.980731994144449 56.929549735305969,-111.994283468460921 56.924128414698949,-111.994463486089458 56.924056377506204,-112.006779686534827 56.91912656261124,-112.03040757545952 56.913825950962078,-112.034030635624376 56.914322511258426,-112.03416481043412 56.914340898379407,-112.05208065614039 56.916794601435612,-112.052266326435543 56.916820015153142,-112.05597499315104 56.917327575701044,-112.071617916561536 56.916145469790287,-112.087828605354801 56.9149183163277,-112.09293391869781 56.914313348914646,-112.093467019788818 56.914250164574753,-112.093606818772216 56.914233594873949,-112.093752998950947 56.914216268657931,-112.125896907327572 56.910401828876651,-112.154607580098528 56.905496109118758,-112.167947457687745 56.900831750067233,-112.176435746639015 56.897862430913477,-112.180786989573335 56.894778412523124,-112.180886967965492 56.894707543388911,-112.19303277040342 56.886095474948661,-112.203699616372603 56.8748479023591,-112.229524822663848 56.860664731569628,-112.234455886917303 56.857185022723762,-112.234727766202425 56.856993141042366,-112.253543032838252 56.843707879178957,-112.275188749329203 56.832343233177625,-112.292307732361039 56.829545702639557,-112.292434629213275 56.829524955248729,-112.305513167479162 56.82738582605193,-112.320786708986716 56.828153950750888,-112.345125362714512 56.821856854323471,-112.365918053086986 56.811414190226479,-112.405122115058887 56.795653520333573,-112.429427284187682 56.784790975314188,-112.439237361970598 56.780403513105348,-112.459890786826634 56.767624344129352,-112.485838635827648 56.760816067121951,-112.489035404069057 56.760484096245385,-112.489166113010498 56.760470520808077,-112.511099813437951 56.758190409273119,-112.532545337072122 56.755374355138699,-112.555360531593593 56.755091832666622,-112.581477196382252 56.752905599872001,-112.61010550072308 56.750217032832417,-112.623262918888628 56.74168668719669,-112.660678703869507 56.727725262838398,-112.683060114156561 56.719927804787602,-112.68321710889731 56.719873083898626,-112.693950889910681 56.71613095629457,-112.727883384501283 56.719380549707417,-112.751668983309159 56.721940268202886,-112.751799514737243 56.721954301998345,-112.758444810312298 56.722668561211371,-112.793166346266872 56.724495983579104,-112.810354679576605 56.72816262694564,-112.810485954447316 56.728190618793057,-112.829872672966744 56.73232248082229,-112.851703187350054 56.734049083889921,-112.851837683116671 56.734059708966917,-112.859562698483501 56.734669726019256,-112.859920334129242 56.73471447954369,-112.860049456025351 56.734730637217474,-112.892727385928524 56.738815031951368,-112.915410138110559 56.736146210038029,-112.93112059717447 56.729401315226646,-112.944125444464191 56.719445386737384,-112.959317776945284 56.719207407994183,-112.960019528542048 56.719406123668676,-112.960153271308769 56.719443995046177,-112.966075780612996 56.721120825481215,-112.966205907829647 56.721157663321904,-112.984184940347973 56.72624535382031,-112.991585992995866 56.722411538768043,-113.008244507862074 56.717963924551746,-113.018431326646834 56.716334628471827,-113.019829773031219 56.716110882929556,-113.0299922852642 56.714484374005025,-113.030221867788669 56.714447618184771,-113.030856016513653 56.714346089355516,-113.058703197934435 56.713889027999116,-113.06420329631662 56.706366380116364,-113.065483724617252 56.698913507680544,-113.048260531385367 56.692695264684474,-113.031711243500141 56.683212367230702,-113.028765654227996 56.681846027536686,-113.036168077494793 56.681840725924914,-113.039819313567833 56.681842578319959,-113.041054393496836 56.681843180685227,-113.045728336710454 56.68184534933448,-113.045858799013274 56.68184540735048,-113.053577663595007 56.681848596618877,-113.05378863621803 56.681848677070619,-113.068939367644688 56.681853520086207,-113.068017725915993 56.683543653894048,-113.08350204180762 56.688859305493821,-113.089790642059882 56.695721155208396,-113.089927968156076 56.698198472103485,-113.089933062801492 56.698290370168991,-113.090330969400711 56.705466188560045,-113.085834191227605 56.715760124335119,-113.083265299892119 56.723584452640559,-113.083241898269705 56.723655714629402,-113.080772968617168 56.731172545570914,-113.055547456704701 56.733449104231255,-113.035259399146398 56.73331762642821,-113.030492700585299 56.734004702342766,-113.029506846544678 56.734146778358614,-113.013456540667505 56.736458618391978,-113.010186615351301 56.738889498287037,-113.010084480605215 56.738965419416331,-113.004514382573504 56.743105326065653,-112.989484548378428 56.746597402949668,-112.970635610568308 56.741787716970222,-112.966236773398052 56.740430210003652,-112.966106050442306 56.740389864232839,-112.966010507940126 56.740360376263439,-112.965793606911177 56.740293432093054,-112.961601924346567 56.738999592629042,-112.961468221354608 56.738958318946786,-112.957750592086882 56.737810604471861,-112.954027708684791 56.740633566647176,-112.953928783868008 56.740708571437288,-112.949618734427375 56.743976087159638,-112.942616472319187 56.755696940397293,-112.919055412517707 56.757919685616109,-112.891056662378261 56.756025246876185,-112.861393877913741 56.754613850775755,-112.857289777672406 56.754675060906408,-112.857158043536785 56.754677023399509,-112.844971801766278 56.75485796372854,-112.844828085970121 56.754860090494148,-112.841962053120227 56.754902468596953,-112.803608472475204 56.748496538275468,-112.764684248404095 56.747660298485336,-112.751505748001236 56.74590135080841,-112.75137517590062 56.745883915403816,-112.735741827115248 56.743795272512649,-112.733214542795395 56.743457416253591,-112.730913654185969 56.742389518208931,-112.717671612074497 56.736241547324724,-112.698578201379163 56.739320516654345,-112.698449396627765 56.739341275866472,-112.6947889935402 56.739931150891039,-112.684711676732604 56.74302251611973,-112.664672420441889 56.749165938041131,-112.650527794147564 56.756417134784627,-112.634847760861476 56.765452590074005,-112.615907994761116 56.773645400975703,-112.593445750307339 56.774817293974884,-112.570945161849053 56.775102739286531,-112.546800625823693 56.774521651341132,-112.526050214106263 56.778308741184631,-112.497187502723392 56.78042425989328,-112.490666066690608 56.784789901781814,-112.490557195453334 56.784862771961215,-112.47838350405226 56.793008551653763,-112.476852212076992 56.793698644392265,-112.476692335470815 56.793770691920749,-112.456247093100515 56.802980280244164,-112.421361126292638 56.816625226411794,-112.391115197636594 56.825794413062091,-112.383360481766431 56.833826128279803,-112.378402542582606 56.836655770372886,-112.37827672907963 56.836727567765273,-112.35811387083244 56.848228641871678,-112.32760806684395 56.851205186679827,-112.29706678027884 56.853291793792344,-112.291537492185142 56.857012327207563,-112.29127804177341 56.857186881488992,-112.288751516819616 56.858886576229324,-112.288612013039369 56.858980420065137,-112.279740194778526 56.864947189429778,-112.26088021046337 56.879264021730798,-112.249036723085624 56.887923331210033,-112.248957839344655 56.887980989563331,-112.238839236693238 56.895375084426469,-112.23627599512713 56.89709504443325,-112.236177684801291 56.897161007438434,-112.230723620642152 56.900820022033223,-112.221475110657011 56.907022477892887,-112.201728505715138 56.915281155333126,-112.191219332295034 56.91967368521091,-112.178981658564751 56.927233256072995,-112.173801385651984 56.930431985522851,-112.166076272358751 56.931446720120711,-112.165564291569694 56.931513952727393,-112.144854741743472 56.934231544681175,-112.140705458909977 56.934458815005151,-112.140566595073537 56.934466418622264,-112.125509362294622 56.935289958589692,-112.107908115103314 56.940743858210681,-112.10410557038324 56.941241156037954,-112.103540365068241 56.941315062755493,-112.098463676654944 56.941978767299268,-112.078946616153516 56.944528208571938,-112.051544466017447 56.946527165305767,-112.039173532797392 56.948869414562715,-112.039045253432221 56.948893694385312,-112.027413710636267 56.951094554609327,-112.036678144778875 56.951018110902673,-112.039391697073555 56.951365004507011,-112.039526311646114 56.951382211587394,-112.048486173597325 56.952527142119642,-112.084150088671279 56.965081825291648,-112.098468680949168 56.966905096375974,-112.107779718473452 56.968089749316704,-112.125626017955753 56.974359840663098,-112.14407775569731 56.984105883125054,-112.144215183777234 56.984178441906614,-112.155548786464962 56.990160816011681,-112.157660825644427 56.991828310984189,-112.157735860946829 56.991887549350047,-112.167625468261519 56.999693072165158,-112.170521277192918 57.005583177804837,-112.170555536167413 57.005652849181594,-112.170772008894801 57.006093076475146,-112.170910490954498 57.010500697070761,-112.170924603408992 57.010949798583184,-112.171079032222266 57.015863337584278,-112.171101070221084 57.016564403368903,-112.17157264832511 57.031558422820545,-112.171574614859068 57.031620918899961,-112.171574909733948 57.031630289944353,-112.17178265642525 57.0382310022935,-112.169036811641362 57.044686018872177,-112.169137786582667 57.047899997563718,-112.167373938076736 57.054345793346712,-112.165042557048238 57.058385894317631,-112.159958493127277 57.067192445964494,-112.160748596441962 57.067185129175357,-112.182259633518797 57.062122886142781,-112.197444599880285 57.068575931182437,-112.206516894298389 57.075333575229088,-112.207569858460218 57.076117689139245,-112.205825264448208 57.07724306020598,-112.192266035585305 57.08598646211815,-112.16973697390705 57.08949734532257,-112.150742787992172 57.089785613775767,-112.146870204632407 57.089844032976799,-112.139362422884744 57.102824111620194,-112.137025011540445 57.106863683479787,-112.134695484625865 57.110888464257066,-112.140280874727765 57.13268105837443,-112.13956552341925 57.137931396119264,-112.141741720741791 57.143942943233768,-112.141767886688172 57.1440152119375,-112.141790255259082 57.144076992296107,-112.141952718692181 57.144525697996606,-112.143552991761439 57.14894486794126,-112.160639860370438 57.14692656507065,-112.181633367534133 57.14386450363903,-112.200550222332467 57.146550996691943,-112.220074640771614 57.144724864542091,-112.233396609142275 57.137634030800761,-112.246851080382001 57.134634892683344,-112.267438702909814 57.136074283527023,-112.28122042109392 57.132341576971257,-112.281339084819606 57.132309427703483,-112.292597649818561 57.129258410281842,-112.322425660056581 57.121167864460638,-112.352434474025813 57.118391089956795,-112.378981193871027 57.123834347180598,-112.397611682698141 57.138777993758545,-112.405731681562912 57.143340275567944,-112.405831915611714 57.143396582434676,-112.407935438322667 57.144578186109307,-112.408062957267219 57.144649813249259,-112.415504167190491 57.14882881694755,-112.415636753796718 57.148903265301172,-112.417622523681146 57.150018236719653,-112.425877980071462 57.157471339447163,-112.425957329871892 57.157542959818315,-112.429128414632444 57.160404880018511,-112.446190558938838 57.16717049977273,-112.446309466209087 57.16721763293215,-112.4515245631369 57.169284593295188,-112.463967866531675 57.174214573968136,-112.464152797333355 57.174287823394387,-112.471792748607655 57.177313444810018,-112.476424843510671 57.176687906769459,-112.476672474068877 57.176654460273397,-112.47698945351334 57.176611646293125,-112.477393084152297 57.176557127154943,-112.485689927753697 57.175436134545272,-112.493716414614084 57.174351084340564,-112.494273638174377 57.174275735419855,-112.497139969495194 57.173888100318777,-112.497280205668432 57.173869133263473,-112.499797713477165 57.173528608397746,-112.499927505579109 57.173511050833632,-112.508931948147847 57.172292611544258,-112.527961592919624 57.173551194355205,-112.530702736255932 57.173732243028326,-112.531297263950648 57.174111654114697,-112.531484019518814 57.174230834132906,-112.543215956194814 57.181715578570298,-112.543695517913079 57.182021440996351,-112.543820310539004 57.182101032063414,-112.543933013649394 57.182172912194602,-112.546345818381937 57.183711666045518,-112.550910033936248 57.186621991151227,-112.553488703297049 57.182186421741683,-112.55350028753513 57.182174378919647,-112.553569399817974 57.182102530513319,-112.558442645341813 57.177035562295337,-112.560470969755997 57.1751797927596,-112.560547253347011 57.17510999457317,-112.564664646837969 57.171342193519621,-112.57195755458109 57.168092071764072,-112.587665870856554 57.165261817949471,-112.597834581175675 57.164241018860658,-112.60123648419966 57.161123240241736,-112.601306729681895 57.161058855153001,-112.601989287628953 57.160433227594183,-112.610527397452017 57.157324914838021,-112.610719794058468 57.157254859884354,-112.61136259263418 57.157020801686649,-112.630372861703307 57.156304859953373,-112.637862253618309 57.157219299138895,-112.638387480687157 57.157283409758826,-112.640194579474937 57.157503970531664,-112.640352545310549 57.157523249278448,-112.644296637308358 57.158004530001811,-112.653980142000677 57.161640019403244,-112.655488274141717 57.161701923240322,-112.655620583301527 57.161707353218389,-112.662512763738562 57.161990013550685,-112.663792462238973 57.161259920660008,-112.666272144340482 57.159845095394701,-112.666363349299445 57.159793053857044,-112.670811466508511 57.157254702127887,-112.670938083553892 57.157182439790439,-112.688983090521134 57.146879701411919,-112.692624930575263 57.144799400042885,-112.710060493351946 57.138133026685018,-112.733547814420362 57.134595380070436,-112.750971144945098 57.127923379925711,-112.767223642354224 57.133491587991543,-112.769001038367975 57.134100304398594,-112.769497179149056 57.13416036485814,-112.786733843204232 57.136245611298015,-112.786863034132054 57.136261230623397,-112.792790630532892 57.136977725859879,-112.810831800338349 57.143148559732566,-112.812429829149139 57.14397229969822,-112.812530090138694 57.144023979568566,-112.818440731061528 57.147070239864306,-112.819133362296199 57.147427160691954,-112.821701472197219 57.14875044299756,-112.823178796388106 57.149511603684573,-112.823381661556951 57.149616121926279,-112.841179493037259 57.158782146580052,-112.844562025818519 57.163836267478736,-112.844947333796469 57.164411892808893,-112.847396569907474 57.168070439489433,-112.85184268159945 57.169622973533869,-112.851929210921995 57.169653185762144,-112.852684384312752 57.170189852688864,-112.862001794724492 57.176809634589283,-112.866891180716564 57.184854231050615,-112.863377274489167 57.190030432040217,-112.862908286869384 57.190721164427949,-112.862784272749977 57.190903809844613,-112.86597024490834 57.19413917238942,-112.868598904803434 57.195825919972805,-112.869183836053892 57.196201227523886,-112.872771849987771 57.198503164680687,-112.878412167634394 57.203533712700256,-112.880578524876171 57.206424174953618,-112.883271958526677 57.210016900033729,-112.883807538991704 57.210731209952499,-112.885345884859831 57.212782750645559,-112.886789313622216 57.215261816117753,-112.892491138287696 57.221041776788901,-112.893091392180338 57.221650134395681,-112.893734481692562 57.222301880145672,-112.89784767401477 57.225454827306088,-112.904018788831692 57.230184106461408,-112.909232008606409 57.235463376163693,-112.911838962830373 57.238103050289553,-112.921941035170605 57.248326884588003,-112.922003636654949 57.248390220140443,-112.927489452234539 57.253939383533591,-112.930099037341833 57.256578654686514,-112.933193047887457 57.259706883268819,-112.933256067453044 57.259770593400205,-112.935319774060858 57.261856772943815,-112.940172633748631 57.26734665422228,-112.943153483170505 57.269773642438359,-112.94486979710878 57.271507649914639,-112.944935121587321 57.271573644087077,-112.990227001113453 57.31726393901485,-112.993215236871052 57.31968967327844,-113.005481517388148 57.32698608113661,-113.005602904808441 57.327058265927029,-113.007389198442851 57.32812046457429,-113.013370116900788 57.332971253629871,-113.017740144888975 57.338746868304042,-113.029105251150838 57.348794139030375,-113.038100028770813 57.353373958622029,-113.038215055338284 57.353432514381019,-113.042130486613488 57.355425539608895,-113.042233023888159 57.355477728349513,-113.059715828886254 57.36437259048401,-113.068854026487898 57.375705325549411,-113.069130993429539 57.375892660471905,-113.069236733527021 57.37596418029505,-113.078756193816218 57.382401370563507,-113.020658485107347 57.382565618528432,-113.020513925513271 57.382565993776886,-113.02020889971611 57.382566785020039,-113.019040142251598 57.382569809959811,-113.008671096101295 57.382596171689677,-113.008524962643506 57.382596537109727,-112.995671597644588 57.382628014587411,-112.99553856116232 57.382628333528551,-112.965056087049717 57.382697706114101,-112.964921476743086 57.382697996096361,-112.910255073889815 57.38280386396017,-112.910114318427176 57.382804105915419,-112.860981742766398 57.382878950151294,-112.860848536887985 57.382879127005921,-112.848993109451783 57.382894302821548,-112.848859592022393 57.382894467377206,-112.782658335372219 57.382958620184709,-112.78252949584305 57.38086412826987,-112.782529470179909 57.380796468682263,-112.782529442928833 57.380724615264825,-112.782529427355428 57.380683548972947,-112.78252897994345 57.373458920256162,-112.78252902950959 57.366234226670016,-112.769153493423133 57.366227082251442,-112.768652150672253 57.366227400019298,-112.755443646827644 57.366235532820582,-112.75544321416902 57.359011026240047,-112.742067839750675 57.359017828499077,-112.741566620992799 57.359017975802928,-112.728358448562972 57.359023211338851,-112.71498322524846 57.359027145629966,-112.714983719158894 57.366251787879747,-112.714482229131704 57.366251871520035,-112.701274002212742 57.366254298171278,-112.70127450803443 57.373478844920918,-112.687899011443434 57.373479970268377,-112.687899394812675 57.380057557635418,-112.687899399125044 57.380129429909054,-112.68789943218944 57.380679031229604,-112.687899433734856 57.380704655911352,-112.690224092655512 57.380683396407868,-112.698781273739783 57.380604769240328,-112.699152748986236 57.38060134278512,-112.699734635177478 57.380595973314392,-112.699878908116588 57.380594641590676,-112.699893230985865 57.380594509373246,-112.698019779400283 57.383480886255292,-112.694651086819206 57.388669480007437,-112.694604402451205 57.388741374327623,-112.692662907962031 57.391731030966689,-112.688273297959427 57.398488634285023,-112.684502134584505 57.404291986219675,-112.683601517305178 57.405677820355123,-112.679562836588573 57.407505653410517,-112.670288305481648 57.411702028716427,-112.65884387229066 57.416877760600222,-112.652680635143341 57.418454113278301,-112.637951396881761 57.422219374096279,-112.632789681169299 57.423538166054044,-112.626863724785025 57.427528112507105,-112.617817342161061 57.43361674338373,-112.616859329508557 57.43426130045367,-112.605621328038183 57.436393769706051,-112.604057197873146 57.437598287285425,-112.602851901831329 57.438526134519662,-112.601110130385763 57.442468708523819,-112.600555219152355 57.443724952121862,-112.599337444416548 57.446480392894124,-112.598663278914813 57.448005716384039,-112.600213471042082 57.44975527605007,-112.600243979050404 57.449789705747556,-112.601036083946553 57.450683607152904,-112.608684759841339 57.4522304729933,-112.610977218368163 57.452694022122159,-112.612737202621801 57.457008968771738,-112.613189684348626 57.458118475508357,-112.618368223003401 57.461056593509873,-112.618568414966688 57.461170243792665,-112.61981967576061 57.465477003026173,-112.617881769379991 57.467353815457862,-112.617591500074866 57.467526942445808,-112.617497881933446 57.467582779161859,-112.615337031948016 57.468871509707427,-112.611721457428857 57.471027576489426,-112.606544846577407 57.474113732865916,-112.606650787296644 57.479168656310897,-112.606651024971498 57.482545362198245,-112.60665126371039 57.489769766921057,-112.606651297867074 57.496994239739429,-112.606651327477337 57.497265181913555,-112.606651670242613 57.504399209211527,-112.606651654066667 57.511623582755902,-112.606651902605279 57.51782092943688,-112.606651906623583 57.517917413060282,-112.606651945610352 57.518847893617071,-112.606652179692958 57.526072275753684,-112.606652286283691 57.526343193476777,-112.60665236143079 57.53347724887103,-112.606652359652927 57.540701455009398,-112.606652383621579 57.542193166514465,-112.606652384803837 57.542265030036006,-112.606652485864586 57.547925808073074,-112.606652613280275 57.55536454051164,-112.604921940216926 57.555365330713677,-112.604417764564388 57.555365479403974,-112.591075167713825 57.555371056740803,-112.577564047302531 57.555375063382918,-112.577060076449143 57.555375116395098,-112.563716434723986 57.555377662896241,-112.552437015737596 57.555378683168996,-112.552268281775682 57.55537869078335,-112.551359110476298 57.555378727930346,-112.551219948586549 57.555378733038623,-112.550204892799286 57.555378765659633,-112.549700972740268 57.555378798676429,-112.536357693576392 57.555378491357096,-112.52284640123473 57.555376666939317,-112.52234243046108 57.555376486910532,-112.508999293786246 57.555373360087991,-112.497812544285637 57.555369526232454,-112.49781291977699 57.5479473247172,-112.49781323133881 57.540723042909399,-112.497813472561234 57.53349880789866,-112.497813784493658 57.526093932906193,-112.497813600580955 57.522499685983881,-112.497807347197011 57.522120779386228,-112.496665620770727 57.522138999800383,-112.493759860085859 57.522185328523641,-112.492943126616282 57.522198262008672,-112.491579660444415 57.522220024063408,-112.487529921676526 57.522284359411131,-112.485531819571236 57.52231608649609,-112.48131630169398 57.522382847903692,-112.480982246553367 57.522388160572937,-112.479100178054537 57.52241793884717,-112.476600140519395 57.52245740549295,-112.474790105095295 57.522485960398406,-112.472663286089855 57.52251947601038,-112.471237161014301 57.522541901858766,-112.47123690273726 57.526084879762891,-112.471236872529587 57.526355733369279,-112.471236840363602 57.533489651933074,-112.471236648476477 57.54071396607322,-112.471236477331942 57.547938130808447,-112.471236163243546 57.555360542638851,-112.468132125314014 57.55535923821509,-112.467628130671997 57.555359610582634,-112.454286993216868 57.555367888055208,-112.454287767003507 57.562532661235821,-112.45428865527856 57.569757066921589,-112.440779380859524 57.569763885471765,-112.440780281217187 57.576988206229203,-112.440781021805833 57.58421258685803,-112.440781109687279 57.584483412662486,-112.440781575407797 57.588891795759267,-112.440781583070645 57.588963654381786,-112.440781867668846 57.591617418505436,-112.440782370950458 57.597551804869795,-112.44078237777353 57.597631016505808,-112.440782482408849 57.598841735163575,-112.440783349020521 57.606065971053432,-112.440783585768486 57.608765352377766,-112.440783594101902 57.608859703990518,-112.440784014347159 57.613561229187589,-112.426938439181242 57.613566701050196,-112.426939029604497 57.620700695571188,-112.413429843073217 57.620704596449556,-112.41343045127104 57.627928809783242,-112.412925449010515 57.62792888732033,-112.410334887749272 57.627929488046377,-112.410182131546549 57.627929521811716,-112.399584654190733 57.627931413774228,-112.386075274643972 57.627932290486079,-112.385570182273099 57.627932265055222,-112.372229879452206 57.627931821803919,-112.358721435593694 57.62792988425246,-112.358721771474521 57.63515417712874,-112.358468979034299 57.635154096178027,-112.358216707356803 57.63515401489034,-112.344876266751101 57.635150612197627,-112.344876269474071 57.635250951226809,-112.344876481426127 57.642642560342871,-112.317523236724767 57.642637727315027,-112.304015405545044 57.642633230425062,-112.304015308667786 57.649767304382245,-112.303509962397513 57.649767622173904,-112.290170765168071 57.64977554125867,-112.290170830796555 57.656999759952505,-112.290170543127559 57.664224040037581,-112.290170516020979 57.666291185051328,-112.290170515108457 57.666363072638582,-112.290170502577325 57.667366857338749,-112.290170501566479 57.667449234788137,-112.29017045568817 57.671448324761627,-112.290170484596416 57.671719227758544,-112.290170224690897 57.676563242516046,-112.290170220182844 57.676648789562634,-112.290170104999802 57.678853255554962,-112.303509082621375 57.678845272501817,-112.304014834989161 57.678844906371936,-112.31752288680326 57.678850266751979,-112.330862779800853 57.67885412714044,-112.331368551210687 57.678854240681083,-112.344877044457689 57.678858533811905,-112.344877221726108 57.671724359593064,-112.3448772141831 57.671453492535562,-112.358217330760965 57.671456339072975,-112.358217420105305 57.666516431006364,-112.358469716330646 57.666515561265115,-112.385513013174773 57.666419417561094,-112.385569270918566 57.664337583595611,-112.385572073876702 57.664233854835274,-112.385571903036023 57.660222635122445,-112.38582612277888 57.660221968776177,-112.427481234648567 57.660105884789836,-112.426941688789711 57.657001715475175,-112.426941194271066 57.649777824249533,-112.426940837848818 57.644239170094302,-112.426940828398401 57.644089420297384,-112.426940737703148 57.642644297124619,-112.42694072765714 57.642475243395388,-112.426940721609355 57.642373372520261,-112.440281369357976 57.642368120108785,-112.440280893753183 57.635143897951941,-112.440280272053855 57.627919576437243,-112.440785402071938 57.627919441246533,-112.454294600207902 57.627912564962465,-112.458266418791695 57.627910275982082,-112.458410334481925 57.627910190700433,-112.467635348353184 57.627904382341306,-112.468140259927182 57.627904085391286,-112.468141025761142 57.635128363541384,-112.468141753862625 57.642352656284075,-112.481651741091568 57.642353362218579,-112.494993611449232 57.642352819043481,-112.495498676694595 57.642352753477084,-112.498977303854517 57.642354159928921,-112.499118266711903 57.642354214904501,-112.509009270211081 57.642357680096552,-112.522351437227712 57.642361078780553,-112.522856732490936 57.642361148595995,-112.536367465566173 57.642363121206692,-112.549709788521909 57.642363732206832,-112.55021496832876 57.64236365087509,-112.563725996912538 57.642362697145195,-112.577068632709995 57.642360365473628,-112.577573747874808 57.642360229574159,-112.591084630788956 57.642356259315548,-112.604426540403566 57.642350959850681,-112.604931732484545 57.64235066961227,-112.614116929341066 57.642346207850281,-112.614312206460681 57.642346105750796,-112.618442226748314 57.642343875765008,-112.631784202241008 57.642335643880848,-112.632289470996469 57.642335199268857,-112.645798123007864 57.642339521973014,-112.645797437745074 57.635115400407535,-112.659137877027206 57.63511834289929,-112.659642979791883 57.635118494971074,-112.669700429028623 57.635122153530389,-112.669841283936094 57.635122199088258,-112.673152010551348 57.635123224715656,-112.686492869463336 57.635126521851383,-112.686998068745822 57.635126647008512,-112.697617903466579 57.635128169619172,-112.697751884386562 57.63512818313103,-112.700507194591083 57.635128429521671,-112.713848037160233 57.635128887118476,-112.714353172313494 57.635128957769155,-112.727861515036651 57.635127796646934,-112.739668933471989 57.635125723680432,-112.7398119123838 57.635125691821649,-112.741201244759523 57.635125373829787,-112.741706386200647 57.635125248723291,-112.755214468374007 57.635121402716038,-112.755214938999302 57.638619728565502,-112.755214948735173 57.638691582606782,-112.755215441141644 57.642299235146872,-112.755215447488652 57.642345402788138,-112.758967608556375 57.642344081826124,-112.768555041183902 57.642340200853077,-112.769060482085038 57.64233995567534,-112.774723805433723 57.642337288433438,-112.77485779858398 57.642337222255613,-112.782568544910134 57.642333174822831,-112.792545878521608 57.642327283388113,-112.792879805745088 57.642327072595656,-112.795908199115104 57.64232512065341,-112.796413408042952 57.642324690194009,-112.796413204070831 57.642595626460313,-112.796413772391602 57.64652983267694,-112.796413782851232 57.646601687960626,-112.79641424091362 57.649729416445723,-112.809920067905253 57.649739316342981,-112.809920855351891 57.656963217303776,-112.823258284920655 57.656971400426038,-112.823763610873115 57.656971756318249,-112.830718219794321 57.656974486956898,-112.830852306301722 57.656974535846857,-112.837269477202526 57.656976709448067,-112.843218468495962 57.656978468919924,-112.843352538082513 57.656978505348206,-112.850607006408396 57.656980264588071,-112.851112640615781 57.656980352021421,-112.864618565218379 57.656982471415148,-112.877956090732994 57.656982849229017,-112.878461623045098 57.656982992559691,-112.891973358229492 57.656981752116934,-112.905316763582206 57.656979031442035,-112.905822217900621 57.656978913628727,-112.909850008811645 57.656977807352234,-112.904793255776937 57.663748102571255,-112.876051149311323 57.689002131749334,-112.85398924063584 57.703395547289318,-112.853859900073743 57.703479885685134,-112.846180811045272 57.708486213790628,-112.839085225033372 57.71324731421192,-112.833570018278607 57.715281673645009,-112.833437264182621 57.715330636059221,-112.802753315882214 57.726640253097123,-112.802638084669454 57.726682698301445,-112.802304534357916 57.726805559796297,-112.792695740923818 57.727203879689803,-112.792561460179797 57.727209440897653,-112.747148580545158 57.729081947582834,-112.740759808339661 57.728891339002537,-112.740625549048787 57.728887329904417,-112.701182883318992 57.727703332273457,-112.695460072627768 57.727325519850687,-112.695325877152243 57.727316657240131,-112.662697532322809 57.725157443019732,-112.662470432057987 57.725142384023897,-112.657023921406179 57.724781100526208,-112.602354245941228 57.716965930825133,-112.577323127171155 57.712083253178932,-112.537202600523742 57.704244053155946,-112.536633230811717 57.704077775005935,-112.534617532125367 57.707268365278459,-112.533707476725183 57.709422432230106,-112.53219078961807 57.713012564366039,-112.529944009203817 57.720595412115571,-112.527381092785689 57.725571901696703,-112.522049849374625 57.741709021979766,-112.518048832669649 57.753811697869494,-112.516714429387562 57.757845895034087,-112.515824968938432 57.760535307052692,-112.514486805220997 57.764579529074489,-112.514445766343641 57.764703543319946,-112.513131340000314 57.76867512574217,-112.513090655573208 57.768798041273612,-112.511374367185965 57.773982525977374,-112.506920534669561 57.787429577387712,-112.506773454033819 57.787873602756186,-112.50602965362792 57.790118914420248,-112.505509534964048 57.79369679873173,-112.505881326918072 57.802621702826265,-112.505194340920738 57.806201559344679,-112.505863906410553 57.822266297194709,-112.504979712931302 57.826868962042354,-112.502868122897027 57.832529819603209,-112.502016115238121 57.838384556841156,-112.502685099554142 57.85444923604512,-112.501642916328478 57.861604909406338,-112.501717263253894 57.863389924130296,-112.500339754790858 57.870549539566795,-112.501008825027057 57.886614149130821,-112.498259721194898 57.893075634585244,-112.496426598966224 57.897383173943524,-112.494134708649781 57.902767680803109,-112.492198517338494 57.905712668961868,-112.486922559138577 57.910888519184773,-112.481645093420809 57.916064153996345,-112.479707178930497 57.919008953708158,-112.471301707861372 57.926524592531436,-112.457715851491145 57.935335441296694,-112.444650691837253 57.944413655168169,-112.428150201698941 57.951743263281507,-112.409149619307399 57.957799741661837,-112.398244777276688 57.960111722262049,-112.386216860247472 57.961850602482478,-112.378197131325464 57.963009230719749,-112.368172313004578 57.964456863198528,-112.361471417667488 57.964975243714285,-112.338092478617725 57.968794918916373,-112.314447100411982 57.965470045814193,-112.307712699136403 57.965093031903081,-112.297587629960631 57.963857408460413,-112.289487608068811 57.962868381337465,-112.277339091707049 57.961383861779694,-112.246832264859435 57.95365087944166,-112.243331413368409 57.952307862347681,-112.229327203853359 57.946933506707339,-112.211828675082245 57.940213814671282,-112.205997281503286 57.937973293372842,-112.194336670355881 57.933491560025203,-112.176850728158215 57.926766872857016,-112.165197366189048 57.922282432840717,-112.155003167933273 57.918357643311076,-112.141899338213747 57.913310306330523,-112.124433422496381 57.906578312894929,-112.114442071761985 57.904319107442532,-112.113610834064545 57.904131102861385,-112.103385635151355 57.901817818363199,-112.094005667708601 57.898808325903339,-112.085279637658246 57.895439308826113,-112.073647773428831 57.890946379946513,-112.063472383308124 57.887014167851554,-112.043730155864182 57.881959575671537,-112.043590677823772 57.881923849162675,-112.039229960675598 57.880806762818004,-112.038289805305951 57.880565894111875,-112.037901697298437 57.880466457489732,-112.037734156750233 57.88042353161692,-112.033074193416368 57.879229463820458,-112.031652351090898 57.878771964778792,-112.03150045459239 57.878723088173089,-112.028390104193818 57.877722183532505,-112.022906518357672 57.875293968878623,-112.011288900044534 57.870795271160098,-112.00257735472519 57.867420513377546,-111.991552918882121 57.86531562491934,-111.972208733439587 57.859621122922817,-111.948668372399112 57.856227884196372,-111.92843500371319 57.851020417703147,-111.911510731994454 57.844000415054985,-111.88118136247725 57.836179109758952,-111.869092148117204 57.834655407850832,-111.850865085831671 57.828350513443915,-111.821109923949521 57.844617518730885,-111.791327932102519 57.860877568579482,-111.791680718486461 57.876946183355145,-111.789058874743361 57.880559785017311,-111.795190085813687 57.889987319761467,-111.795502357128726 57.9041263769642,-111.795506523899732 57.904314950462528,-111.795893294906065 57.921808538958182,-111.789519719222838 57.934224892001147,-111.788766570917701 57.937765716425744,-111.784418262153082 57.94415773094218,-111.783292168818775 57.946349148149345,-111.784054784818096 57.953192872478461,-111.77859948249116 57.960832581686468,-111.778545275677629 57.960908476530307,-111.777729649211082 57.962050392056348,-111.775004918297313 57.973090346219649,-111.762732308857849 57.9813532651918,-111.748563470641898 57.984271986611205,-111.741585556786376 57.990926804704941,-111.74102170582978 57.991380623317148,-111.726996850386286 58.002664117208724,-111.705160319125127 58.008456058869413,-111.695923370421355 58.006173268331295,-111.689890980315781 58.008355741087954,-111.677981310126356 58.012662977645775,-111.672025404245701 58.0148163012285,-111.663089967355305 58.018045583795377,-111.648170161318887 58.022100507286574,-111.63621793777547 58.024547670641908,-111.632082525232931 58.025547491725611,-111.618279208923951 58.027818460000383,-111.595824937891905 58.030312384711387,-111.58833948163813 58.031142854311135,-111.582890420269337 58.031457215401005,-111.567644659528909 58.033326732439605,-111.565254421992918 58.034874413695647,-111.560343661658365 58.038053344155493,-111.553302459355365 58.042991417768626,-111.546834991644559 58.046794258913188,-111.53329817154389 58.054086821455115,-111.525902649592084 58.057406264881912,-111.517025630128472 58.061389055879189,-111.51069025799643 58.063826285202246,-111.506164107785168 58.065567019895354,-111.493209697344014 58.069063167292718,-111.491048945884756 58.069530884588538,-111.478950329679336 58.072390569554528,-111.474215362154965 58.073509289908749,-111.465342902430606 58.076058543971705,-111.456490209551148 58.078601140597208,-111.412085757016385 58.07861102052982,-111.411574259525068 58.078611044198176,-111.366309909615666 58.078605007431712,-111.362943962962802 58.078603926898715,-111.363189588146909 58.078418747725379,-111.365499964884918 58.07674787433303,-111.248257920425146 58.073663242252245,-111.248252820860458 58.03508929268385,-111.165388373977493 58.035068864753036),(-112.546847672440251 57.216756587722735,-112.543223037823452 57.208749222454102,-112.541164697841793 57.206409944997567,-112.535720130941797 57.200220652219535,-112.532660427300769 57.196741404753055,-112.532591022034239 57.196662474128708,-112.528595840609896 57.192118342803965,-112.527961368963034 57.191967142374374,-112.516096026879865 57.189138700248705,-112.505356799991389 57.190734440821984,-112.495105069416809 57.192256761750144,-112.494896799667004 57.19228767861263,-112.493164844274304 57.192544765534159,-112.491190672837121 57.192837772933132,-112.490890802888885 57.192882276647978,-112.47816928124405 57.194769521524087,-112.464067227109751 57.193512782427113,-112.463716849617569 57.193376406289538,-112.463585620083236 57.193325327788642,-112.455951959289962 57.190353594497552,-112.454983724454465 57.189976599421151,-112.454910881874056 57.189948236579831,-112.454803739399779 57.189906518172613,-112.453677516955125 57.189467986101334,-112.45332496636091 57.189330704592862,-112.453215921383674 57.189288242593079,-112.441812377549226 57.184846647028138,-112.430856121517024 57.180577273385957,-112.415548509792956 57.17460901520851,-112.413790485602291 57.174293521047765,-112.41365782028285 57.174269711773213,-112.402116846974451 57.172197812115506,-112.401977521075352 57.17217279163151,-112.397923356380389 57.171444652072374,-112.397796449294404 57.171421856613165,-112.396678365983576 57.171221016110707,-112.396512097973101 57.171191148467422,-112.396345162651173 57.171161160680235,-112.390297867119727 57.164654926522935,-112.379559287482294 57.153094951007084,-112.378282191847291 57.145543148184892,-112.367469172818417 57.138291313584517,-112.352971762375091 57.133125632240144,-112.336811732640982 57.131701722487016,-112.32541471368387 57.135774672270863,-112.313310070184059 57.140098398379209,-112.304676398534014 57.143180982854354,-112.304556207827204 57.143223888210059,-112.293225614274903 57.147267692671832,-112.276758116378744 57.150302493585698,-112.260806608321204 57.150329284533292,-112.246721268312641 57.153851581709176,-112.22973101022535 57.158097318600305,-112.217600553891188 57.161126629874481,-112.204322110319907 57.164440716576976,-112.189741064149189 57.161803301098608,-112.171655465734673 57.158529098446671,-112.159620423752727 57.162494696003314,-112.146494698867599 57.166570300783732,-112.146739212327319 57.174467849397558,-112.145880438546612 57.1764763736563,-112.145847307362502 57.176553857374941,-112.144253996190798 57.180279737346424,-112.144343453935562 57.183173744792548,-112.142745800946187 57.188977496573763,-112.140636633169933 57.19261497738507,-112.135757478743756 57.201026203429279,-112.135385709119689 57.20184839017481,-112.132876248261653 57.206172751619562,-112.132776980259635 57.206343790924592,-112.127875429131294 57.214787143290842,-112.11765180015972 57.225366041981395,-112.106543453772176 57.235951855952223,-112.103565386992784 57.239070893461374,-112.103436003378107 57.239206388146179,-112.094606129010529 57.248450666217742,-112.089592058769469 57.251860843651343,-112.089762446054294 57.257633112182766,-112.08976733404171 57.257798671976019,-112.089950296842616 57.263994466717989,-112.087173852057091 57.270447569734202,-112.081075541927945 57.275577998785209,-112.081002281720515 57.275639621211134,-112.075590510811892 57.280191018044412,-112.076059406287399 57.296259819792105,-112.088449715917605 57.296153192767569,-112.088583395846868 57.296152035702015,-112.118530528847828 57.295889245556452,-112.118713601701074 57.295887617127505,-112.11947008387007 57.295880885408678,-112.119677483010335 57.295879039027859,-112.135423086655337 57.295737863915193,-112.147006826782629 57.299768069333304,-112.147179306654508 57.299828063599023,-112.147352349075163 57.299888253102012,-112.147516140790572 57.299945224521416,-112.153433117622811 57.302003055043393,-112.177284217891128 57.304996852975272,-112.183222238946087 57.304941131679954,-112.190089348089714 57.305494178826706,-112.190277384653356 57.305509316961356,-112.195132057431451 57.305900047133484,-112.224820664390521 57.305614440284735,-112.236659813999552 57.304427063909742,-112.241253993432338 57.303667374324903,-112.254417527666092 57.302643789189496,-112.266236321001387 57.300917930628366,-112.283962868544748 57.298327309778784,-112.28932138779679 57.297176668779954,-112.296045400269563 57.296294898586375,-112.296256193311876 57.296267249229089,-112.298197272004145 57.296012622778143,-112.298362754118628 57.295990913650492,-112.308370573863741 57.294677564569803,-112.308897890509542 57.294608338952919,-112.309433866460026 57.294537974022326,-112.309566239077597 57.294520595256522,-112.313501192638086 57.294003917129572,-112.33386838302664 57.288843830722868,-112.342944691156148 57.28726363027878,-112.353938948436465 57.283529084679074,-112.354810902230781 57.283232832669306,-112.354926795748682 57.2831934562765,-112.37107968385709 57.27770343076994,-112.371206596943978 57.27766028104277,-112.372257750707391 57.277302885964616,-112.39123810487051 57.271421304678071,-112.401615954092975 57.268942152690911,-112.411398892644044 57.266153648513658,-112.414315564427326 57.265322115179202,-112.414440380070758 57.265286528318278,-112.415598284127213 57.264956382893679,-112.415730639473807 57.264918644247871,-112.430960770832172 57.260574615239364,-112.446361441267115 57.252834273862092,-112.458757986132412 57.247913733086371,-112.458883239556314 57.247864003552635,-112.460101560464906 57.247380278523359,-112.461678816591416 57.247016801949009,-112.461811438399437 57.246986238204578,-112.464299106465205 57.246412900198713,-112.466269295501021 57.245958821148797,-112.467740243312051 57.245619777297307,-112.468694097118473 57.245399907732441,-112.469083874380331 57.245310058684069,-112.470960760910785 57.244877387393799,-112.471083827619609 57.244849015977834,-112.471219067489301 57.244817838010427,-112.471426242669523 57.244770075816582,-112.474792455560888 57.24399396362908,-112.4752257771666 57.243883411939862,-112.475357300503802 57.243849856466788,-112.484951754855246 57.241401494446116,-112.489448233077965 57.239802577090444,-112.501937735584946 57.234487261225837,-112.518584649628792 57.227398183890195,-112.519067290778253 57.227240760434945,-112.520557389306717 57.226754713688265,-112.537191853745156 57.221326750581198,-112.546847672440251 57.216756587722735),(-112.568386353278683 57.208688923410485,-112.568437018439013 57.208793640137507,-112.568756097693054 57.208689335094682,-112.568386353278683 57.208688923410485))) \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/opposite.gpx b/vendor/phayes/geophp/tests/input/opposite.gpx new file mode 100644 index 0000000..c5c0c84 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/opposite.gpx @@ -0,0 +1,10 @@ + + + + Mons and its opposite + + + + + + diff --git a/vendor/phayes/geophp/tests/input/path.kml b/vendor/phayes/geophp/tests/input/path.kml new file mode 100644 index 0000000..0538daf --- /dev/null +++ b/vendor/phayes/geophp/tests/input/path.kml @@ -0,0 +1,40 @@ + + + + Paths + Examples of paths. Note that the tessellate tag is by default + set to 0. If you want to create tessellated lines, they must be authored + (or edited) directly in KML. + + + Absolute Extruded + Transparent green wall with yellow outlines + #yellowLineGreenPoly + + 1 + 1 + absolute + -112.2550785337791,36.07954952145647,2357 + -112.2549277039738,36.08117083492122,2357 + -112.2552505069063,36.08260761307279,2357 + -112.2564540158376,36.08395660588506,2357 + -112.2580238976449,36.08511401044813,2357 + -112.2595218489022,36.08584355239394,2357 + -112.2608216347552,36.08612634548589,2357 + -112.262073428656,36.08626019085147,2357 + -112.2633204928495,36.08621519860091,2357 + -112.2644963846444,36.08627897945274,2357 + -112.2656969554589,36.08649599090644,2357 + + + + + diff --git a/vendor/phayes/geophp/tests/input/paths_big.json b/vendor/phayes/geophp/tests/input/paths_big.json new file mode 100644 index 0000000..2869c31 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/paths_big.json @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76692, 35.48734], [-80.77014, 35.48202], [-80.77029, 35.48141], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77129, 35.47627], [-80.77338, 35.47499], [-80.77385, 35.47479], [-80.77466, 35.47456], [-80.77496, 35.47451], [-80.77555, 35.47452], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78513, 35.47345], [-80.78513, 35.47345], [-80.78478, 35.473], [-80.78408, 35.47125], [-80.78326, 35.46979], [-80.78294, 35.4695], [-80.78236, 35.4692], [-80.78193, 35.46861], [-80.78131, 35.46814], [-80.78114, 35.46795], [-80.77994, 35.46602], [-80.77953, 35.46526], [-80.77923, 35.46491], [-80.77911, 35.46452], [-80.77921, 35.46345], [-80.77921, 35.46345], [-80.77963, 35.4634], [-80.78107, 35.46309], [-80.7814, 35.46306], [-80.78186, 35.46311], [-80.78234, 35.46325], [-80.78308, 35.4635], [-80.78333, 35.46365], [-80.78376, 35.46411], [-80.78394, 35.46449], [-80.78397, 35.46492], [-80.78386, 35.46542], [-80.78318, 35.46637], [-80.783, 35.46685], [-80.78299, 35.46727], [-80.78307, 35.46766], [-80.78319, 35.46798], [-80.78344, 35.4683], [-80.78459, 35.46962], [-80.78509, 35.4701], [-80.7864, 35.47105], [-80.7868, 35.47129], [-80.78719, 35.47141], [-80.78903, 35.47162], [-80.79018, 35.47152], [-80.79018, 35.47152], [-80.78997, 35.47095], [-80.79022, 35.46936], [-80.79017, 35.46844], [-80.79029, 35.46802], [-80.79053, 35.46769], [-80.79178, 35.46668], [-80.79263, 35.4663], [-80.79466, 35.46507], [-80.79547, 35.46466], [-80.79563, 35.46453], [-80.79624, 35.46382], [-80.79659, 35.4636], [-80.79718, 35.46328], [-80.7974, 35.46322], [-80.79791, 35.46318], [-80.79836, 35.46305], [-80.79965, 35.46218], [-80.79989, 35.46207], [-80.80023, 35.46201], [-80.80051, 35.46203], [-80.8019, 35.46246], [-80.80237, 35.46249], [-80.80292, 35.46236], [-80.80452, 35.46168], [-80.80491, 35.46164], [-80.80531, 35.46172], [-80.80872, 35.46366], [-80.80891, 35.46391], [-80.80898, 35.46414], [-80.80904, 35.46524], [-80.80904, 35.46524], [-80.80967, 35.46515], [-80.81048, 35.4648], [-80.81068, 35.46467], [-80.81118, 35.46421], [-80.81118, 35.46421], [-80.80908, 35.46268], [-80.80832, 35.46197], [-80.80762, 35.46112], [-80.80752, 35.46108], [-80.80265, 35.45563], [-80.80251, 35.45539], [-80.80249, 35.4552], [-80.80262, 35.45501], [-80.8028, 35.45496], [-80.8028, 35.45496], [-80.80201, 35.45462], [-80.80131, 35.4542], [-80.7967, 35.4507], [-80.79601, 35.45024], [-80.79601, 35.45024], [-80.79658, 35.4494], [-80.79682, 35.44892], [-80.79849, 35.44498], [-80.79874, 35.44451], [-80.80039, 35.44281], [-80.80083, 35.44253], [-80.80162, 35.44223], [-80.80188, 35.44207], [-80.8023, 35.44173], [-80.80246, 35.4415], [-80.80258, 35.44105], [-80.80255, 35.44072], [-80.80203, 35.43964], [-80.80199, 35.43932], [-80.80209, 35.43903], [-80.80286, 35.43748], [-80.80291, 35.43724], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79201, 35.42529], [-80.79105, 35.42488], [-80.78822, 35.42335], [-80.7879, 35.42324], [-80.7875, 35.42319], [-80.78718, 35.4232], [-80.78176, 35.42352], [-80.78116, 35.42347], [-80.77896, 35.42292], [-80.77821, 35.42269], [-80.77798, 35.4225], [-80.77754, 35.4219], [-80.77713, 35.42156], [-80.77666, 35.42129], [-80.77589, 35.42095], [-80.77551, 35.42084], [-80.77484, 35.42075], [-80.77335, 35.42061], [-80.77282, 35.42064], [-80.77201, 35.42084], [-80.76792, 35.42236], [-80.76747, 35.4226], [-80.76462, 35.42464], [-80.7644, 35.42474], [-80.764, 35.42478], [-80.7631, 35.42467], [-80.76016, 35.42421], [-80.75971, 35.42409], [-80.75839, 35.42362], [-80.75811, 35.42354], [-80.7578, 35.42352], [-80.75713, 35.42358], [-80.75628, 35.42376], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.7534, 35.42141], [-80.75294, 35.42086], [-80.75256, 35.42057], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74601, 35.41862], [-80.74558, 35.41847], [-80.74309, 35.41645], [-80.74092, 35.4145], [-80.73984, 35.41359], [-80.73526, 35.41053], [-80.73379, 35.40906], [-80.73343, 35.40876], [-80.73307, 35.40855], [-80.73263, 35.40842], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72961, 35.40628], [-80.72908, 35.40393], [-80.7291, 35.40344], [-80.72923, 35.40296], [-80.72939, 35.40268], [-80.72999, 35.40205], [-80.73019, 35.40173], [-80.73088, 35.39884], [-80.73086, 35.39825], [-80.73066, 35.3974], [-80.73051, 35.39643], [-80.73034, 35.39461], [-80.73029, 35.39311]]}, "date": "2011-11-25", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74541, 35.41836], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.74711, 35.41763], [-80.75152, 35.41452], [-80.75224, 35.41397], [-80.75258, 35.41364], [-80.75295, 35.41311], [-80.75351, 35.41216], [-80.75563, 35.40678], [-80.75634, 35.40556], [-80.75714, 35.40466], [-80.75906, 35.40316], [-80.75998, 35.40249], [-80.76058, 35.40211], [-80.76155, 35.40157], [-80.76386, 35.40047], [-80.76612, 35.39919], [-80.76612, 35.39919], [-80.76939, 35.39733], [-80.77033, 35.39651], [-80.7737, 35.39328], [-80.7745, 35.39267], [-80.77556, 35.39213], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.77113, 35.38892], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76102, 35.38827], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75884, 35.38856], [-80.75825, 35.38843], [-80.75789, 35.38828], [-80.75704, 35.38776], [-80.75671, 35.38742], [-80.7563, 35.38668], [-80.75565, 35.38518], [-80.75508, 35.38432], [-80.75413, 35.38323], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75553, 35.37862], [-80.75573, 35.37832], [-80.75611, 35.37795], [-80.75674, 35.37759], [-80.75735, 35.3774], [-80.75805, 35.37736], [-80.75862, 35.37743], [-80.76162, 35.37853], [-80.76221, 35.37879], [-80.76516, 35.38052], [-80.76552, 35.38068], [-80.76587, 35.38077], [-80.76803, 35.38115], [-80.7685, 35.38117], [-80.76889, 35.3811], [-80.7692, 35.38099], [-80.77031, 35.38049], [-80.77078, 35.3804], [-80.77335, 35.38058], [-80.77364, 35.38058], [-80.77418, 35.38047], [-80.77461, 35.38026], [-80.77485, 35.38007], [-80.77562, 35.37919], [-80.77579, 35.37893], [-80.77588, 35.37864], [-80.7759, 35.37835], [-80.7758, 35.37791], [-80.77493, 35.37651], [-80.77405, 35.37449], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76446, 35.37382], [-80.76381, 35.3737], [-80.76206, 35.37361], [-80.76166, 35.37353], [-80.76125, 35.37338], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2011-11-26", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72977, 35.40227], [-80.73013, 35.40186], [-80.73025, 35.40154], [-80.7309, 35.39864], [-80.73051, 35.39643], [-80.73034, 35.39461], [-80.7302, 35.38882], [-80.72996, 35.38803], [-80.72911, 35.38634], [-80.72899, 35.38591], [-80.72904, 35.38526], [-80.7294, 35.38313], [-80.72947, 35.38294], [-80.72993, 35.38223], [-80.73056, 35.3817], [-80.73168, 35.38118], [-80.73298, 35.38066], [-80.73431, 35.38006], [-80.73496, 35.37958], [-80.73557, 35.3789], [-80.73557, 35.3789], [-80.73695, 35.37964], [-80.73754, 35.37989], [-80.73972, 35.3801], [-80.73972, 35.3801], [-80.7397, 35.37996], [-80.74169, 35.37404], [-80.74194, 35.37342], [-80.74209, 35.37318], [-80.74263, 35.37261], [-80.7431, 35.3723], [-80.74372, 35.37205], [-80.74519, 35.37161], [-80.74567, 35.37137], [-80.74668, 35.37067], [-80.74705, 35.37032], [-80.74734, 35.36994], [-80.74752, 35.36956], [-80.74768, 35.36903], [-80.74807, 35.36734], [-80.74841, 35.36441], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74935, 35.36524], [-80.74977, 35.36557], [-80.75176, 35.36689], [-80.75376, 35.36863], [-80.75496, 35.37006], [-80.75575, 35.37073], [-80.75623, 35.371], [-80.7582, 35.37169], [-80.76125, 35.37338], [-80.76166, 35.37353], [-80.76206, 35.37361], [-80.76381, 35.3737], [-80.76446, 35.37382], [-80.76517, 35.37399], [-80.76961, 35.37529], [-80.77002, 35.37536], [-80.77037, 35.37537], [-80.77076, 35.37531], [-80.77389, 35.37453], [-80.77389, 35.37453], [-80.77456, 35.3761], [-80.77563, 35.37794], [-80.77577, 35.37835], [-80.77567, 35.37886], [-80.77546, 35.37917], [-80.77464, 35.38006], [-80.77419, 35.38031], [-80.77378, 35.38042], [-80.77344, 35.38045], [-80.77097, 35.38027], [-80.77062, 35.38029], [-80.77026, 35.38037], [-80.76917, 35.38089], [-80.76852, 35.38104], [-80.76801, 35.38102], [-80.76618, 35.3807], [-80.76559, 35.38058], [-80.76539, 35.3805], [-80.7643, 35.3799], [-80.76263, 35.37887], [-80.76223, 35.37865], [-80.76161, 35.37839], [-80.75862, 35.37731], [-80.75803, 35.37724], [-80.75731, 35.37728], [-80.75667, 35.37747], [-80.75623, 35.37771], [-80.75575, 35.3781], [-80.75551, 35.37839], [-80.7553, 35.3788], [-80.75405, 35.38193], [-80.75388, 35.38243], [-80.75386, 35.38272], [-80.75393, 35.38307], [-80.75403, 35.38328], [-80.75496, 35.3844], [-80.75552, 35.38525], [-80.75613, 35.38668], [-80.75659, 35.38747], [-80.75693, 35.38783], [-80.75719, 35.38803], [-80.75804, 35.38847], [-80.75844, 35.3886], [-80.759, 35.38869], [-80.75969, 35.38872], [-80.76021, 35.38866], [-80.76084, 35.38849], [-80.76391, 35.38721], [-80.76449, 35.38704], [-80.76489, 35.38699], [-80.76552, 35.38701], [-80.76775, 35.38731], [-80.76864, 35.38747], [-80.76912, 35.3877], [-80.77103, 35.38901], [-80.77491, 35.39178], [-80.77537, 35.39222], [-80.77537, 35.39222], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.76955, 35.38783], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76102, 35.38827], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75884, 35.38856], [-80.75825, 35.38843], [-80.75789, 35.38828], [-80.75704, 35.38776], [-80.75671, 35.38742], [-80.7563, 35.38668], [-80.75565, 35.38518], [-80.75508, 35.38432], [-80.75413, 35.38323], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75553, 35.37862], [-80.75573, 35.37832], [-80.75611, 35.37795], [-80.75674, 35.37759], [-80.75735, 35.3774], [-80.75805, 35.37736], [-80.75862, 35.37743], [-80.76162, 35.37853], [-80.76221, 35.37879], [-80.76516, 35.38052], [-80.76552, 35.38068], [-80.76587, 35.38077], [-80.76803, 35.38115], [-80.7685, 35.38117], [-80.76889, 35.3811], [-80.7692, 35.38099], [-80.77031, 35.38049], [-80.77078, 35.3804], [-80.77335, 35.38058], [-80.77364, 35.38058], [-80.77418, 35.38047], [-80.77461, 35.38026], [-80.77485, 35.38007], [-80.77562, 35.37919], [-80.77579, 35.37893], [-80.77588, 35.37864], [-80.7759, 35.37835], [-80.7758, 35.37791], [-80.77493, 35.37651], [-80.77405, 35.37449], [-80.77405, 35.37449], [-80.77389, 35.37453], [-80.77456, 35.3761], [-80.77563, 35.37794], [-80.77575, 35.37823], [-80.77577, 35.37846], [-80.77571, 35.37875], [-80.77557, 35.37903], [-80.77509, 35.37959], [-80.77464, 35.38006], [-80.77404, 35.38036], [-80.77344, 35.38045], [-80.77097, 35.38027], [-80.77062, 35.38029], [-80.77026, 35.38037], [-80.76917, 35.38089], [-80.76852, 35.38104], [-80.76801, 35.38102], [-80.76618, 35.3807], [-80.76559, 35.38058], [-80.76539, 35.3805], [-80.7643, 35.3799], [-80.76263, 35.37887], [-80.76192, 35.37851], [-80.75888, 35.37738], [-80.75844, 35.37727], [-80.75781, 35.37724], [-80.75731, 35.37728], [-80.75667, 35.37747], [-80.75602, 35.37785], [-80.75562, 35.37824], [-80.7553, 35.3788], [-80.75442, 35.38099], [-80.75442, 35.38099], [-80.75238, 35.38084], [-80.75169, 35.38072], [-80.75118, 35.38047], [-80.75038, 35.37981], [-80.7494, 35.37945], [-80.74884, 35.37936], [-80.7482, 35.37943], [-80.74531, 35.38097], [-80.74512, 35.38101], [-80.74512, 35.38101], [-80.74497, 35.38099], [-80.74487, 35.38112], [-80.74446, 35.38125], [-80.74417, 35.38128], [-80.74362, 35.38123], [-80.74006, 35.38016], [-80.7396, 35.38007], [-80.73766, 35.37992], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.7294, 35.38313], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73034, 35.39461], [-80.73051, 35.39643], [-80.7309, 35.39864], [-80.73019, 35.40173], [-80.73004, 35.40199], [-80.72934, 35.40276]]}, "date": "2011-11-27", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76692, 35.48734], [-80.77014, 35.48202], [-80.77029, 35.48141], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77129, 35.47627], [-80.77338, 35.47499], [-80.77385, 35.47479], [-80.77466, 35.47456], [-80.77496, 35.47451], [-80.77555, 35.47452], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78257, 35.47469], [-80.78695, 35.47255], [-80.78738, 35.47238], [-80.78884, 35.47203], [-80.78955, 35.47199], [-80.79018, 35.47206], [-80.79672, 35.47415], [-80.79748, 35.47426], [-80.7998, 35.47442], [-80.8005, 35.47461], [-80.80099, 35.47483], [-80.80147, 35.47516], [-80.80192, 35.47563], [-80.80515, 35.48001], [-80.80552, 35.48044], [-80.80593, 35.48074], [-80.80689, 35.48129], [-80.80988, 35.48296], [-80.81042, 35.48322], [-80.81114, 35.48342], [-80.81157, 35.48346], [-80.81796, 35.48335], [-80.81835, 35.48338], [-80.81883, 35.48349], [-80.81934, 35.48377], [-80.8196, 35.48397], [-80.8196, 35.48397], [-80.81962, 35.48407], [-80.81972, 35.48414], [-80.81984, 35.48416], [-80.81994, 35.4841], [-80.81997, 35.48401], [-80.81992, 35.4839], [-80.82006, 35.48347], [-80.82004, 35.48142], [-80.81995, 35.47924], [-80.81968, 35.47795], [-80.81916, 35.47674], [-80.8167, 35.47246], [-80.81639, 35.4716], [-80.81604, 35.47019], [-80.81576, 35.46964], [-80.81506, 35.46871], [-80.81487, 35.46838], [-80.81426, 35.46677], [-80.81401, 35.46641], [-80.8136, 35.46595], [-80.8124, 35.46509], [-80.81236, 35.465], [-80.81118, 35.46421], [-80.80908, 35.46268], [-80.8085, 35.46216], [-80.80762, 35.46112], [-80.80752, 35.46108], [-80.80265, 35.45563], [-80.80251, 35.45539], [-80.80249, 35.4552], [-80.80262, 35.45501], [-80.8028, 35.45496], [-80.8028, 35.45496], [-80.80201, 35.45462], [-80.80131, 35.4542], [-80.7967, 35.4507], [-80.79601, 35.45024], [-80.79601, 35.45024], [-80.79658, 35.4494], [-80.79682, 35.44892], [-80.79849, 35.44498], [-80.79874, 35.44451], [-80.80039, 35.44281], [-80.80083, 35.44253], [-80.80162, 35.44223], [-80.80188, 35.44207], [-80.8023, 35.44173], [-80.80246, 35.4415], [-80.80258, 35.44105], [-80.80255, 35.44072], [-80.80203, 35.43964], [-80.80199, 35.43932], [-80.80209, 35.43903], [-80.80286, 35.43748], [-80.80291, 35.43724], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79201, 35.42529], [-80.79105, 35.42488], [-80.78822, 35.42335], [-80.7879, 35.42324], [-80.7875, 35.42319], [-80.78718, 35.4232], [-80.78176, 35.42352], [-80.78116, 35.42347], [-80.77896, 35.42292], [-80.77821, 35.42269], [-80.77798, 35.4225], [-80.77754, 35.4219], [-80.77713, 35.42156], [-80.77666, 35.42129], [-80.77589, 35.42095], [-80.77551, 35.42084], [-80.77484, 35.42075], [-80.77335, 35.42061], [-80.77282, 35.42064], [-80.77201, 35.42084], [-80.76792, 35.42236], [-80.76747, 35.4226], [-80.76462, 35.42464], [-80.7644, 35.42474], [-80.764, 35.42478], [-80.7631, 35.42467], [-80.76016, 35.42421], [-80.75971, 35.42409], [-80.75839, 35.42362], [-80.75811, 35.42354], [-80.7578, 35.42352], [-80.75713, 35.42358], [-80.75628, 35.42376], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.7534, 35.42141], [-80.75294, 35.42086], [-80.75256, 35.42057], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.74502, 35.41897], [-80.74457, 35.41942], [-80.74438, 35.41972], [-80.74357, 35.42151], [-80.74245, 35.42302], [-80.74173, 35.42365], [-80.73997, 35.42449], [-80.73972, 35.4247], [-80.73932, 35.42516], [-80.73816, 35.42668], [-80.73642, 35.42943], [-80.73609, 35.42975], [-80.73579, 35.4299], [-80.7314, 35.43146], [-80.72992, 35.43235], [-80.7293, 35.43265], [-80.72694, 35.43335], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.7238, 35.43138], [-80.72349, 35.4309], [-80.72299, 35.43049], [-80.72218, 35.43024], [-80.71963, 35.42982], [-80.718, 35.42952], [-80.71766, 35.42941], [-80.71627, 35.42868], [-80.71456, 35.42759], [-80.71387, 35.4272], [-80.71266, 35.42686], [-80.71209, 35.42663], [-80.71151, 35.42623], [-80.71103, 35.42562], [-80.70952, 35.42201], [-80.70926, 35.42133], [-80.70913, 35.42079], [-80.70914, 35.41998], [-80.70977, 35.41247], [-80.70992, 35.41192], [-80.71023, 35.41139], [-80.71147, 35.41031], [-80.7117, 35.41006], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7135, 35.4071], [-80.71563, 35.40069], [-80.71869, 35.3908], [-80.72042, 35.3848], [-80.72075, 35.38397], [-80.72167, 35.38264], [-80.72196, 35.38228], [-80.72237, 35.3819], [-80.72297, 35.38152], [-80.7256, 35.38017], [-80.72742, 35.37909], [-80.72851, 35.37852], [-80.72894, 35.37822], [-80.72952, 35.37751], [-80.73011, 35.3763], [-80.73169, 35.37355], [-80.73211, 35.37284], [-80.73264, 35.37214], [-80.73272, 35.37197], [-80.73272, 35.37197], [-80.73378, 35.37062], [-80.73503, 35.36861], [-80.73543, 35.36819], [-80.73698, 35.36709], [-80.74085, 35.36572], [-80.74131, 35.36551], [-80.7414, 35.36542], [-80.74176, 35.36489], [-80.74183, 35.36466], [-80.74181, 35.36362], [-80.7419, 35.36321], [-80.74199, 35.36301], [-80.74285, 35.36188], [-80.74313, 35.36135], [-80.74348, 35.35987], [-80.74348, 35.35987], [-80.74369, 35.35976], [-80.74651, 35.3599], [-80.74949, 35.35954], [-80.74949, 35.35954], [-80.74889, 35.36133], [-80.74846, 35.36343], [-80.74844, 35.36387], [-80.74848, 35.3641], [-80.74935, 35.36524], [-80.74977, 35.36557], [-80.75176, 35.36689], [-80.75376, 35.36863], [-80.75496, 35.37006], [-80.75542, 35.37048], [-80.75591, 35.37084], [-80.75623, 35.371], [-80.7582, 35.37169], [-80.75893, 35.37207], [-80.76066, 35.37308], [-80.7615, 35.37348], [-80.76228, 35.37364], [-80.76381, 35.3737], [-80.76446, 35.37382], [-80.76517, 35.37399], [-80.76961, 35.37529], [-80.7702, 35.37537], [-80.77066, 35.37533], [-80.77389, 35.37453], [-80.77389, 35.37453], [-80.77456, 35.3761], [-80.77563, 35.37794], [-80.77577, 35.37835], [-80.77567, 35.37886], [-80.77546, 35.37917], [-80.77464, 35.38006], [-80.77404, 35.38036], [-80.77344, 35.38045], [-80.77097, 35.38027], [-80.77062, 35.38029], [-80.77026, 35.38037], [-80.76917, 35.38089], [-80.76852, 35.38104], [-80.76801, 35.38102], [-80.76618, 35.3807], [-80.76559, 35.38058], [-80.76539, 35.3805], [-80.7643, 35.3799], [-80.76263, 35.37887], [-80.76192, 35.37851], [-80.75888, 35.37738], [-80.75844, 35.37727], [-80.75781, 35.37724], [-80.75731, 35.37728], [-80.75667, 35.37747], [-80.75602, 35.37785], [-80.75562, 35.37824], [-80.7553, 35.3788], [-80.75442, 35.38099], [-80.75442, 35.38099], [-80.75238, 35.38084], [-80.75169, 35.38072], [-80.75118, 35.38047], [-80.75038, 35.37981], [-80.7494, 35.37945], [-80.74884, 35.37936], [-80.7482, 35.37943], [-80.74531, 35.38097], [-80.74512, 35.38101], [-80.74512, 35.38101], [-80.74497, 35.38099], [-80.74487, 35.38112], [-80.74446, 35.38125], [-80.74417, 35.38128], [-80.74362, 35.38123], [-80.74006, 35.38016], [-80.7396, 35.38007], [-80.73766, 35.37992], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2011-11-28", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72865, 35.40114], [-80.73028, 35.40139], [-80.73028, 35.40139], [-80.7309, 35.39864], [-80.73051, 35.39643], [-80.73034, 35.39461], [-80.7302, 35.38882], [-80.72996, 35.38803], [-80.72911, 35.38634], [-80.72899, 35.38591], [-80.72904, 35.38526], [-80.7294, 35.38313], [-80.72947, 35.38294], [-80.72993, 35.38223], [-80.73056, 35.3817], [-80.73168, 35.38118], [-80.73298, 35.38066], [-80.73431, 35.38006], [-80.73496, 35.37958], [-80.73557, 35.3789], [-80.73557, 35.3789], [-80.73695, 35.37964], [-80.73754, 35.37989], [-80.73972, 35.3801], [-80.73972, 35.3801], [-80.7397, 35.37996], [-80.74169, 35.37404], [-80.74194, 35.37342], [-80.74209, 35.37318], [-80.74263, 35.37261], [-80.7431, 35.3723], [-80.74372, 35.37205], [-80.74519, 35.37161], [-80.74567, 35.37137], [-80.74668, 35.37067], [-80.74705, 35.37032], [-80.74734, 35.36994], [-80.74752, 35.36956], [-80.74768, 35.36903], [-80.74807, 35.36734], [-80.74841, 35.36441], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74935, 35.36524], [-80.74977, 35.36557], [-80.75176, 35.36689], [-80.75376, 35.36863], [-80.75496, 35.37006], [-80.75575, 35.37073], [-80.75623, 35.371], [-80.7582, 35.37169], [-80.76079, 35.37315], [-80.76125, 35.37338], [-80.76186, 35.37358], [-80.76241, 35.37365], [-80.76381, 35.3737], [-80.76413, 35.37375], [-80.76517, 35.37399], [-80.76961, 35.37529], [-80.77002, 35.37536], [-80.77037, 35.37537], [-80.77076, 35.37531], [-80.77405, 35.37449], [-80.77909, 35.37297], [-80.78075, 35.37251], [-80.78121, 35.37247], [-80.7817, 35.37251], [-80.78295, 35.3729], [-80.78339, 35.37296], [-80.78472, 35.37284], [-80.78472, 35.37284], [-80.78513, 35.37529], [-80.78617, 35.38252], [-80.7865, 35.38408], [-80.78659, 35.38439], [-80.78668, 35.38447], [-80.78668, 35.38447], [-80.78686, 35.38424], [-80.78813, 35.383], [-80.7888, 35.38249], [-80.78948, 35.38206], [-80.78991, 35.38187], [-80.79396, 35.38059], [-80.7944, 35.3804], [-80.80313, 35.37445], [-80.80574, 35.37294], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.8077, 35.37243], [-80.80821, 35.37295], [-80.80839, 35.37338], [-80.80859, 35.37423], [-80.80881, 35.37619], [-80.80872, 35.37813], [-80.80877, 35.37857], [-80.80989, 35.38108], [-80.80999, 35.38137], [-80.80998, 35.38165], [-80.80989, 35.38181], [-80.80968, 35.38193], [-80.80646, 35.38332], [-80.80551, 35.38377], [-80.80485, 35.38417], [-80.80457, 35.3844], [-80.80437, 35.38469], [-80.80425, 35.3853], [-80.8042, 35.38641], [-80.80426, 35.38685], [-80.80463, 35.38838], [-80.80465, 35.38868], [-80.80459, 35.38905], [-80.80431, 35.39016], [-80.80313, 35.39375], [-80.80272, 35.3948], [-80.80234, 35.39557], [-80.80226, 35.39591], [-80.80238, 35.39644], [-80.8035, 35.3993], [-80.80368, 35.40065], [-80.80366, 35.40169], [-80.80349, 35.40201], [-80.80186, 35.40341], [-80.80147, 35.40387], [-80.80129, 35.40417], [-80.80126, 35.40431], [-80.80133, 35.4049], [-80.80179, 35.40653], [-80.80203, 35.40691], [-80.80251, 35.40739], [-80.80282, 35.40789], [-80.8031, 35.40852], [-80.80334, 35.40933], [-80.80356, 35.40982], [-80.80437, 35.41073], [-80.80462, 35.41114], [-80.80469, 35.41138], [-80.80471, 35.41173], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.8022, 35.41425], [-80.80186, 35.41438], [-80.80089, 35.41512], [-80.80057, 35.41562], [-80.79885, 35.41926], [-80.79863, 35.41961], [-80.79732, 35.42077], [-80.79483, 35.42324], [-80.79406, 35.42406], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79201, 35.42529], [-80.79105, 35.42488], [-80.78822, 35.42335], [-80.7879, 35.42324], [-80.7875, 35.42319], [-80.78718, 35.4232], [-80.78176, 35.42352], [-80.78116, 35.42347], [-80.77896, 35.42292], [-80.77821, 35.42269], [-80.77798, 35.4225], [-80.77754, 35.4219], [-80.77713, 35.42156], [-80.77666, 35.42129], [-80.77589, 35.42095], [-80.77551, 35.42084], [-80.77484, 35.42075], [-80.77335, 35.42061], [-80.77282, 35.42064], [-80.77201, 35.42084], [-80.76792, 35.42236], [-80.76747, 35.4226], [-80.76462, 35.42464], [-80.7644, 35.42474], [-80.764, 35.42478], [-80.7631, 35.42467], [-80.76016, 35.42421], [-80.75971, 35.42409], [-80.75839, 35.42362], [-80.75811, 35.42354], [-80.7578, 35.42352], [-80.75713, 35.42358], [-80.75628, 35.42376], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.7534, 35.42141], [-80.75294, 35.42086], [-80.75256, 35.42057], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.74502, 35.41897], [-80.74457, 35.41942], [-80.74438, 35.41972], [-80.74357, 35.42151], [-80.74245, 35.42302], [-80.74173, 35.42365], [-80.73997, 35.42449], [-80.73972, 35.4247], [-80.73932, 35.42516], [-80.73816, 35.42668], [-80.73642, 35.42943], [-80.73609, 35.42975], [-80.73579, 35.4299], [-80.7314, 35.43146], [-80.72992, 35.43235], [-80.7293, 35.43265], [-80.72694, 35.43335], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.7238, 35.43138], [-80.72349, 35.4309], [-80.72299, 35.43049], [-80.72218, 35.43024], [-80.71963, 35.42982], [-80.718, 35.42952], [-80.71766, 35.42941], [-80.71627, 35.42868], [-80.71456, 35.42759], [-80.71387, 35.4272], [-80.71266, 35.42686], [-80.71209, 35.42663], [-80.71151, 35.42623], [-80.71103, 35.42562], [-80.70952, 35.42201], [-80.70926, 35.42133], [-80.70913, 35.42079], [-80.70914, 35.41998], [-80.70977, 35.41247], [-80.70992, 35.41192], [-80.71023, 35.41139], [-80.71147, 35.41031], [-80.7117, 35.41006], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.71716, 35.40911], [-80.71772, 35.4093], [-80.71809, 35.4094], [-80.72187, 35.4098], [-80.7223, 35.40982], [-80.7229, 35.40976], [-80.72802, 35.40826], [-80.72892, 35.40821], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72969, 35.40648], [-80.72956, 35.40612], [-80.72945, 35.4055], [-80.72912, 35.40425], [-80.72908, 35.40376], [-80.72918, 35.4031], [-80.72939, 35.40268], [-80.72977, 35.40227]]}, "date": "2011-12-05", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72865, 35.40114], [-80.73028, 35.40139], [-80.73028, 35.40139], [-80.7309, 35.39864], [-80.73051, 35.39643], [-80.73034, 35.39461], [-80.7302, 35.38882], [-80.72996, 35.38803], [-80.72911, 35.38634], [-80.72899, 35.38591], [-80.72904, 35.38526], [-80.7294, 35.38313], [-80.72947, 35.38294], [-80.72993, 35.38223], [-80.73056, 35.3817], [-80.73168, 35.38118], [-80.73298, 35.38066], [-80.73431, 35.38006], [-80.73496, 35.37958], [-80.73557, 35.3789], [-80.73557, 35.3789], [-80.73695, 35.37964], [-80.73754, 35.37989], [-80.73972, 35.3801], [-80.73972, 35.3801], [-80.7397, 35.37996], [-80.74169, 35.37404], [-80.74194, 35.37342], [-80.74209, 35.37318], [-80.74263, 35.37261], [-80.7431, 35.3723], [-80.74372, 35.37205], [-80.74519, 35.37161], [-80.74567, 35.37137], [-80.74668, 35.37067], [-80.74705, 35.37032], [-80.74734, 35.36994], [-80.74752, 35.36956], [-80.74768, 35.36903], [-80.74807, 35.36734], [-80.74841, 35.36441], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74844, 35.36387], [-80.74846, 35.36343], [-80.74872, 35.36212], [-80.74897, 35.36103], [-80.74949, 35.35954], [-80.74949, 35.35954], [-80.74651, 35.3599], [-80.74394, 35.35979], [-80.74343, 35.3597], [-80.74257, 35.35935], [-80.73395, 35.35453], [-80.73341, 35.35438], [-80.73295, 35.35432], [-80.73249, 35.35433], [-80.73092, 35.35464], [-80.73061, 35.35464], [-80.72996, 35.35449], [-80.72947, 35.35421], [-80.72738, 35.35245], [-80.72615, 35.35102], [-80.7253, 35.34995], [-80.7253, 35.34995], [-80.72263, 35.34575], [-80.72117, 35.34356], [-80.72057, 35.34236], [-80.72033, 35.34212], [-80.71889, 35.34098], [-80.71858, 35.34052], [-80.71798, 35.33815], [-80.71758, 35.33695], [-80.7176, 35.33673], [-80.7177, 35.3365], [-80.71817, 35.33597], [-80.71838, 35.33562], [-80.71845, 35.33537], [-80.71838, 35.33489], [-80.71852, 35.33465], [-80.71852, 35.33465], [-80.72037, 35.33397], [-80.72141, 35.33336], [-80.72177, 35.3331], [-80.72177, 35.3331], [-80.72245, 35.33278], [-80.72266, 35.33273], [-80.72301, 35.33275], [-80.72322, 35.33285], [-80.72341, 35.33307], [-80.72346, 35.33329], [-80.72342, 35.3335], [-80.7233, 35.3337], [-80.72313, 35.33386], [-80.72291, 35.33397], [-80.72257, 35.33401], [-80.72209, 35.33388], [-80.72152, 35.3335], [-80.72152, 35.3335], [-80.71983, 35.33134], [-80.71901, 35.3302], [-80.71248, 35.31925], [-80.71116, 35.31696], [-80.71116, 35.31696], [-80.71096, 35.31634], [-80.71088, 35.31591], [-80.71087, 35.31549], [-80.71109, 35.31344], [-80.71108, 35.31306], [-80.71086, 35.31185], [-80.71091, 35.31176], [-80.7111, 35.31163], [-80.71228, 35.31129], [-80.71228, 35.31129], [-80.712, 35.31072], [-80.71115, 35.30926], [-80.711, 35.30908], [-80.71064, 35.30879], [-80.70891, 35.30766], [-80.70843, 35.30727], [-80.70672, 35.30455], [-80.70647, 35.30395], [-80.70466, 35.29854], [-80.7046, 35.29743], [-80.70439, 35.2953], [-80.70439, 35.2953], [-80.70178, 35.29694], [-80.70162, 35.29711], [-80.70146, 35.29746], [-80.70142, 35.29799], [-80.70133, 35.29821], [-80.70103, 35.29845], [-80.69992, 35.29897], [-80.69956, 35.29933], [-80.69942, 35.29955], [-80.69942, 35.29955], [-80.69768, 35.29907], [-80.69768, 35.29907], [-80.69772, 35.29872], [-80.69761, 35.2984], [-80.69736, 35.29815], [-80.69705, 35.29798], [-80.6966, 35.29788], [-80.69625, 35.29786], [-80.69589, 35.29795], [-80.69553, 35.29815], [-80.69435, 35.29954], [-80.69405, 35.30003], [-80.69373, 35.30121], [-80.69335, 35.30169], [-80.6932, 35.302], [-80.69319, 35.30222], [-80.69335, 35.30292], [-80.69327, 35.30324], [-80.6931, 35.30345], [-80.6931, 35.30345], [-80.69278, 35.30326], [-80.69244, 35.30324], [-80.69145, 35.3036], [-80.69108, 35.30367], [-80.69058, 35.30368], [-80.68956, 35.30348], [-80.68903, 35.30327], [-80.68872, 35.30301], [-80.68847, 35.30261], [-80.68842, 35.30223], [-80.68842, 35.30223], [-80.68869, 35.30223], [-80.68906, 35.30212], [-80.68972, 35.30163], [-80.68972, 35.30163], [-80.68957, 35.30146], [-80.68898, 35.30104], [-80.6888, 35.30084], [-80.68866, 35.30053], [-80.68864, 35.30026], [-80.68873, 35.3], [-80.68901, 35.29964], [-80.68916, 35.29957], [-80.68916, 35.29944], [-80.68911, 35.29939], [-80.68937, 35.29877], [-80.69001, 35.29773], [-80.69005, 35.29737], [-80.68999, 35.29717], [-80.68978, 35.29688], [-80.68819, 35.29571], [-80.68799, 35.29551], [-80.68766, 35.29461], [-80.68732, 35.29419], [-80.68546, 35.29311], [-80.68546, 35.29311], [-80.68255, 35.29656], [-80.681, 35.29826], [-80.68008, 35.2994], [-80.67923, 35.30026], [-80.67843, 35.30089], [-80.67814, 35.30118], [-80.67814, 35.30118], [-80.67302, 35.30539], [-80.67302, 35.30539], [-80.67353, 35.30751], [-80.67373, 35.30856], [-80.67373, 35.30888], [-80.67358, 35.30969], [-80.67334, 35.31044], [-80.67246, 35.31256], [-80.67234, 35.3133], [-80.67239, 35.31422], [-80.67254, 35.31458], [-80.67306, 35.31547], [-80.67364, 35.31621], [-80.67408, 35.31716], [-80.67453, 35.31767], [-80.67453, 35.31767], [-80.67244, 35.31903], [-80.67118, 35.31978], [-80.67044, 35.32008], [-80.66982, 35.32026], [-80.66894, 35.32042], [-80.6681, 35.32051], [-80.66052, 35.32117], [-80.66052, 35.32117], [-80.66116, 35.32268], [-80.66438, 35.32764], [-80.66565, 35.32994], [-80.66579, 35.33025], [-80.66643, 35.33223], [-80.66673, 35.33277], [-80.66703, 35.33304], [-80.67149, 35.33625], [-80.67468, 35.33883], [-80.67704, 35.34029], [-80.67751, 35.3407], [-80.68082, 35.34395], [-80.68082, 35.34395], [-80.68137, 35.34442], [-80.68191, 35.34474], [-80.68299, 35.34515], [-80.68547, 35.34585], [-80.68633, 35.34627], [-80.68668, 35.3465], [-80.68714, 35.34692], [-80.68876, 35.34861], [-80.68941, 35.34907], [-80.68941, 35.34907], [-80.69315, 35.35055], [-80.69365, 35.35071], [-80.69413, 35.35077], [-80.6944, 35.35078], [-80.69584, 35.35065], [-80.70301, 35.34992], [-80.70336, 35.34991], [-80.70377, 35.34998], [-80.70377, 35.34998], [-80.70433, 35.35016], [-80.70461, 35.35031], [-80.70826, 35.35281], [-80.70866, 35.35303], [-80.70913, 35.35319], [-80.70941, 35.35324], [-80.71209, 35.35342], [-80.71209, 35.35342], [-80.71277, 35.3533], [-80.71321, 35.35306], [-80.71346, 35.35281], [-80.71419, 35.35182], [-80.71445, 35.35155], [-80.71499, 35.3512], [-80.71562, 35.35099], [-80.71624, 35.35091], [-80.72426, 35.35026], [-80.72502, 35.35008], [-80.7253, 35.34995], [-80.7253, 35.34995], [-80.72615, 35.35102], [-80.72738, 35.35245], [-80.72947, 35.35421], [-80.72996, 35.35449], [-80.73061, 35.35464], [-80.73092, 35.35464], [-80.73249, 35.35433], [-80.73295, 35.35432], [-80.73341, 35.35438], [-80.73395, 35.35453], [-80.74257, 35.35935], [-80.74343, 35.3597], [-80.74394, 35.35979], [-80.74651, 35.3599], [-80.74949, 35.35954], [-80.74949, 35.35954], [-80.74897, 35.36103], [-80.74872, 35.36212], [-80.74846, 35.36343], [-80.74844, 35.36387], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.7294, 35.38313], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73034, 35.39461], [-80.73051, 35.39643], [-80.7309, 35.39864], [-80.73025, 35.40154], [-80.73013, 35.40186], [-80.72977, 35.40227]]}, "date": "2011-12-06", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.70992, 35.41192], [-80.70977, 35.41247], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70926, 35.42133], [-80.70952, 35.42201], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71209, 35.42663], [-80.71266, 35.42686], [-80.71387, 35.4272], [-80.71456, 35.42759], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72299, 35.43049], [-80.72329, 35.4307], [-80.72349, 35.4309], [-80.7238, 35.43138], [-80.72696, 35.4384], [-80.72724, 35.43916], [-80.72749, 35.4402], [-80.72749, 35.4402], [-80.71359, 35.4384], [-80.70981, 35.43753], [-80.7088, 35.43736], [-80.70755, 35.43728], [-80.70671, 35.43728], [-80.70461, 35.43741], [-80.7034, 35.43738], [-80.70253, 35.43725], [-80.69988, 35.43674], [-80.69885, 35.43666], [-80.69806, 35.43672], [-80.69323, 35.43738], [-80.69246, 35.43741], [-80.6805, 35.43642], [-80.6805, 35.43642], [-80.68038, 35.43754], [-80.68024, 35.43811], [-80.67983, 35.43935], [-80.67926, 35.44075], [-80.67881, 35.44167], [-80.67792, 35.44315], [-80.67648, 35.44492], [-80.6748, 35.44654], [-80.66977, 35.45119], [-80.66677, 35.45405], [-80.66677, 35.45405], [-80.66573, 35.45499], [-80.66558, 35.45507], [-80.66499, 35.45564], [-80.66445, 35.45622], [-80.66411, 35.45673], [-80.66375, 35.45761], [-80.66363, 35.45817], [-80.6636, 35.45874], [-80.66364, 35.45928], [-80.66379, 35.45991], [-80.66401, 35.46045], [-80.66442, 35.46113], [-80.66788, 35.46542], [-80.66973, 35.46783], [-80.66997, 35.46835], [-80.67019, 35.46912], [-80.67037, 35.47146], [-80.67057, 35.47234], [-80.67256, 35.47644], [-80.67285, 35.47734], [-80.67373, 35.48099], [-80.67382, 35.48148], [-80.67384, 35.48234], [-80.67375, 35.48282], [-80.67347, 35.48369], [-80.67164, 35.48877], [-80.67139, 35.48993], [-80.67139, 35.48993], [-80.67561, 35.49098], [-80.67663, 35.49108], [-80.67733, 35.49105], [-80.67789, 35.49096], [-80.67789, 35.49096], [-80.67794, 35.49136], [-80.67797, 35.494], [-80.67802, 35.4946], [-80.67829, 35.49577], [-80.67858, 35.49657], [-80.67903, 35.49702], [-80.67965, 35.49748], [-80.67999, 35.49766], [-80.68022, 35.49774], [-80.68105, 35.49786], [-80.68243, 35.49797], [-80.68286, 35.49815], [-80.68315, 35.49846], [-80.6834, 35.49892], [-80.68404, 35.50083], [-80.68501, 35.50429], [-80.68501, 35.50429], [-80.69014, 35.50283], [-80.69414, 35.50191], [-80.69601, 35.50156], [-80.69669, 35.50147], [-80.69739, 35.50146], [-80.69807, 35.5016], [-80.69934, 35.50197], [-80.69995, 35.50199], [-80.70289, 35.50136], [-80.70328, 35.50121], [-80.704, 35.50081], [-80.70434, 35.50056], [-80.70454, 35.50027], [-80.70454, 35.49994], [-80.70442, 35.49917], [-80.70446, 35.49884], [-80.70537, 35.49572], [-80.70589, 35.49429], [-80.70653, 35.49275], [-80.70665, 35.49214], [-80.7068, 35.49082], [-80.7068, 35.49082], [-80.70834, 35.49153], [-80.71021, 35.49201], [-80.71062, 35.49218], [-80.71106, 35.49243], [-80.71181, 35.49295], [-80.71295, 35.49401], [-80.71562, 35.49632], [-80.716, 35.49678], [-80.71679, 35.49806], [-80.71715, 35.49891], [-80.71823, 35.50189], [-80.7189, 35.50307], [-80.71913, 35.50331], [-80.71963, 35.50357], [-80.72089, 35.50378], [-80.72089, 35.50378], [-80.72087, 35.50687], [-80.72087, 35.50687], [-80.72227, 35.50708], [-80.72293, 35.50702], [-80.72345, 35.50684], [-80.72601, 35.50576], [-80.73035, 35.50441], [-80.73084, 35.5043], [-80.73131, 35.50429], [-80.73284, 35.50443], [-80.73408, 35.50447], [-80.73505, 35.50441], [-80.73578, 35.50431], [-80.73623, 35.50409], [-80.73746, 35.50308], [-80.73779, 35.50296], [-80.7382, 35.50292], [-80.73984, 35.50309], [-80.74343, 35.50363], [-80.74658, 35.50398], [-80.7485, 35.50408], [-80.75495, 35.50421], [-80.75676, 35.50429], [-80.75921, 35.50449], [-80.76221, 35.50463], [-80.76363, 35.50491], [-80.76515, 35.50473], [-80.76515, 35.50473], [-80.76604, 35.50536], [-80.76665, 35.50564], [-80.76696, 35.50572], [-80.76784, 35.50572], [-80.76828, 35.50577], [-80.76828, 35.50577], [-80.76962, 35.49962], [-80.76987, 35.49827], [-80.76988, 35.49772], [-80.76978, 35.49696], [-80.76945, 35.49601], [-80.7671, 35.49226], [-80.76651, 35.49136], [-80.7662, 35.491], [-80.76572, 35.49067], [-80.76517, 35.49041], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.75731, 35.48316], [-80.75679, 35.48229], [-80.75605, 35.48133], [-80.75522, 35.48055], [-80.75278, 35.47857], [-80.75134, 35.47748], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75619, 35.46857], [-80.75633, 35.46824], [-80.75738, 35.46478], [-80.75779, 35.46275], [-80.75855, 35.46121], [-80.75922, 35.45922], [-80.75932, 35.45819], [-80.75939, 35.45793], [-80.75959, 35.45762], [-80.75998, 35.45718], [-80.76115, 35.45618], [-80.76173, 35.45558], [-80.76209, 35.4551], [-80.76246, 35.45445], [-80.76264, 35.45402], [-80.76308, 35.45271], [-80.76371, 35.45188], [-80.76393, 35.4515], [-80.76402, 35.45106], [-80.76409, 35.44955], [-80.76409, 35.44928], [-80.76397, 35.44856], [-80.76401, 35.44829], [-80.76418, 35.44801], [-80.76487, 35.44716], [-80.76568, 35.44642], [-80.76596, 35.44596], [-80.76602, 35.44555], [-80.76597, 35.44519], [-80.7658, 35.4448], [-80.76426, 35.44283], [-80.76401, 35.44217], [-80.76386, 35.44109], [-80.76382, 35.4401], [-80.76392, 35.43969], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76452, 35.4382], [-80.76453, 35.43788], [-80.76441, 35.4362], [-80.76434, 35.43565], [-80.76412, 35.43503], [-80.76379, 35.43464], [-80.76308, 35.43413], [-80.76279, 35.43377], [-80.76265, 35.43332], [-80.76266, 35.43278], [-80.76261, 35.43246], [-80.76251, 35.43225], [-80.76222, 35.43187], [-80.7615, 35.43114], [-80.7609, 35.43069], [-80.76035, 35.43043], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.75928, 35.43016], [-80.75893, 35.42995], [-80.75726, 35.42794], [-80.75352, 35.42159], [-80.75314, 35.42107], [-80.75277, 35.42072], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74601, 35.41862], [-80.74558, 35.41847], [-80.74309, 35.41645], [-80.74092, 35.4145], [-80.73984, 35.41359], [-80.73526, 35.41053], [-80.73379, 35.40906], [-80.73343, 35.40876], [-80.73307, 35.40855], [-80.73263, 35.40842], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72969, 35.40648], [-80.72956, 35.40612], [-80.72945, 35.4055], [-80.72912, 35.40425], [-80.72908, 35.40393], [-80.72912, 35.40332], [-80.72923, 35.40296], [-80.72939, 35.40268], [-80.72958, 35.40247]]}, "date": "2011-12-08", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.61108, 35.51312], [-80.61268, 35.51252], [-80.61346, 35.51237], [-80.61346, 35.51237], [-80.61369, 35.51213], [-80.61746, 35.50617], [-80.62303, 35.49761], [-80.62303, 35.49761], [-80.62702, 35.49945], [-80.62751, 35.49996], [-80.62757, 35.5001], [-80.62757, 35.5001], [-80.63027, 35.49903], [-80.63027, 35.49903], [-80.63089, 35.50023], [-80.63105, 35.50089], [-80.63105, 35.50089], [-80.63139, 35.50088], [-80.63161, 35.50093], [-80.6402, 35.50549], [-80.64192, 35.50624], [-80.64902, 35.50895], [-80.64982, 35.50932], [-80.65084, 35.50996], [-80.65399, 35.51179], [-80.65515, 35.51209], [-80.65608, 35.51224], [-80.65654, 35.51246], [-80.65852, 35.51365], [-80.65893, 35.51384], [-80.65967, 35.51407], [-80.66081, 35.51434], [-80.67024, 35.51649], [-80.67024, 35.51649], [-80.67001, 35.51785], [-80.66988, 35.519], [-80.66981, 35.52147], [-80.66919, 35.52677], [-80.66907, 35.52717], [-80.66788, 35.52942], [-80.66628, 35.53213], [-80.66571, 35.53426], [-80.66571, 35.53426], [-80.67067, 35.53431], [-80.67216, 35.53437], [-80.6729, 35.53448], [-80.68049, 35.53753], [-80.68148, 35.53787], [-80.68192, 35.53798], [-80.6827, 35.53807], [-80.6827, 35.53807], [-80.68488, 35.53821], [-80.68685, 35.53827], [-80.68902, 35.53821], [-80.68945, 35.53824], [-80.68982, 35.53832], [-80.69236, 35.53933], [-80.69276, 35.53959], [-80.6932, 35.54001], [-80.69368, 35.54081], [-80.69418, 35.5412], [-80.69875, 35.54386], [-80.69914, 35.54417], [-80.70018, 35.54531], [-80.70117, 35.5466], [-80.70117, 35.5466], [-80.70114, 35.54699], [-80.70092, 35.5477], [-80.69996, 35.54823], [-80.69926, 35.54877], [-80.69885, 35.54916], [-80.69842, 35.54969], [-80.69796, 35.55039], [-80.69719, 35.55122], [-80.69624, 35.55216], [-80.69406, 35.55412], [-80.69357, 35.55478], [-80.6932, 35.55545], [-80.69223, 35.55785], [-80.69154, 35.55874], [-80.69083, 35.55942], [-80.69083, 35.55942], [-80.69149, 35.55965], [-80.69211, 35.55971], [-80.69654, 35.55974], [-80.69654, 35.55974], [-80.69659, 35.55987], [-80.69658, 35.56108], [-80.69729, 35.563], [-80.69746, 35.56329], [-80.69858, 35.56424], [-80.69858, 35.56424], [-80.69746, 35.56329], [-80.69729, 35.563], [-80.69658, 35.56108], [-80.69659, 35.55987], [-80.69654, 35.55974], [-80.69654, 35.55974], [-80.69211, 35.55971], [-80.69149, 35.55965], [-80.69083, 35.55942], [-80.69083, 35.55942], [-80.68902, 35.56071], [-80.68776, 35.56187], [-80.68718, 35.56256], [-80.68623, 35.56421], [-80.68359, 35.56943], [-80.68304, 35.57015], [-80.68093, 35.57231], [-80.68076, 35.57254], [-80.68076, 35.57254], [-80.68157, 35.57236], [-80.68263, 35.57228], [-80.68429, 35.57248], [-80.68559, 35.57281], [-80.68629, 35.57312], [-80.68716, 35.5737], [-80.69086, 35.5764], [-80.69162, 35.57676], [-80.69229, 35.57702], [-80.69269, 35.57712], [-80.69352, 35.57725], [-80.69883, 35.57774], [-80.70109, 35.57751], [-80.70685, 35.57629], [-80.70893, 35.57589], [-80.70966, 35.57591], [-80.71041, 35.57615], [-80.7108, 35.57635], [-80.71704, 35.58018], [-80.71936, 35.58104], [-80.7222, 35.58199], [-80.72284, 35.58211], [-80.72317, 35.58213], [-80.72421, 35.58209], [-80.72734, 35.58147], [-80.72897, 35.58125], [-80.73068, 35.58124], [-80.73347, 35.58154], [-80.73347, 35.58154], [-80.7321, 35.56811], [-80.73211, 35.56757], [-80.73217, 35.56724], [-80.73231, 35.56685], [-80.73272, 35.5663], [-80.73321, 35.5659], [-80.73563, 35.56432], [-80.73767, 35.56307], [-80.73805, 35.56272], [-80.73833, 35.56233], [-80.73849, 35.56199], [-80.73879, 35.5608], [-80.739, 35.56038], [-80.74162, 35.55684], [-80.74189, 35.55636], [-80.74205, 35.55566], [-80.7422, 35.55364], [-80.7422, 35.55364], [-80.7423, 35.55285], [-80.74241, 35.55254], [-80.74282, 35.55188], [-80.74379, 35.55069], [-80.74407, 35.55018], [-80.74421, 35.5497], [-80.7442, 35.54932], [-80.74394, 35.54779], [-80.74379, 35.54489], [-80.74379, 35.54489], [-80.74765, 35.54721], [-80.74813, 35.54739], [-80.75046, 35.54805], [-80.75083, 35.5481], [-80.7511, 35.54808], [-80.75297, 35.54777], [-80.75395, 35.5477], [-80.75462, 35.54776], [-80.75537, 35.54796], [-80.75608, 35.54826], [-80.76115, 35.55096], [-80.76207, 35.55153], [-80.76227, 35.55173], [-80.763, 35.5529], [-80.7634, 35.55342], [-80.7657, 35.55535], [-80.76684, 35.55664], [-80.76711, 35.55685], [-80.76758, 35.55701], [-80.77214, 35.55789], [-80.77266, 35.55811], [-80.77299, 35.55836], [-80.77434, 35.55981], [-80.77467, 35.56031], [-80.77478, 35.56066], [-80.77489, 35.56146], [-80.775, 35.56655], [-80.77507, 35.56701], [-80.77526, 35.56763], [-80.77551, 35.5681], [-80.77714, 35.57029], [-80.77769, 35.57117], [-80.77889, 35.57347], [-80.78043, 35.57652], [-80.78129, 35.57849], [-80.78193, 35.57963], [-80.78329, 35.58226], [-80.78368, 35.58322], [-80.7842, 35.58503], [-80.78454, 35.58546], [-80.7848, 35.58566], [-80.78548, 35.58599], [-80.7867, 35.58643], [-80.78726, 35.58671], [-80.78935, 35.58824], [-80.78982, 35.58849], [-80.79032, 35.58868], [-80.79085, 35.58897], [-80.79273, 35.59025], [-80.7928, 35.59034], [-80.7928, 35.59034], [-80.79491, 35.58954], [-80.7992, 35.58731], [-80.7992, 35.58731], [-80.79851, 35.58604], [-80.79851, 35.58604], [-80.79931, 35.58581], [-80.80023, 35.58562], [-80.80023, 35.58562], [-80.79939, 35.58256], [-80.79939, 35.58256], [-80.79898, 35.58252], [-80.79878, 35.58243], [-80.79655, 35.58109], [-80.79535, 35.58006], [-80.79389, 35.57864], [-80.79309, 35.5778], [-80.79237, 35.57672], [-80.79197, 35.57572], [-80.79177, 35.57497], [-80.79168, 35.57388], [-80.79175, 35.57296], [-80.79229, 35.57045], [-80.79233, 35.56955], [-80.79219, 35.56862], [-80.79103, 35.56554], [-80.79072, 35.5649], [-80.78834, 35.56102], [-80.78695, 35.55953], [-80.78388, 35.55656], [-80.7829, 35.55568], [-80.78226, 35.5552], [-80.78173, 35.55487], [-80.78088, 35.55443], [-80.77788, 35.55322], [-80.77645, 35.55256], [-80.77546, 35.55188], [-80.77457, 35.55106], [-80.77382, 35.55017], [-80.76846, 35.54192], [-80.76801, 35.54077], [-80.76794, 35.54013], [-80.76796, 35.53937], [-80.76812, 35.53864], [-80.76896, 35.53639], [-80.76915, 35.53565], [-80.76925, 35.53484], [-80.76927, 35.53417], [-80.76901, 35.53136], [-80.76905, 35.53016], [-80.76913, 35.52918], [-80.77039, 35.52119], [-80.77048, 35.52044], [-80.77045, 35.51942], [-80.77045, 35.51942], [-80.7731, 35.52008], [-80.77382, 35.5203], [-80.77428, 35.52051], [-80.77786, 35.52337], [-80.7792, 35.52425], [-80.77968, 35.52442], [-80.78004, 35.52447], [-80.78034, 35.52445], [-80.78286, 35.52368], [-80.78437, 35.52366], [-80.78626, 35.52399], [-80.7882, 35.52399], [-80.78861, 35.52407], [-80.78897, 35.52425], [-80.79036, 35.52578], [-80.79076, 35.5261], [-80.79136, 35.5264], [-80.79164, 35.52649], [-80.79197, 35.52656], [-80.79268, 35.52662], [-80.79566, 35.52631], [-80.79727, 35.52634], [-80.79746, 35.52639], [-80.79746, 35.52639], [-80.79915, 35.52421], [-80.79942, 35.5237], [-80.79945, 35.52308], [-80.7993, 35.52268], [-80.79874, 35.52158], [-80.79863, 35.5211], [-80.79866, 35.52057], [-80.79866, 35.52057], [-80.80111, 35.52034], [-80.80711, 35.52002], [-80.8078, 35.51977], [-80.80894, 35.51884], [-80.80924, 35.51866], [-80.80949, 35.51854], [-80.80985, 35.51846], [-80.81037, 35.51844], [-80.81077, 35.51851], [-80.814, 35.51941], [-80.8143, 35.51948], [-80.81478, 35.51951], [-80.81986, 35.51813], [-80.82627, 35.51662], [-80.82694, 35.51659], [-80.82967, 35.51714], [-80.83677, 35.51741], [-80.83728, 35.5173], [-80.83762, 35.51709], [-80.83843, 35.51595], [-80.83883, 35.51579], [-80.83953, 35.51566], [-80.83953, 35.51566], [-80.8386, 35.51319], [-80.83836, 35.51223], [-80.83836, 35.51177], [-80.83844, 35.51132], [-80.83878, 35.5105], [-80.83938, 35.50969], [-80.8399, 35.50919], [-80.84038, 35.50888], [-80.84277, 35.50767], [-80.84334, 35.50722], [-80.84585, 35.50488], [-80.84621, 35.50434], [-80.84677, 35.50319], [-80.84848, 35.49926], [-80.84848, 35.49926], [-80.84537, 35.49862], [-80.84505, 35.49851], [-80.84426, 35.498], [-80.84174, 35.49611], [-80.84151, 35.49599], [-80.83693, 35.49456], [-80.83665, 35.49444], [-80.82061, 35.48452], [-80.81997, 35.48405], [-80.81997, 35.48405], [-80.81992, 35.4839], [-80.82006, 35.48347], [-80.81999, 35.47998], [-80.81993, 35.47907], [-80.81968, 35.47795], [-80.81916, 35.47674], [-80.8167, 35.47246], [-80.81639, 35.4716], [-80.81604, 35.47019], [-80.81576, 35.46964], [-80.81506, 35.46871], [-80.81487, 35.46838], [-80.81437, 35.46702], [-80.81418, 35.46665], [-80.81418, 35.46665], [-80.81522, 35.46547], [-80.81566, 35.4651], [-80.81613, 35.46482], [-80.81719, 35.46437], [-80.81764, 35.46405], [-80.81791, 35.46372], [-80.81807, 35.46337], [-80.81849, 35.46206], [-80.81887, 35.46152], [-80.81938, 35.46116], [-80.82021, 35.46069], [-80.82068, 35.46043], [-80.82105, 35.4603], [-80.82105, 35.4603], [-80.82082, 35.4592], [-80.8208, 35.4589], [-80.82114, 35.45733], [-80.82114, 35.45733], [-80.82191, 35.45736], [-80.82235, 35.45729], [-80.82292, 35.4571], [-80.82346, 35.45677], [-80.8248, 35.45557], [-80.82569, 35.45508], [-80.82569, 35.45508], [-80.82519, 35.45428], [-80.82478, 35.45344], [-80.82468, 35.4531], [-80.82448, 35.45284], [-80.82427, 35.45275], [-80.82243, 35.45225], [-80.82106, 35.45175], [-80.82032, 35.45139], [-80.81947, 35.45075], [-80.81947, 35.45075], [-80.80954, 35.45441], [-80.80954, 35.45441], [-80.80916, 35.4537], [-80.80885, 35.45328], [-80.80874, 35.45302], [-80.80875, 35.45268], [-80.80903, 35.45212], [-80.8091, 35.4517], [-80.80901, 35.45134], [-80.80835, 35.44964], [-80.8083, 35.44934], [-80.80843, 35.44883], [-80.8092, 35.44677], [-80.80935, 35.44614], [-80.80933, 35.44579], [-80.80882, 35.4434], [-80.80893, 35.44234], [-80.80915, 35.44185], [-80.80997, 35.44059], [-80.81098, 35.43885], [-80.81108, 35.43807], [-80.81127, 35.43767], [-80.81266, 35.43567], [-80.81266, 35.43567], [-80.81239, 35.43564], [-80.80952, 35.43566], [-80.80873, 35.43561], [-80.80834, 35.43552], [-80.80809, 35.43541], [-80.80764, 35.43509], [-80.80696, 35.43446], [-80.8058, 35.43394], [-80.80532, 35.43386], [-80.80441, 35.43388], [-80.80358, 35.43395], [-80.80358, 35.43395], [-80.80308, 35.43501], [-80.80302, 35.43527], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79201, 35.42529], [-80.79105, 35.42488], [-80.78822, 35.42335], [-80.7879, 35.42324], [-80.7875, 35.42319], [-80.78718, 35.4232], [-80.78176, 35.42352], [-80.78116, 35.42347], [-80.77896, 35.42292], [-80.77821, 35.42269], [-80.77798, 35.4225], [-80.77754, 35.4219], [-80.77713, 35.42156], [-80.77666, 35.42129], [-80.77589, 35.42095], [-80.77551, 35.42084], [-80.77484, 35.42075], [-80.77335, 35.42061], [-80.77282, 35.42064], [-80.77201, 35.42084], [-80.76792, 35.42236], [-80.76747, 35.4226], [-80.76462, 35.42464], [-80.7644, 35.42474], [-80.764, 35.42478], [-80.7631, 35.42467], [-80.76016, 35.42421], [-80.75971, 35.42409], [-80.75839, 35.42362], [-80.75811, 35.42354], [-80.7578, 35.42352], [-80.75713, 35.42358], [-80.75628, 35.42376], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.7534, 35.42141], [-80.75294, 35.42086], [-80.75256, 35.42057], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74601, 35.41862], [-80.74558, 35.41847], [-80.74309, 35.41645], [-80.74092, 35.4145], [-80.73984, 35.41359], [-80.73526, 35.41053], [-80.73379, 35.40906], [-80.73343, 35.40876], [-80.73307, 35.40855], [-80.73263, 35.40842], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.72976, 35.40661], [-80.72956, 35.40612], [-80.72908, 35.40393], [-80.72912, 35.40332], [-80.72923, 35.40296], [-80.72939, 35.40268]]}, "date": "2011-12-10", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76692, 35.48734], [-80.77014, 35.48202], [-80.77029, 35.48141], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77129, 35.47627], [-80.77338, 35.47499], [-80.77385, 35.47479], [-80.77466, 35.47456], [-80.77496, 35.47451], [-80.77555, 35.47452], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78257, 35.47469], [-80.78695, 35.47255], [-80.78738, 35.47238], [-80.78884, 35.47203], [-80.78955, 35.47199], [-80.79018, 35.47206], [-80.79672, 35.47415], [-80.79748, 35.47426], [-80.7998, 35.47442], [-80.8005, 35.47461], [-80.80099, 35.47483], [-80.80147, 35.47516], [-80.80192, 35.47563], [-80.80515, 35.48001], [-80.80552, 35.48044], [-80.80593, 35.48074], [-80.80689, 35.48129], [-80.80988, 35.48296], [-80.81042, 35.48322], [-80.81114, 35.48342], [-80.81157, 35.48346], [-80.81796, 35.48335], [-80.81835, 35.48338], [-80.81883, 35.48349], [-80.81934, 35.48377], [-80.8196, 35.48397], [-80.8196, 35.48397], [-80.81962, 35.48407], [-80.81972, 35.48414], [-80.81984, 35.48416], [-80.81994, 35.4841], [-80.81997, 35.48401], [-80.81992, 35.4839], [-80.82006, 35.48347], [-80.82004, 35.48142], [-80.81995, 35.47924], [-80.81968, 35.47795], [-80.81916, 35.47674], [-80.8167, 35.47246], [-80.81639, 35.4716], [-80.81604, 35.47019], [-80.81576, 35.46964], [-80.81506, 35.46871], [-80.81487, 35.46838], [-80.81437, 35.46702], [-80.81418, 35.46665], [-80.81418, 35.46665], [-80.81522, 35.46547], [-80.81566, 35.4651], [-80.81613, 35.46482], [-80.81719, 35.46437], [-80.81764, 35.46405], [-80.81791, 35.46372], [-80.81807, 35.46337], [-80.81849, 35.46206], [-80.81887, 35.46152], [-80.81938, 35.46116], [-80.82021, 35.46069], [-80.82068, 35.46043], [-80.82105, 35.4603], [-80.82105, 35.4603], [-80.82082, 35.4592], [-80.8208, 35.4589], [-80.82114, 35.45733], [-80.82114, 35.45733], [-80.82191, 35.45736], [-80.82235, 35.45729], [-80.82292, 35.4571], [-80.82346, 35.45677], [-80.8248, 35.45557], [-80.82569, 35.45508], [-80.82569, 35.45508], [-80.82519, 35.45428], [-80.82478, 35.45344], [-80.82468, 35.4531], [-80.82448, 35.45284], [-80.82427, 35.45275], [-80.82243, 35.45225], [-80.82106, 35.45175], [-80.82032, 35.45139], [-80.81947, 35.45075], [-80.81947, 35.45075], [-80.80954, 35.45441], [-80.80954, 35.45441], [-80.80916, 35.4537], [-80.80885, 35.45328], [-80.80874, 35.45302], [-80.80875, 35.45268], [-80.80903, 35.45212], [-80.8091, 35.4517], [-80.80901, 35.45134], [-80.80835, 35.44964], [-80.8083, 35.44934], [-80.80843, 35.44883], [-80.8092, 35.44677], [-80.80935, 35.44614], [-80.80933, 35.44579], [-80.80882, 35.4434], [-80.80893, 35.44234], [-80.80915, 35.44185], [-80.80997, 35.44059], [-80.81098, 35.43885], [-80.81108, 35.43807], [-80.81127, 35.43767], [-80.81266, 35.43567], [-80.81266, 35.43567], [-80.81239, 35.43564], [-80.80952, 35.43566], [-80.80873, 35.43561], [-80.80834, 35.43552], [-80.80809, 35.43541], [-80.80764, 35.43509], [-80.80696, 35.43446], [-80.8058, 35.43394], [-80.80532, 35.43386], [-80.80441, 35.43388], [-80.80358, 35.43395], [-80.80358, 35.43395], [-80.80308, 35.43501], [-80.80302, 35.43527], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78501, 35.37401], [-80.78501, 35.37401], [-80.78493, 35.37402], [-80.78471, 35.37393], [-80.78345, 35.37329], [-80.78327, 35.37313], [-80.78319, 35.37294], [-80.78319, 35.37294], [-80.78269, 35.37283], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76413, 35.37375], [-80.76381, 35.3737], [-80.76228, 35.37364], [-80.76166, 35.37353], [-80.76079, 35.37315], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2011-12-14", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72908, 35.40378], [-80.72912, 35.40332], [-80.72923, 35.40296], [-80.72939, 35.40268], [-80.72999, 35.40205], [-80.73019, 35.40173], [-80.7309, 35.39864], [-80.73051, 35.39643], [-80.73034, 35.39461], [-80.7302, 35.38882], [-80.72996, 35.38803], [-80.72911, 35.38634], [-80.72899, 35.38591], [-80.72904, 35.38526], [-80.7294, 35.38313], [-80.72947, 35.38294], [-80.72993, 35.38223], [-80.73056, 35.3817], [-80.73168, 35.38118], [-80.73298, 35.38066], [-80.73431, 35.38006], [-80.73496, 35.37958], [-80.73557, 35.3789], [-80.73557, 35.3789], [-80.73695, 35.37964], [-80.73754, 35.37989], [-80.73972, 35.3801], [-80.73972, 35.3801], [-80.7397, 35.37996], [-80.74169, 35.37404], [-80.74194, 35.37342], [-80.74209, 35.37318], [-80.74263, 35.37261], [-80.7431, 35.3723], [-80.74372, 35.37205], [-80.74519, 35.37161], [-80.74567, 35.37137], [-80.74668, 35.37067], [-80.74705, 35.37032], [-80.74734, 35.36994], [-80.74752, 35.36956], [-80.74768, 35.36903], [-80.74807, 35.36734], [-80.74841, 35.36441], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74844, 35.36387], [-80.74846, 35.36343], [-80.74872, 35.36212], [-80.74897, 35.36103], [-80.74949, 35.35954], [-80.74949, 35.35954], [-80.75231, 35.35917], [-80.75292, 35.35903], [-80.75334, 35.35879], [-80.75541, 35.35729], [-80.75584, 35.35695], [-80.75633, 35.3564], [-80.7569, 35.35532], [-80.75901, 35.35086], [-80.75909, 35.35051], [-80.75928, 35.3473], [-80.75946, 35.3467], [-80.7596, 35.34645], [-80.75986, 35.34614], [-80.76019, 35.34586], [-80.76407, 35.34305], [-80.76729, 35.34185], [-80.7686, 35.34131], [-80.76947, 35.34083], [-80.77001, 35.34036], [-80.77001, 35.34024], [-80.77042, 35.3397], [-80.77064, 35.33925], [-80.77295, 35.33433], [-80.7731, 35.33387], [-80.77321, 35.33334], [-80.77323, 35.33275], [-80.77317, 35.33216], [-80.77303, 35.33169], [-80.77226, 35.32993], [-80.77219, 35.32946], [-80.77225, 35.32902], [-80.77248, 35.3284], [-80.77294, 35.32741], [-80.77462, 35.32233], [-80.77509, 35.32159], [-80.7757, 35.32099], [-80.7757, 35.32099], [-80.77553, 35.32084], [-80.77541, 35.32064], [-80.77534, 35.32028], [-80.776, 35.31831], [-80.77611, 35.31823], [-80.77639, 35.31746], [-80.77639, 35.31746], [-80.77678, 35.31614], [-80.77676, 35.31371], [-80.7773, 35.31246], [-80.77787, 35.31142], [-80.7781, 35.31085], [-80.77803, 35.31009], [-80.77784, 35.30969], [-80.77711, 35.30866], [-80.77636, 35.30741], [-80.7757, 35.30654], [-80.77481, 35.30577], [-80.77216, 35.30389], [-80.77216, 35.30389], [-80.7725, 35.30354], [-80.77289, 35.30323], [-80.77415, 35.30262], [-80.775, 35.30175], [-80.77529, 35.3012], [-80.77659, 35.29789], [-80.77678, 35.2976], [-80.77735, 35.29716], [-80.78005, 35.29548], [-80.78005, 35.29548], [-80.7775, 35.29406], [-80.77563, 35.2932], [-80.76702, 35.29029], [-80.76588, 35.28998], [-80.76537, 35.2899], [-80.76441, 35.2899], [-80.76072, 35.29016], [-80.76021, 35.29025], [-80.75885, 35.29062], [-80.75827, 35.29071], [-80.75796, 35.29069], [-80.75749, 35.29053], [-80.75749, 35.29053], [-80.75946, 35.28838], [-80.76047, 35.28735], [-80.76128, 35.28662], [-80.76266, 35.28559], [-80.76348, 35.28485], [-80.76369, 35.2846], [-80.76446, 35.28337], [-80.76567, 35.28067], [-80.76567, 35.28067], [-80.7655, 35.28062], [-80.7653, 35.28118], [-80.7649, 35.28198], [-80.76454, 35.28255], [-80.76387, 35.28334], [-80.76387, 35.28334], [-80.76282, 35.28296], [-80.76259, 35.2827], [-80.76259, 35.2827], [-80.76268, 35.28244], [-80.76264, 35.28197], [-80.76237, 35.28041], [-80.76225, 35.28004], [-80.76161, 35.2788], [-80.76142, 35.2786], [-80.76075, 35.27822], [-80.76013, 35.27741], [-80.76013, 35.27741], [-80.75899, 35.27799], [-80.75857, 35.2781], [-80.75824, 35.27809], [-80.75791, 35.27798], [-80.75745, 35.27762], [-80.75745, 35.27762], [-80.7554, 35.27867], [-80.75513, 35.27886], [-80.75488, 35.27914], [-80.75488, 35.27914], [-80.75343, 35.27835]]}, "date": "2011-12-15", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.68783, 35.41225], [-80.68797, 35.4127], [-80.68809, 35.41289], [-80.6884, 35.41309], [-80.6888, 35.41321], [-80.69008, 35.41336], [-80.69072, 35.41335], [-80.69231, 35.41318], [-80.69373, 35.41292], [-80.69461, 35.41272], [-80.69491, 35.41258], [-80.69518, 35.41239], [-80.69543, 35.41216], [-80.69574, 35.41172], [-80.69612, 35.41075], [-80.69639, 35.41021], [-80.69846, 35.40688], [-80.69999, 35.40409], [-80.70084, 35.40304], [-80.70107, 35.40269], [-80.70107, 35.40269], [-80.70393, 35.40368], [-80.70565, 35.40435], [-80.71314, 35.40736], [-80.71716, 35.40911], [-80.71809, 35.4094], [-80.72187, 35.4098], [-80.72254, 35.40981], [-80.72326, 35.40966], [-80.72802, 35.40826], [-80.72892, 35.40821], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72961, 35.40628], [-80.72912, 35.40425], [-80.72908, 35.40378]]}, "date": "2011-12-17", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78501, 35.37401], [-80.78501, 35.37401], [-80.78493, 35.37402], [-80.78471, 35.37393], [-80.78345, 35.37329], [-80.78327, 35.37313], [-80.78319, 35.37294], [-80.78319, 35.37294], [-80.78269, 35.37283], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76413, 35.37375], [-80.76381, 35.3737], [-80.76228, 35.37364], [-80.76166, 35.37353], [-80.76079, 35.37315], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2011-12-18", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78501, 35.37401], [-80.78501, 35.37401], [-80.78493, 35.37402], [-80.78471, 35.37393], [-80.78345, 35.37329], [-80.78327, 35.37313], [-80.78319, 35.37294], [-80.78319, 35.37294], [-80.78269, 35.37283], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77389, 35.37453], [-80.77389, 35.37453], [-80.77456, 35.3761], [-80.77563, 35.37794], [-80.77577, 35.37835], [-80.77567, 35.37886], [-80.77546, 35.37917], [-80.77464, 35.38006], [-80.77404, 35.38036], [-80.77344, 35.38045], [-80.77097, 35.38027], [-80.77062, 35.38029], [-80.77026, 35.38037], [-80.76917, 35.38089], [-80.76852, 35.38104], [-80.76801, 35.38102], [-80.76618, 35.3807], [-80.76559, 35.38058], [-80.76539, 35.3805], [-80.7643, 35.3799], [-80.76263, 35.37887], [-80.76192, 35.37851], [-80.75888, 35.37738], [-80.75844, 35.37727], [-80.75781, 35.37724], [-80.75731, 35.37728], [-80.75667, 35.37747], [-80.75602, 35.37785], [-80.75562, 35.37824], [-80.7553, 35.3788], [-80.75442, 35.38099], [-80.75442, 35.38099], [-80.75238, 35.38084], [-80.75169, 35.38072], [-80.75118, 35.38047], [-80.75038, 35.37981], [-80.7494, 35.37945], [-80.74884, 35.37936], [-80.7482, 35.37943], [-80.74531, 35.38097], [-80.74512, 35.38101], [-80.74512, 35.38101], [-80.74497, 35.38099], [-80.74487, 35.38112], [-80.74446, 35.38125], [-80.74417, 35.38128], [-80.74362, 35.38123], [-80.74006, 35.38016], [-80.7396, 35.38007], [-80.73766, 35.37992], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2011-12-19", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.76399, 35.44203], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76692, 35.48734], [-80.77014, 35.48202], [-80.77029, 35.48141], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77129, 35.47627], [-80.77338, 35.47499], [-80.77385, 35.47479], [-80.77466, 35.47456], [-80.77496, 35.47451], [-80.77555, 35.47452], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78257, 35.47469], [-80.78695, 35.47255], [-80.78738, 35.47238], [-80.78884, 35.47203], [-80.78955, 35.47199], [-80.79018, 35.47206], [-80.79672, 35.47415], [-80.79748, 35.47426], [-80.7998, 35.47442], [-80.8005, 35.47461], [-80.80099, 35.47483], [-80.80147, 35.47516], [-80.80192, 35.47563], [-80.80515, 35.48001], [-80.80552, 35.48044], [-80.80593, 35.48074], [-80.80689, 35.48129], [-80.80988, 35.48296], [-80.81042, 35.48322], [-80.81114, 35.48342], [-80.81157, 35.48346], [-80.81796, 35.48335], [-80.81835, 35.48338], [-80.81883, 35.48349], [-80.81934, 35.48377], [-80.8196, 35.48397], [-80.8196, 35.48397], [-80.81962, 35.48407], [-80.81972, 35.48414], [-80.81984, 35.48416], [-80.81994, 35.4841], [-80.81997, 35.48401], [-80.81992, 35.4839], [-80.82006, 35.48347], [-80.82004, 35.48142], [-80.81995, 35.47924], [-80.81968, 35.47795], [-80.81916, 35.47674], [-80.8167, 35.47246], [-80.81639, 35.4716], [-80.81604, 35.47019], [-80.81576, 35.46964], [-80.81506, 35.46871], [-80.81487, 35.46838], [-80.81437, 35.46702], [-80.81418, 35.46665], [-80.81418, 35.46665], [-80.81522, 35.46547], [-80.81566, 35.4651], [-80.81613, 35.46482], [-80.81719, 35.46437], [-80.81764, 35.46405], [-80.81791, 35.46372], [-80.81807, 35.46337], [-80.81849, 35.46206], [-80.81887, 35.46152], [-80.81938, 35.46116], [-80.82021, 35.46069], [-80.82068, 35.46043], [-80.82105, 35.4603], [-80.82105, 35.4603], [-80.82082, 35.4592], [-80.8208, 35.4589], [-80.82114, 35.45733], [-80.82114, 35.45733], [-80.82191, 35.45736], [-80.82235, 35.45729], [-80.82292, 35.4571], [-80.82346, 35.45677], [-80.8248, 35.45557], [-80.82569, 35.45508], [-80.82569, 35.45508], [-80.82519, 35.45428], [-80.82478, 35.45344], [-80.82468, 35.4531], [-80.82448, 35.45284], [-80.82427, 35.45275], [-80.82243, 35.45225], [-80.82106, 35.45175], [-80.82032, 35.45139], [-80.81947, 35.45075], [-80.81947, 35.45075], [-80.80954, 35.45441], [-80.80954, 35.45441], [-80.80916, 35.4537], [-80.80885, 35.45328], [-80.80874, 35.45302], [-80.80875, 35.45268], [-80.80903, 35.45212], [-80.8091, 35.4517], [-80.80901, 35.45134], [-80.80835, 35.44964], [-80.8083, 35.44934], [-80.80843, 35.44883], [-80.8092, 35.44677], [-80.80935, 35.44614], [-80.80933, 35.44579], [-80.80882, 35.4434], [-80.80893, 35.44234], [-80.80915, 35.44185], [-80.80997, 35.44059], [-80.81098, 35.43885], [-80.81108, 35.43807], [-80.81127, 35.43767], [-80.81266, 35.43567], [-80.81266, 35.43567], [-80.81239, 35.43564], [-80.80952, 35.43566], [-80.80873, 35.43561], [-80.80834, 35.43552], [-80.80809, 35.43541], [-80.80764, 35.43509], [-80.80696, 35.43446], [-80.8058, 35.43394], [-80.80532, 35.43386], [-80.80441, 35.43388], [-80.80358, 35.43395], [-80.80358, 35.43395], [-80.80308, 35.43501], [-80.80302, 35.43527], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79201, 35.42529], [-80.79105, 35.42488], [-80.78822, 35.42335], [-80.7879, 35.42324], [-80.7875, 35.42319], [-80.78718, 35.4232], [-80.78176, 35.42352], [-80.78116, 35.42347], [-80.77896, 35.42292], [-80.77821, 35.42269], [-80.77798, 35.4225], [-80.77754, 35.4219], [-80.77713, 35.42156], [-80.77666, 35.42129], [-80.77589, 35.42095], [-80.77551, 35.42084], [-80.77484, 35.42075], [-80.77335, 35.42061], [-80.77282, 35.42064], [-80.77201, 35.42084], [-80.76792, 35.42236], [-80.76747, 35.4226], [-80.76462, 35.42464], [-80.7644, 35.42474], [-80.764, 35.42478], [-80.7631, 35.42467], [-80.76016, 35.42421], [-80.75971, 35.42409], [-80.75839, 35.42362], [-80.75811, 35.42354], [-80.7578, 35.42352], [-80.75713, 35.42358], [-80.75628, 35.42376], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.7571, 35.42771], [-80.75756, 35.42833], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76381, 35.44052], [-80.76394, 35.44169]]}, "date": "2012-01-02", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78977, 35.38192], [-80.78905, 35.38232], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78586, 35.38513], [-80.78416, 35.3867], [-80.77943, 35.39042], [-80.7786, 35.39092], [-80.77556, 35.39213], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.77113, 35.38892], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76102, 35.38827], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75884, 35.38856], [-80.75825, 35.38843], [-80.75758, 35.38812], [-80.75704, 35.38776], [-80.75671, 35.38742], [-80.7565, 35.3871], [-80.75585, 35.38557], [-80.75556, 35.38503], [-80.75508, 35.38432], [-80.75433, 35.38348], [-80.75408, 35.38313], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75457, 35.38102], [-80.75457, 35.38102], [-80.75208, 35.38081], [-80.75169, 35.38072], [-80.75118, 35.38047], [-80.75038, 35.37981], [-80.7494, 35.37945], [-80.74884, 35.37936], [-80.7482, 35.37943], [-80.74531, 35.38097], [-80.74512, 35.38101], [-80.74512, 35.38101], [-80.74497, 35.38099], [-80.74487, 35.38112], [-80.74446, 35.38125], [-80.74417, 35.38128], [-80.74362, 35.38123], [-80.74006, 35.38016], [-80.7396, 35.38007], [-80.73766, 35.37992], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-01-07", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72908, 35.40378], [-80.72912, 35.40425], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74541, 35.41836], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.74502, 35.41897], [-80.74457, 35.41942], [-80.74438, 35.41972], [-80.74357, 35.42151], [-80.74245, 35.42302], [-80.74173, 35.42365], [-80.73997, 35.42449], [-80.73972, 35.4247], [-80.73932, 35.42516], [-80.73816, 35.42668], [-80.73642, 35.42943], [-80.73609, 35.42975], [-80.73579, 35.4299], [-80.7314, 35.43146], [-80.72992, 35.43235], [-80.7293, 35.43265], [-80.72694, 35.43335], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.72709, 35.43871], [-80.72779, 35.44124], [-80.72829, 35.44222], [-80.72956, 35.44443], [-80.72981, 35.44498], [-80.73005, 35.44569], [-80.73116, 35.45106], [-80.73178, 35.45356], [-80.73204, 35.455], [-80.73232, 35.4599], [-80.73239, 35.46039], [-80.73239, 35.46039], [-80.73192, 35.46179], [-80.7301, 35.46601], [-80.73, 35.46628], [-80.72993, 35.46673], [-80.73003, 35.4684], [-80.73073, 35.47428], [-80.73074, 35.47717], [-80.73053, 35.47774], [-80.73002, 35.47847], [-80.72737, 35.48121], [-80.72737, 35.48121], [-80.72712, 35.48104], [-80.72674, 35.48088], [-80.72635, 35.48077], [-80.72578, 35.4807], [-80.72384, 35.48068], [-80.7201, 35.48076], [-80.71857, 35.48073], [-80.71793, 35.48077], [-80.71668, 35.48107], [-80.71242, 35.48242], [-80.70905, 35.48315], [-80.70905, 35.48315], [-80.70683, 35.47997], [-80.70574, 35.47831], [-80.70514, 35.47725], [-80.70448, 35.47567], [-80.70404, 35.47521], [-80.70366, 35.475], [-80.70366, 35.475], [-80.7035, 35.47496], [-80.70286, 35.47496], [-80.70236, 35.47499], [-80.70185, 35.47508], [-80.70158, 35.47516], [-80.70129, 35.47531], [-80.70106, 35.4756], [-80.70101, 35.47576], [-80.70101, 35.47576], [-80.70046, 35.47552], [-80.70019, 35.47535], [-80.69921, 35.47451], [-80.69874, 35.47418], [-80.69737, 35.47346], [-80.6965, 35.47309], [-80.69603, 35.47301], [-80.69548, 35.47301], [-80.69373, 35.47333], [-80.69296, 35.47338], [-80.69193, 35.47329], [-80.6916, 35.47321], [-80.69127, 35.47308], [-80.69058, 35.47271], [-80.69058, 35.47271], [-80.69004, 35.47223], [-80.68982, 35.47171], [-80.68898, 35.46746], [-80.68882, 35.46694], [-80.68789, 35.46527], [-80.68688, 35.46385], [-80.68688, 35.46385], [-80.68701, 35.46377], [-80.68717, 35.46356], [-80.68777, 35.46248], [-80.68787, 35.4622], [-80.68787, 35.46183], [-80.68715, 35.4592], [-80.68647, 35.45513], [-80.68638, 35.45485], [-80.68594, 35.454], [-80.68413, 35.45078], [-80.68339, 35.44929], [-80.68266, 35.44541], [-80.68273, 35.44445], [-80.68287, 35.44395], [-80.6836, 35.44175], [-80.68395, 35.441], [-80.68395, 35.441], [-80.68299, 35.44035], [-80.68217, 35.43997], [-80.68145, 35.43974], [-80.68004, 35.4394], [-80.68004, 35.4394], [-80.68025, 35.43848], [-80.68028, 35.43818], [-80.68024, 35.43811], [-80.68047, 35.43695], [-80.68052, 35.43498], [-80.68048, 35.43428], [-80.68034, 35.43314], [-80.67865, 35.42572], [-80.67857, 35.4255], [-80.67736, 35.42331], [-80.67736, 35.42318], [-80.67555, 35.42096], [-80.67481, 35.42028], [-80.6742, 35.41983], [-80.67388, 35.41964], [-80.67375, 35.41959], [-80.67364, 35.41961], [-80.67303, 35.41927], [-80.67303, 35.41927], [-80.67148, 35.41836], [-80.67027, 35.41757], [-80.66937, 35.41675], [-80.6681, 35.41544], [-80.66777, 35.41504], [-80.66725, 35.41419], [-80.66726, 35.41411], [-80.66689, 35.41345], [-80.66624, 35.41238], [-80.66416, 35.40868], [-80.66198, 35.40464], [-80.66112, 35.40325], [-80.66048, 35.40198], [-80.65988, 35.40052], [-80.65931, 35.39875], [-80.65918, 35.39807], [-80.65918, 35.39807], [-80.66011, 35.3979], [-80.66183, 35.39739], [-80.66299, 35.39702], [-80.66346, 35.3968], [-80.66616, 35.39495], [-80.66651, 35.39475], [-80.66732, 35.39439], [-80.66854, 35.39393], [-80.66893, 35.39372], [-80.67052, 35.39243], [-80.67219, 35.39122], [-80.6738, 35.3903], [-80.67423, 35.39021], [-80.67461, 35.39021], [-80.67634, 35.39059], [-80.67986, 35.39151], [-80.68035, 35.39153], [-80.68057, 35.39145], [-80.68116, 35.39096], [-80.68414, 35.38811], [-80.68504, 35.38731], [-80.68561, 35.38696], [-80.6862, 35.38672], [-80.68762, 35.38644], [-80.68818, 35.38625], [-80.68867, 35.386], [-80.68913, 35.38564], [-80.68945, 35.38529], [-80.68984, 35.38474], [-80.69156, 35.38192], [-80.69232, 35.38117], [-80.6929, 35.38082], [-80.69384, 35.3805], [-80.69587, 35.3802], [-80.69673, 35.38001], [-80.69713, 35.37988], [-80.69766, 35.37962], [-80.69815, 35.37926], [-80.69815, 35.37926], [-80.69841, 35.37907], [-80.69874, 35.37868], [-80.69991, 35.37686], [-80.70007, 35.37663], [-80.70015, 35.37659], [-80.7011, 35.37515], [-80.70169, 35.37454], [-80.70232, 35.37413], [-80.70299, 35.37385], [-80.70433, 35.37354], [-80.70527, 35.37327], [-80.70591, 35.37293], [-80.70644, 35.37252], [-80.70862, 35.37002], [-80.70878, 35.36978], [-80.70893, 35.3695], [-80.7096, 35.36728], [-80.70989, 35.36686], [-80.7102, 35.36653], [-80.7102, 35.36653], [-80.71193, 35.36759], [-80.71506, 35.36965], [-80.71506, 35.36965], [-80.71585, 35.37008], [-80.71704, 35.37092], [-80.71823, 35.37148], [-80.71987, 35.37192], [-80.72216, 35.37266], [-80.72473, 35.37379], [-80.72529, 35.374], [-80.72614, 35.37424], [-80.72678, 35.37436], [-80.72944, 35.37457], [-80.73088, 35.37497], [-80.73088, 35.37497], [-80.73153, 35.37524], [-80.73209, 35.37567], [-80.73233, 35.37597], [-80.73308, 35.37729], [-80.73355, 35.37774], [-80.73557, 35.3789], [-80.73557, 35.3789], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.7294, 35.38313], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73034, 35.39461], [-80.73051, 35.39643], [-80.7309, 35.39864], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72913, 35.4033]]}, "date": "2012-01-08", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.70992, 35.41192], [-80.70977, 35.41247], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70926, 35.42133], [-80.70952, 35.42201], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71209, 35.42663], [-80.71266, 35.42686], [-80.71387, 35.4272], [-80.71456, 35.42759], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72299, 35.43049], [-80.72349, 35.4309], [-80.7238, 35.43138], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.72694, 35.43335], [-80.7293, 35.43265], [-80.72992, 35.43235], [-80.7314, 35.43146], [-80.73579, 35.4299], [-80.73609, 35.42975], [-80.73642, 35.42943], [-80.73816, 35.42668], [-80.73932, 35.42516], [-80.73972, 35.4247], [-80.73997, 35.42449], [-80.74173, 35.42365], [-80.74245, 35.42302], [-80.74357, 35.42151], [-80.74438, 35.41972], [-80.74457, 35.41942], [-80.74502, 35.41897], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78521, 35.37528], [-80.7847, 35.37211], [-80.78473, 35.37142], [-80.7849, 35.37091], [-80.78578, 35.36954], [-80.78578, 35.36954], [-80.78456, 35.36876], [-80.78279, 35.36772], [-80.78234, 35.36764], [-80.7814, 35.36765], [-80.78109, 35.36755], [-80.78092, 35.36737], [-80.78059, 35.36674], [-80.7802, 35.36629], [-80.78004, 35.3662], [-80.7797, 35.36612], [-80.77551, 35.36575], [-80.77443, 35.36548], [-80.77298, 35.36531], [-80.77247, 35.36538], [-80.76979, 35.36604], [-80.76935, 35.36623], [-80.76785, 35.36709], [-80.76744, 35.36714], [-80.76591, 35.36699], [-80.76548, 35.36689], [-80.76493, 35.36658], [-80.76309, 35.36576], [-80.76279, 35.36555], [-80.76265, 35.36538], [-80.76204, 35.36368], [-80.7617, 35.36315], [-80.76137, 35.3628], [-80.76105, 35.36255], [-80.76022, 35.36206], [-80.75895, 35.361], [-80.75838, 35.36025], [-80.75806, 35.35883], [-80.7575, 35.35807], [-80.75734, 35.3577], [-80.75725, 35.35719], [-80.7572, 35.35573], [-80.75711, 35.35552], [-80.7569, 35.35532], [-80.7569, 35.35532], [-80.75642, 35.35627], [-80.75584, 35.35695], [-80.75314, 35.35892], [-80.75269, 35.35911], [-80.74949, 35.35954], [-80.74949, 35.35954], [-80.74897, 35.36103], [-80.74872, 35.36212], [-80.74846, 35.36343], [-80.74844, 35.36387], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-01-18", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74541, 35.41836], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.74711, 35.41763], [-80.75152, 35.41452], [-80.75224, 35.41397], [-80.75258, 35.41364], [-80.75295, 35.41311], [-80.75351, 35.41216], [-80.75563, 35.40678], [-80.75634, 35.40556], [-80.75714, 35.40466], [-80.75906, 35.40316], [-80.75998, 35.40249], [-80.76058, 35.40211], [-80.76155, 35.40157], [-80.76386, 35.40047], [-80.76612, 35.39919], [-80.76612, 35.39919], [-80.76939, 35.39733], [-80.77033, 35.39651], [-80.7737, 35.39328], [-80.7745, 35.39267], [-80.77556, 35.39213], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.77113, 35.38892], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76102, 35.38827], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75884, 35.38856], [-80.75825, 35.38843], [-80.75789, 35.38828], [-80.75704, 35.38776], [-80.75671, 35.38742], [-80.7563, 35.38668], [-80.75565, 35.38518], [-80.75508, 35.38432], [-80.75413, 35.38323], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75553, 35.37862], [-80.75573, 35.37832], [-80.75611, 35.37795], [-80.75674, 35.37759], [-80.75735, 35.3774], [-80.75805, 35.37736], [-80.75862, 35.37743], [-80.76162, 35.37853], [-80.76221, 35.37879], [-80.76516, 35.38052], [-80.76552, 35.38068], [-80.76587, 35.38077], [-80.76803, 35.38115], [-80.7685, 35.38117], [-80.76889, 35.3811], [-80.7692, 35.38099], [-80.77031, 35.38049], [-80.77078, 35.3804], [-80.77335, 35.38058], [-80.77364, 35.38058], [-80.77418, 35.38047], [-80.77461, 35.38026], [-80.77485, 35.38007], [-80.77562, 35.37919], [-80.77579, 35.37893], [-80.77588, 35.37864], [-80.7759, 35.37835], [-80.7758, 35.37791], [-80.77493, 35.37651], [-80.77405, 35.37449], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76446, 35.37382], [-80.76381, 35.3737], [-80.76206, 35.37361], [-80.76166, 35.37353], [-80.76125, 35.37338], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-01-19", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.70992, 35.41192], [-80.70977, 35.41247], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70926, 35.42133], [-80.70952, 35.42201], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71209, 35.42663], [-80.71266, 35.42686], [-80.71387, 35.4272], [-80.71456, 35.42759], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72299, 35.43049], [-80.72349, 35.4309], [-80.7238, 35.43138], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.72694, 35.43335], [-80.7293, 35.43265], [-80.72992, 35.43235], [-80.7314, 35.43146], [-80.73579, 35.4299], [-80.73625, 35.42962], [-80.73655, 35.42924], [-80.73816, 35.42668], [-80.73895, 35.42561], [-80.73972, 35.4247], [-80.74014, 35.42439], [-80.74137, 35.42385], [-80.74173, 35.42365], [-80.74224, 35.42323], [-80.74273, 35.42268], [-80.74357, 35.42151], [-80.74438, 35.41972], [-80.74478, 35.41917], [-80.74548, 35.41865], [-80.74711, 35.41763], [-80.75152, 35.41452], [-80.75224, 35.41397], [-80.75258, 35.41364], [-80.75295, 35.41311], [-80.75351, 35.41216], [-80.75563, 35.40678], [-80.75634, 35.40556], [-80.75699, 35.40481], [-80.75744, 35.4044], [-80.75906, 35.40316], [-80.75998, 35.40249], [-80.76058, 35.40211], [-80.76155, 35.40157], [-80.76386, 35.40047], [-80.76612, 35.39919], [-80.76612, 35.39919], [-80.76939, 35.39733], [-80.77033, 35.39651], [-80.7737, 35.39328], [-80.7745, 35.39267], [-80.77556, 35.39213], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.77113, 35.38892], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76102, 35.38827], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75884, 35.38856], [-80.75825, 35.38843], [-80.75789, 35.38828], [-80.75704, 35.38776], [-80.75671, 35.38742], [-80.7563, 35.38668], [-80.75565, 35.38518], [-80.75508, 35.38432], [-80.75413, 35.38323], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75553, 35.37862], [-80.75573, 35.37832], [-80.75611, 35.37795], [-80.75674, 35.37759], [-80.75735, 35.3774], [-80.75805, 35.37736], [-80.75862, 35.37743], [-80.76162, 35.37853], [-80.76221, 35.37879], [-80.76516, 35.38052], [-80.76552, 35.38068], [-80.76587, 35.38077], [-80.76803, 35.38115], [-80.7685, 35.38117], [-80.76889, 35.3811], [-80.7692, 35.38099], [-80.77031, 35.38049], [-80.77078, 35.3804], [-80.77335, 35.38058], [-80.77364, 35.38058], [-80.77418, 35.38047], [-80.77461, 35.38026], [-80.77485, 35.38007], [-80.77562, 35.37919], [-80.77579, 35.37893], [-80.77588, 35.37864], [-80.7759, 35.37835], [-80.7758, 35.37791], [-80.77493, 35.37651], [-80.77405, 35.37449], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76446, 35.37382], [-80.76381, 35.3737], [-80.76206, 35.37361], [-80.76166, 35.37353], [-80.76125, 35.37338], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-02-14", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72865, 35.40114], [-80.73028, 35.40139], [-80.73028, 35.40139], [-80.73013, 35.40186], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.70992, 35.41192], [-80.70977, 35.41247], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70926, 35.42133], [-80.70952, 35.42201], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71209, 35.42663], [-80.71266, 35.42686], [-80.71387, 35.4272], [-80.71456, 35.42759], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72299, 35.43049], [-80.72349, 35.4309], [-80.7238, 35.43138], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.72694, 35.43335], [-80.7293, 35.43265], [-80.72992, 35.43235], [-80.7314, 35.43146], [-80.73579, 35.4299], [-80.73609, 35.42975], [-80.73642, 35.42943], [-80.73816, 35.42668], [-80.73932, 35.42516], [-80.73972, 35.4247], [-80.73997, 35.42449], [-80.74173, 35.42365], [-80.74245, 35.42302], [-80.74357, 35.42151], [-80.74438, 35.41972], [-80.74457, 35.41942], [-80.74502, 35.41897], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79428, 35.42758], [-80.7996, 35.43312], [-80.80167, 35.43512], [-80.80274, 35.43638], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80302, 35.43527], [-80.80308, 35.43501], [-80.80358, 35.43395], [-80.80358, 35.43395], [-80.80441, 35.43388], [-80.80532, 35.43386], [-80.8058, 35.43394], [-80.80696, 35.43446], [-80.80764, 35.43509], [-80.80809, 35.43541], [-80.80834, 35.43552], [-80.80873, 35.43561], [-80.80952, 35.43566], [-80.81239, 35.43564], [-80.81266, 35.43567], [-80.81266, 35.43567], [-80.81127, 35.43767], [-80.81108, 35.43807], [-80.81098, 35.43885], [-80.80997, 35.44059], [-80.80915, 35.44185], [-80.80893, 35.44234], [-80.80882, 35.4434], [-80.80933, 35.44579], [-80.80935, 35.44614], [-80.8092, 35.44677], [-80.80843, 35.44883], [-80.8083, 35.44934], [-80.80835, 35.44964], [-80.80901, 35.45134], [-80.8091, 35.4517], [-80.80903, 35.45212], [-80.80875, 35.45268], [-80.80874, 35.45302], [-80.80885, 35.45328], [-80.80916, 35.4537], [-80.80954, 35.45441], [-80.80954, 35.45441], [-80.80772, 35.45507], [-80.80669, 35.45531], [-80.80605, 35.45539], [-80.80495, 35.45541], [-80.80432, 35.45535], [-80.80341, 35.45516], [-80.80252, 35.45486], [-80.80252, 35.45486], [-80.8025, 35.45534], [-80.80265, 35.45563], [-80.80657, 35.46], [-80.80844, 35.46219], [-80.80902, 35.46273], [-80.80942, 35.46303], [-80.80942, 35.46303], [-80.81063, 35.46189], [-80.811, 35.46123], [-80.81134, 35.46102], [-80.81134, 35.46102], [-80.81123, 35.46046], [-80.81135, 35.46011], [-80.81223, 35.45797], [-80.81258, 35.45755], [-80.81258, 35.45755], [-80.81242, 35.45739], [-80.81233, 35.45718], [-80.81234, 35.45693], [-80.81234, 35.45693], [-80.81366, 35.45714], [-80.8142, 35.45713], [-80.81458, 35.45705], [-80.81492, 35.45692], [-80.81603, 35.45623], [-80.81629, 35.45612], [-80.81688, 35.45599], [-80.81723, 35.45598], [-80.81792, 35.45611], [-80.82114, 35.45733], [-80.82114, 35.45733], [-80.8208, 35.4589], [-80.82082, 35.4592], [-80.82105, 35.4603], [-80.82105, 35.4603], [-80.82068, 35.46043], [-80.82021, 35.46069], [-80.81938, 35.46116], [-80.81887, 35.46152], [-80.81849, 35.46206], [-80.81807, 35.46337], [-80.81791, 35.46372], [-80.81764, 35.46405], [-80.81719, 35.46437], [-80.81613, 35.46482], [-80.81566, 35.4651], [-80.81522, 35.46547], [-80.81418, 35.46665], [-80.81418, 35.46665], [-80.81437, 35.46702], [-80.81487, 35.46838], [-80.81506, 35.46871], [-80.81576, 35.46964], [-80.81604, 35.47019], [-80.81639, 35.4716], [-80.8167, 35.47246], [-80.81916, 35.47674], [-80.81968, 35.47795], [-80.81995, 35.47924], [-80.82006, 35.48224], [-80.82005, 35.4834], [-80.81982, 35.48385], [-80.81982, 35.48385], [-80.81967, 35.48388], [-80.8196, 35.48397], [-80.81967, 35.48412], [-80.81989, 35.48414], [-80.82095, 35.48472], [-80.83665, 35.49444], [-80.83693, 35.49456], [-80.83929, 35.49529], [-80.83929, 35.49529], [-80.83579, 35.49635], [-80.83497, 35.4967], [-80.83449, 35.49699], [-80.83376, 35.49762], [-80.83275, 35.49892], [-80.83244, 35.49922], [-80.8319, 35.49951], [-80.83143, 35.49963], [-80.83063, 35.49969], [-80.82932, 35.49966], [-80.82524, 35.49937], [-80.82345, 35.49911], [-80.82134, 35.49868], [-80.8207, 35.49862], [-80.81988, 35.49867], [-80.81779, 35.49892], [-80.81707, 35.49906], [-80.81673, 35.49921], [-80.81624, 35.49952], [-80.81427, 35.50093], [-80.81407, 35.50119], [-80.81354, 35.5025], [-80.81334, 35.5028], [-80.81195, 35.50398], [-80.81154, 35.50425], [-80.81123, 35.50437], [-80.80967, 35.50476], [-80.80882, 35.50508], [-80.80849, 35.50529], [-80.80778, 35.50586], [-80.8074, 35.50604], [-80.80677, 35.50617], [-80.80613, 35.5062], [-80.80562, 35.50618], [-80.80463, 35.50601], [-80.80394, 35.50604], [-80.80167, 35.50667], [-80.80149, 35.50679], [-80.80125, 35.50708], [-80.80125, 35.50708], [-80.80087, 35.50758], [-80.80066, 35.50769], [-80.7985, 35.50743], [-80.79747, 35.50735], [-80.79725, 35.50738], [-80.79725, 35.50738], [-80.79666, 35.50716], [-80.79666, 35.50716], [-80.79549, 35.50658], [-80.79503, 35.50628], [-80.79477, 35.50604], [-80.79454, 35.50565], [-80.79431, 35.50461], [-80.79435, 35.50407], [-80.79449, 35.50359], [-80.79599, 35.5009], [-80.79602, 35.50063], [-80.79587, 35.49837], [-80.79592, 35.49782], [-80.7962, 35.49629], [-80.79621, 35.49579], [-80.79609, 35.49521], [-80.79582, 35.4946], [-80.79562, 35.4943], [-80.7953, 35.49395], [-80.7917, 35.49097], [-80.79134, 35.49062], [-80.79114, 35.49034], [-80.79096, 35.48994], [-80.79088, 35.48957], [-80.7909, 35.48831], [-80.79088, 35.48799], [-80.79077, 35.48762], [-80.79059, 35.48729], [-80.78968, 35.48607], [-80.78953, 35.4857], [-80.78947, 35.48534], [-80.78954, 35.48437], [-80.78949, 35.48391], [-80.78938, 35.48364], [-80.78921, 35.48339], [-80.7884, 35.48261], [-80.78812, 35.48223], [-80.78655, 35.47896], [-80.7864, 35.47851], [-80.78519, 35.47351], [-80.78513, 35.47345], [-80.78513, 35.47345], [-80.78169, 35.47508], [-80.78129, 35.47516], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.77555, 35.47452], [-80.77496, 35.47451], [-80.77466, 35.47456], [-80.77385, 35.47479], [-80.77338, 35.47499], [-80.77129, 35.47627], [-80.77063, 35.47675], [-80.77051, 35.47695], [-80.77043, 35.47728], [-80.77029, 35.48141], [-80.77014, 35.48202], [-80.76692, 35.48734], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.75731, 35.48316], [-80.75679, 35.48229], [-80.75605, 35.48133], [-80.75522, 35.48055], [-80.75278, 35.47857], [-80.75134, 35.47748], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75619, 35.46857], [-80.75633, 35.46824], [-80.75738, 35.46478], [-80.75779, 35.46275], [-80.75855, 35.46121], [-80.75922, 35.45922], [-80.75932, 35.45819], [-80.75939, 35.45793], [-80.75959, 35.45762], [-80.75998, 35.45718], [-80.76115, 35.45618], [-80.76173, 35.45558], [-80.76209, 35.4551], [-80.76246, 35.45445], [-80.76264, 35.45402], [-80.76308, 35.45271], [-80.76371, 35.45188], [-80.76393, 35.4515], [-80.76402, 35.45106], [-80.76409, 35.44955], [-80.76409, 35.44928], [-80.76397, 35.44856], [-80.76401, 35.44829], [-80.76418, 35.44801], [-80.76487, 35.44716], [-80.76568, 35.44642], [-80.76596, 35.44596], [-80.76602, 35.44555], [-80.76597, 35.44519], [-80.7658, 35.4448], [-80.76426, 35.44283], [-80.76401, 35.44217], [-80.76386, 35.44109], [-80.76382, 35.4401], [-80.76392, 35.43969], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76452, 35.4382], [-80.76453, 35.43788], [-80.76441, 35.4362], [-80.76434, 35.43565], [-80.76412, 35.43503], [-80.76379, 35.43464], [-80.76308, 35.43413], [-80.76279, 35.43377], [-80.76265, 35.43332], [-80.76266, 35.43278], [-80.76261, 35.43246], [-80.76251, 35.43225], [-80.76222, 35.43187], [-80.7615, 35.43114], [-80.7609, 35.43069], [-80.76035, 35.43043], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.75928, 35.43016], [-80.75893, 35.42995], [-80.75726, 35.42794], [-80.75352, 35.42159], [-80.75314, 35.42107], [-80.75277, 35.42072], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74601, 35.41862], [-80.74558, 35.41847], [-80.74309, 35.41645], [-80.74092, 35.4145], [-80.73984, 35.41359], [-80.73526, 35.41053], [-80.73379, 35.40906], [-80.73343, 35.40876], [-80.73307, 35.40855], [-80.73263, 35.40842], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72961, 35.40628], [-80.72908, 35.40393], [-80.7291, 35.40344], [-80.72923, 35.40296], [-80.72939, 35.40268], [-80.73013, 35.40186], [-80.73028, 35.40139], [-80.73028, 35.40139], [-80.72925, 35.40123]]}, "date": "2012-02-15", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.70992, 35.41192], [-80.70977, 35.41247], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70926, 35.42133], [-80.70952, 35.42201], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71209, 35.42663], [-80.71266, 35.42686], [-80.71387, 35.4272], [-80.71456, 35.42759], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72299, 35.43049], [-80.72349, 35.4309], [-80.7238, 35.43138], [-80.72709, 35.43871], [-80.72779, 35.44124], [-80.72829, 35.44222], [-80.72956, 35.44443], [-80.72981, 35.44498], [-80.73005, 35.44569], [-80.73116, 35.45106], [-80.73178, 35.45356], [-80.73204, 35.455], [-80.73232, 35.4599], [-80.73239, 35.46039], [-80.73254, 35.46055], [-80.73293, 35.46071], [-80.73605, 35.46174], [-80.73723, 35.46219], [-80.73826, 35.46288], [-80.73887, 35.46342], [-80.7408, 35.46627], [-80.74394, 35.47036], [-80.74646, 35.47374], [-80.74705, 35.47439], [-80.7483, 35.4754], [-80.75185, 35.47785], [-80.75459, 35.48002], [-80.75561, 35.48089], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76692, 35.48734], [-80.77014, 35.48202], [-80.77029, 35.48141], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77129, 35.47627], [-80.77338, 35.47499], [-80.77385, 35.47479], [-80.77466, 35.47456], [-80.77496, 35.47451], [-80.77555, 35.47452], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78257, 35.47469], [-80.78695, 35.47255], [-80.78738, 35.47238], [-80.78884, 35.47203], [-80.78955, 35.47199], [-80.79018, 35.47206], [-80.79672, 35.47415], [-80.79748, 35.47426], [-80.7998, 35.47442], [-80.8005, 35.47461], [-80.80099, 35.47483], [-80.80147, 35.47516], [-80.80192, 35.47563], [-80.80515, 35.48001], [-80.80552, 35.48044], [-80.80593, 35.48074], [-80.80689, 35.48129], [-80.80988, 35.48296], [-80.81042, 35.48322], [-80.81114, 35.48342], [-80.81157, 35.48346], [-80.81796, 35.48335], [-80.81835, 35.48338], [-80.81883, 35.48349], [-80.81934, 35.48377], [-80.8196, 35.48397], [-80.8196, 35.48397], [-80.81962, 35.48407], [-80.81972, 35.48414], [-80.81984, 35.48416], [-80.81994, 35.4841], [-80.81997, 35.48401], [-80.81992, 35.4839], [-80.82006, 35.48347], [-80.82004, 35.48142], [-80.81995, 35.47924], [-80.81968, 35.47795], [-80.81916, 35.47674], [-80.8167, 35.47246], [-80.81639, 35.4716], [-80.81604, 35.47019], [-80.81576, 35.46964], [-80.81506, 35.46871], [-80.81487, 35.46838], [-80.81437, 35.46702], [-80.81418, 35.46665], [-80.81418, 35.46665], [-80.81522, 35.46547], [-80.81566, 35.4651], [-80.81613, 35.46482], [-80.81719, 35.46437], [-80.81764, 35.46405], [-80.81791, 35.46372], [-80.81807, 35.46337], [-80.81849, 35.46206], [-80.81887, 35.46152], [-80.81938, 35.46116], [-80.82021, 35.46069], [-80.82068, 35.46043], [-80.82105, 35.4603], [-80.82105, 35.4603], [-80.82082, 35.4592], [-80.8208, 35.4589], [-80.82114, 35.45733], [-80.82114, 35.45733], [-80.82191, 35.45736], [-80.82235, 35.45729], [-80.82292, 35.4571], [-80.82346, 35.45677], [-80.8248, 35.45557], [-80.82569, 35.45508], [-80.82569, 35.45508], [-80.82519, 35.45428], [-80.82478, 35.45344], [-80.82468, 35.4531], [-80.82448, 35.45284], [-80.82427, 35.45275], [-80.82243, 35.45225], [-80.82106, 35.45175], [-80.82032, 35.45139], [-80.81947, 35.45075], [-80.81947, 35.45075], [-80.80954, 35.45441], [-80.80954, 35.45441], [-80.80916, 35.4537], [-80.80885, 35.45328], [-80.80874, 35.45302], [-80.80875, 35.45268], [-80.80903, 35.45212], [-80.8091, 35.4517], [-80.80901, 35.45134], [-80.80835, 35.44964], [-80.8083, 35.44934], [-80.80843, 35.44883], [-80.8092, 35.44677], [-80.80935, 35.44614], [-80.80933, 35.44579], [-80.80882, 35.4434], [-80.80893, 35.44234], [-80.80915, 35.44185], [-80.80997, 35.44059], [-80.81098, 35.43885], [-80.81108, 35.43807], [-80.81127, 35.43767], [-80.81266, 35.43567], [-80.81266, 35.43567], [-80.81239, 35.43564], [-80.80952, 35.43566], [-80.80873, 35.43561], [-80.80834, 35.43552], [-80.80809, 35.43541], [-80.80764, 35.43509], [-80.80696, 35.43446], [-80.8058, 35.43394], [-80.80532, 35.43386], [-80.80441, 35.43388], [-80.80358, 35.43395], [-80.80358, 35.43395], [-80.80308, 35.43501], [-80.80302, 35.43527], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78542, 35.37673], [-80.78482, 35.37283], [-80.78482, 35.37283], [-80.78339, 35.37296], [-80.78295, 35.3729], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76413, 35.37375], [-80.76381, 35.3737], [-80.76241, 35.37365], [-80.76186, 35.37358], [-80.76125, 35.37338], [-80.76079, 35.37315], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-02-22", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76517, 35.49041], [-80.76572, 35.49067], [-80.7662, 35.491], [-80.76651, 35.49136], [-80.7671, 35.49226], [-80.76945, 35.49601], [-80.76978, 35.49696], [-80.76988, 35.49772], [-80.76987, 35.49827], [-80.76962, 35.49962], [-80.76828, 35.50577], [-80.76828, 35.50577], [-80.76784, 35.50572], [-80.76696, 35.50572], [-80.76665, 35.50564], [-80.76604, 35.50536], [-80.76515, 35.50473], [-80.76515, 35.50473], [-80.76363, 35.50491], [-80.76221, 35.50463], [-80.75921, 35.50449], [-80.75676, 35.50429], [-80.75495, 35.50421], [-80.7485, 35.50408], [-80.74658, 35.50398], [-80.74343, 35.50363], [-80.73984, 35.50309], [-80.7382, 35.50292], [-80.73779, 35.50296], [-80.73746, 35.50308], [-80.73623, 35.50409], [-80.73578, 35.50431], [-80.73505, 35.50441], [-80.73408, 35.50447], [-80.73284, 35.50443], [-80.73131, 35.50429], [-80.73084, 35.5043], [-80.73035, 35.50441], [-80.72601, 35.50576], [-80.72345, 35.50684], [-80.72293, 35.50702], [-80.72227, 35.50708], [-80.72087, 35.50687], [-80.72087, 35.50687], [-80.72089, 35.50378], [-80.72089, 35.50378], [-80.71963, 35.50357], [-80.71913, 35.50331], [-80.7189, 35.50307], [-80.71823, 35.50189], [-80.71715, 35.49891], [-80.71679, 35.49806], [-80.716, 35.49678], [-80.71562, 35.49632], [-80.71295, 35.49401], [-80.71181, 35.49295], [-80.71106, 35.49243], [-80.71062, 35.49218], [-80.71021, 35.49201], [-80.70834, 35.49153], [-80.7068, 35.49082], [-80.7068, 35.49082], [-80.70665, 35.49214], [-80.70653, 35.49275], [-80.70589, 35.49429], [-80.70537, 35.49572], [-80.70446, 35.49884], [-80.70442, 35.49917], [-80.70454, 35.49994], [-80.70454, 35.50027], [-80.70434, 35.50056], [-80.704, 35.50081], [-80.70328, 35.50121], [-80.70289, 35.50136], [-80.69995, 35.50199], [-80.69934, 35.50197], [-80.69807, 35.5016], [-80.69739, 35.50146], [-80.69669, 35.50147], [-80.69601, 35.50156], [-80.69414, 35.50191], [-80.69014, 35.50283], [-80.68501, 35.50429], [-80.68501, 35.50429], [-80.68404, 35.50083], [-80.6834, 35.49892], [-80.68315, 35.49846], [-80.68286, 35.49815], [-80.68243, 35.49797], [-80.68105, 35.49786], [-80.68022, 35.49774], [-80.67999, 35.49766], [-80.67965, 35.49748], [-80.67903, 35.49702], [-80.67858, 35.49657], [-80.67829, 35.49577], [-80.67802, 35.4946], [-80.67797, 35.494], [-80.67794, 35.49136], [-80.67789, 35.49096], [-80.67789, 35.49096], [-80.67733, 35.49105], [-80.67663, 35.49108], [-80.67561, 35.49098], [-80.67168, 35.49], [-80.67168, 35.49], [-80.67193, 35.48881], [-80.67378, 35.48357], [-80.67397, 35.48285], [-80.67408, 35.48202], [-80.67403, 35.48143], [-80.67306, 35.47712], [-80.67283, 35.47643], [-80.67129, 35.47322], [-80.67086, 35.47243], [-80.67069, 35.47194], [-80.67059, 35.47145], [-80.67042, 35.46914], [-80.67025, 35.46847], [-80.67002, 35.46791], [-80.66966, 35.46734], [-80.66882, 35.46621], [-80.66809, 35.46536], [-80.6676, 35.46466], [-80.66645, 35.46323], [-80.66569, 35.46239], [-80.66468, 35.4611], [-80.66421, 35.46035], [-80.66399, 35.45983], [-80.66387, 35.45938], [-80.66381, 35.45877], [-80.66384, 35.45828], [-80.66398, 35.45758], [-80.66446, 35.4566], [-80.66487, 35.45602], [-80.66487, 35.45602], [-80.66888, 35.45238], [-80.67001, 35.45124], [-80.67303, 35.44843], [-80.67385, 35.44772], [-80.67667, 35.44501], [-80.67812, 35.44324], [-80.67902, 35.44175], [-80.67947, 35.44081], [-80.68004, 35.4394], [-80.68025, 35.43848], [-80.68028, 35.43818], [-80.68024, 35.43811], [-80.68043, 35.43723], [-80.6805, 35.43642], [-80.68052, 35.43498], [-80.68034, 35.43314], [-80.67877, 35.42615], [-80.67857, 35.4255], [-80.67736, 35.42331], [-80.67736, 35.42318], [-80.67555, 35.42096], [-80.67481, 35.42028], [-80.6742, 35.41983], [-80.67388, 35.41964], [-80.67375, 35.41959], [-80.67364, 35.41961], [-80.67303, 35.41927], [-80.67303, 35.41927], [-80.67148, 35.41836], [-80.67027, 35.41757], [-80.66937, 35.41675], [-80.6681, 35.41544], [-80.66777, 35.41504], [-80.66725, 35.41419], [-80.66726, 35.41411], [-80.66689, 35.41345], [-80.66624, 35.41238], [-80.66416, 35.40868], [-80.66198, 35.40464], [-80.66112, 35.40325], [-80.66048, 35.40198], [-80.65988, 35.40052], [-80.65931, 35.39875], [-80.65918, 35.39807], [-80.65918, 35.39807], [-80.66011, 35.3979], [-80.66183, 35.39739], [-80.66299, 35.39702], [-80.66346, 35.3968], [-80.66616, 35.39495], [-80.66651, 35.39475], [-80.66732, 35.39439], [-80.66854, 35.39393], [-80.66893, 35.39372], [-80.67052, 35.39243], [-80.67232, 35.39114], [-80.67232, 35.39114], [-80.67352, 35.39245], [-80.6738, 35.39284], [-80.67421, 35.39406], [-80.67429, 35.39459], [-80.67429, 35.39459], [-80.675, 35.39463], [-80.67537, 35.39478], [-80.67561, 35.395], [-80.67596, 35.39588], [-80.67648, 35.39668], [-80.67666, 35.39729], [-80.67666, 35.39729], [-80.67595, 35.39754]]}, "date": "2012-02-23", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.70992, 35.41192], [-80.70977, 35.41247], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70926, 35.42133], [-80.70952, 35.42201], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71209, 35.42663], [-80.71266, 35.42686], [-80.71387, 35.4272], [-80.71456, 35.42759], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72299, 35.43049], [-80.72349, 35.4309], [-80.7238, 35.43138], [-80.72485, 35.43371], [-80.72485, 35.43371], [-80.72694, 35.43335], [-80.7293, 35.43265], [-80.72992, 35.43235], [-80.7314, 35.43146], [-80.73579, 35.4299], [-80.73609, 35.42975], [-80.73642, 35.42943], [-80.73816, 35.42668], [-80.73932, 35.42516], [-80.73972, 35.4247], [-80.73997, 35.42449], [-80.74173, 35.42365], [-80.74245, 35.42302], [-80.74357, 35.42151], [-80.74438, 35.41972], [-80.74457, 35.41942], [-80.74502, 35.41897], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78977, 35.38192], [-80.78905, 35.38232], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78586, 35.38513], [-80.78416, 35.3867], [-80.77943, 35.39042], [-80.7786, 35.39092], [-80.77556, 35.39213], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.77113, 35.38892], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76102, 35.38827], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75884, 35.38856], [-80.75825, 35.38843], [-80.75789, 35.38828], [-80.75704, 35.38776], [-80.75671, 35.38742], [-80.7563, 35.38668], [-80.75565, 35.38518], [-80.75508, 35.38432], [-80.75413, 35.38323], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75553, 35.37862], [-80.75573, 35.37832], [-80.75611, 35.37795], [-80.75674, 35.37759], [-80.75735, 35.3774], [-80.75805, 35.37736], [-80.75862, 35.37743], [-80.76162, 35.37853], [-80.76221, 35.37879], [-80.76516, 35.38052], [-80.76552, 35.38068], [-80.76587, 35.38077], [-80.76803, 35.38115], [-80.7685, 35.38117], [-80.76889, 35.3811], [-80.7692, 35.38099], [-80.77031, 35.38049], [-80.77078, 35.3804], [-80.77335, 35.38058], [-80.77364, 35.38058], [-80.77418, 35.38047], [-80.77461, 35.38026], [-80.77485, 35.38007], [-80.77562, 35.37919], [-80.77579, 35.37893], [-80.77588, 35.37864], [-80.7759, 35.37835], [-80.7758, 35.37791], [-80.77493, 35.37651], [-80.77405, 35.37449], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76446, 35.37382], [-80.76381, 35.3737], [-80.76206, 35.37361], [-80.76166, 35.37353], [-80.76125, 35.37338], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-02-26", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72865, 35.40114], [-80.73028, 35.40139], [-80.73028, 35.40139], [-80.73013, 35.40186], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76517, 35.49041], [-80.76572, 35.49067], [-80.7662, 35.491], [-80.76651, 35.49136], [-80.76922, 35.49559], [-80.7696, 35.49637], [-80.76985, 35.49736], [-80.76989, 35.49793], [-80.76983, 35.4986], [-80.76828, 35.50577], [-80.7682, 35.50647], [-80.76821, 35.50732], [-80.76828, 35.50795], [-80.76886, 35.51102], [-80.76886, 35.51102], [-80.76772, 35.51127], [-80.76706, 35.51148], [-80.76655, 35.51178], [-80.76581, 35.51235], [-80.76537, 35.51287], [-80.76374, 35.51563], [-80.76332, 35.5163], [-80.76309, 35.51657], [-80.76243, 35.51704], [-80.76, 35.51842], [-80.75942, 35.5188], [-80.75731, 35.52101], [-80.75303, 35.52485], [-80.75246, 35.52527], [-80.75188, 35.52549], [-80.75144, 35.52552], [-80.7511, 35.52549], [-80.74819, 35.52429], [-80.74765, 35.52408], [-80.74724, 35.52398], [-80.74691, 35.52395], [-80.74635, 35.52405], [-80.74587, 35.52426], [-80.74558, 35.52457], [-80.74537, 35.52509], [-80.74502, 35.52725], [-80.74483, 35.52763], [-80.74371, 35.52938], [-80.74354, 35.52976], [-80.74345, 35.53017], [-80.74341, 35.53081], [-80.74345, 35.53743], [-80.74379, 35.54489], [-80.74379, 35.54489], [-80.74291, 35.54435], [-80.7424, 35.54414], [-80.74155, 35.54406], [-80.73993, 35.54414], [-80.73993, 35.54414], [-80.7388, 35.54418], [-80.73405, 35.54383], [-80.72857, 35.54335], [-80.72499, 35.54335], [-80.72427, 35.5434], [-80.72177, 35.5437], [-80.72013, 35.54382], [-80.71714, 35.54435], [-80.71653, 35.54442], [-80.71303, 35.54451], [-80.71017, 35.54436], [-80.70919, 35.54426], [-80.70796, 35.54448], [-80.70689, 35.54477], [-80.70623, 35.545], [-80.70409, 35.54627], [-80.70184, 35.54724], [-80.7006, 35.54786], [-80.69996, 35.54823], [-80.69965, 35.54846], [-80.69885, 35.54916], [-80.69842, 35.54969], [-80.69796, 35.55039], [-80.69677, 35.55165], [-80.69406, 35.55412], [-80.69357, 35.55478], [-80.6932, 35.55545], [-80.69223, 35.55785], [-80.69191, 35.55831], [-80.69154, 35.55874], [-80.69083, 35.55942], [-80.68902, 35.56071], [-80.68776, 35.56187], [-80.68718, 35.56256], [-80.68623, 35.56421], [-80.68359, 35.56943], [-80.68304, 35.57015], [-80.68093, 35.57231], [-80.68076, 35.57254], [-80.68076, 35.57254], [-80.68087, 35.57421], [-80.68073, 35.57475], [-80.67895, 35.579], [-80.67848, 35.58002], [-80.67784, 35.58115], [-80.67634, 35.58406], [-80.67584, 35.58454], [-80.67584, 35.58454], [-80.67506, 35.58511], [-80.67396, 35.5854], [-80.67304, 35.58547], [-80.6698, 35.58543], [-80.66837, 35.58567], [-80.66709, 35.58567], [-80.66534, 35.5863], [-80.66507, 35.58646], [-80.6647, 35.58682], [-80.66437, 35.58724], [-80.66417, 35.58739], [-80.66371, 35.58757], [-80.66105, 35.58775], [-80.66035, 35.58774], [-80.65812, 35.5873], [-80.65641, 35.58718], [-80.65565, 35.58718], [-80.6527, 35.58763], [-80.6527, 35.58763], [-80.65273, 35.58857], [-80.65327, 35.59368], [-80.65327, 35.59368], [-80.65085, 35.59535], [-80.64736, 35.59687], [-80.6467, 35.59722], [-80.64532, 35.59825], [-80.64409, 35.59907], [-80.64194, 35.60022], [-80.64032, 35.60118], [-80.63993, 35.60169], [-80.63895, 35.60322], [-80.6374, 35.60549], [-80.63682, 35.60622], [-80.63527, 35.60775], [-80.63342, 35.60937], [-80.63298, 35.60982], [-80.63289, 35.6105], [-80.63283, 35.61211], [-80.63277, 35.61693], [-80.63263, 35.61728], [-80.63238, 35.61758], [-80.63199, 35.61793], [-80.63073, 35.61892], [-80.63008, 35.61939], [-80.6288, 35.62012], [-80.62801, 35.62064], [-80.62765, 35.62104], [-80.62675, 35.62223], [-80.62608, 35.62287], [-80.62499, 35.6237], [-80.62172, 35.62569], [-80.62117, 35.62622], [-80.61912, 35.62911], [-80.61857, 35.62961], [-80.61717, 35.63074], [-80.61152, 35.63602], [-80.60835, 35.63937], [-80.60807, 35.63975], [-80.60748, 35.6408], [-80.60736, 35.64093], [-80.60643, 35.64154], [-80.60591, 35.64176], [-80.60497, 35.64185], [-80.60208, 35.64188], [-80.60147, 35.64192], [-80.60108, 35.64205], [-80.60091, 35.64228], [-80.6007, 35.64478], [-80.60045, 35.64891], [-80.6001, 35.65029], [-80.6001, 35.65029], [-80.59926, 35.65043], [-80.59803, 35.65076], [-80.59543, 35.65163], [-80.59442, 35.65199], [-80.59171, 35.65326], [-80.59088, 35.65358], [-80.59042, 35.6537], [-80.58962, 35.65388], [-80.58882, 35.65394], [-80.58789, 35.65392], [-80.58593, 35.6537], [-80.58593, 35.6537], [-80.58592, 35.65575], [-80.58566, 35.66328], [-80.58551, 35.66404], [-80.58425, 35.66831], [-80.58414, 35.6689], [-80.58398, 35.67186], [-80.58326, 35.67603], [-80.5831, 35.67638], [-80.58165, 35.67799], [-80.58143, 35.67846], [-80.58138, 35.67879], [-80.58132, 35.68435], [-80.58124, 35.68512], [-80.58086, 35.68621], [-80.58086, 35.68621], [-80.57986, 35.68637], [-80.56704, 35.68778], [-80.56655, 35.6878], [-80.56562, 35.68777], [-80.56426, 35.68753], [-80.56333, 35.68719], [-80.56186, 35.68652], [-80.56186, 35.68652], [-80.56176, 35.68904], [-80.56189, 35.69098], [-80.56209, 35.69245], [-80.56255, 35.69495], [-80.56258, 35.69578], [-80.56243, 35.69633], [-80.56064, 35.6988], [-80.55941, 35.70033], [-80.55719, 35.70326], [-80.55543, 35.7058], [-80.55543, 35.7058], [-80.55443, 35.70536], [-80.55384, 35.7052], [-80.55326, 35.7051], [-80.54783, 35.70477], [-80.54382, 35.70426], [-80.5432, 35.70414], [-80.5422, 35.70375], [-80.53373, 35.69957], [-80.52648, 35.69693], [-80.52563, 35.69668], [-80.51282, 35.69379], [-80.51282, 35.69379], [-80.51281, 35.6935], [-80.51269, 35.69305], [-80.51204, 35.69158], [-80.51178, 35.69122], [-80.51143, 35.69049], [-80.50955, 35.68748], [-80.50849, 35.68569], [-80.50785, 35.68339], [-80.50758, 35.68281], [-80.50707, 35.68198], [-80.50496, 35.6782], [-80.50412, 35.67661], [-80.50339, 35.67551], [-80.50256, 35.6745], [-80.50095, 35.67278], [-80.50036, 35.67206], [-80.49993, 35.67135], [-80.49967, 35.67064], [-80.49958, 35.67023], [-80.49944, 35.66879], [-80.49952, 35.66867], [-80.4995, 35.66849], [-80.4995, 35.66849], [-80.4988, 35.66855], [-80.49823, 35.66868], [-80.4975, 35.66896], [-80.49698, 35.66931], [-80.49603, 35.6702], [-80.49503, 35.67127], [-80.49448, 35.67209], [-80.49268, 35.67442], [-80.49231, 35.67479], [-80.4905, 35.67573], [-80.48961, 35.67659], [-80.48855, 35.67862], [-80.48746, 35.68043], [-80.48484, 35.68686], [-80.48484, 35.68686], [-80.49025, 35.68859], [-80.49209, 35.68914], [-80.5007, 35.69104], [-80.50785, 35.69271], [-80.50955, 35.69307], [-80.51032, 35.69328], [-80.51048, 35.69336], [-80.5128, 35.6939], [-80.5128, 35.6939], [-80.51281, 35.6935], [-80.51269, 35.69305], [-80.51204, 35.69158], [-80.51178, 35.69122]]}, "date": "2012-03-06", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79428, 35.42758], [-80.7996, 35.43312], [-80.80167, 35.43512], [-80.80274, 35.43638], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80302, 35.43527], [-80.80308, 35.43501], [-80.80344, 35.4342], [-80.80366, 35.43384], [-80.8078, 35.43011], [-80.80848, 35.42956], [-80.80948, 35.42904], [-80.81276, 35.42752], [-80.81897, 35.42473], [-80.8194, 35.42462], [-80.8224, 35.42423], [-80.8224, 35.42423], [-80.82255, 35.4248], [-80.82316, 35.42607], [-80.82316, 35.42607], [-80.82347, 35.426], [-80.82432, 35.42569], [-80.82507, 35.42566], [-80.82623, 35.4258], [-80.82701, 35.42598], [-80.82788, 35.42627], [-80.82826, 35.42628], [-80.82887, 35.42618], [-80.83203, 35.42517], [-80.83248, 35.42507], [-80.83313, 35.42506], [-80.83416, 35.42532], [-80.83416, 35.42532], [-80.8343, 35.42468], [-80.83443, 35.42437], [-80.83469, 35.42417], [-80.83518, 35.42393], [-80.83518, 35.42393], [-80.8348, 35.42346], [-80.83459, 35.42327], [-80.8339, 35.42282], [-80.83336, 35.42258], [-80.83267, 35.4224], [-80.83178, 35.42224], [-80.83159, 35.42209], [-80.83159, 35.42209], [-80.83599, 35.42066], [-80.83636, 35.42058], [-80.83667, 35.42058], [-80.83772, 35.4208], [-80.83801, 35.42082], [-80.84202, 35.42075], [-80.84202, 35.42075], [-80.8419, 35.41953], [-80.84201, 35.41826], [-80.84233, 35.4171], [-80.84296, 35.41521], [-80.84318, 35.41427], [-80.8432, 35.41376], [-80.84295, 35.4108], [-80.84295, 35.4108], [-80.85189, 35.41046], [-80.85267, 35.4104], [-80.85322, 35.41031], [-80.8572, 35.4092], [-80.85859, 35.40875], [-80.85883, 35.40872], [-80.85967, 35.40846], [-80.8606, 35.40814], [-80.86629, 35.40594], [-80.86938, 35.4047], [-80.86999, 35.40456], [-80.87067, 35.40448], [-80.87121, 35.40458], [-80.87183, 35.40484], [-80.87328, 35.4058], [-80.87366, 35.406], [-80.87411, 35.40616], [-80.87472, 35.40627], [-80.8753, 35.40622], [-80.87557, 35.40615], [-80.8762, 35.40589], [-80.87757, 35.40517], [-80.87892, 35.40427], [-80.87929, 35.4041], [-80.87964, 35.40407], [-80.88126, 35.40422], [-80.88181, 35.40436], [-80.88487, 35.40601], [-80.88585, 35.40666], [-80.88612, 35.40678], [-80.88648, 35.40687], [-80.88695, 35.4069], [-80.88826, 35.40686], [-80.89185, 35.40708], [-80.89266, 35.40709], [-80.89463, 35.40674], [-80.89694, 35.40652], [-80.89748, 35.40657], [-80.89946, 35.40688], [-80.90111, 35.4074], [-80.90111, 35.4074], [-80.90163, 35.40752], [-80.90222, 35.40755], [-80.90416, 35.40744], [-80.90457, 35.40737], [-80.90495, 35.40724], [-80.90528, 35.40705], [-80.90553, 35.4068], [-80.90608, 35.40598], [-80.90695, 35.40527], [-80.90724, 35.4051], [-80.90758, 35.40496], [-80.90793, 35.40491], [-80.90896, 35.40485], [-80.90967, 35.40489], [-80.91062, 35.40486], [-80.91128, 35.40475], [-80.91156, 35.40462], [-80.91179, 35.40443], [-80.91328, 35.40254], [-80.91363, 35.40219], [-80.9138, 35.4021], [-80.91415, 35.40201], [-80.91651, 35.40181], [-80.91651, 35.40181], [-80.9164, 35.40095], [-80.9164, 35.40095], [-80.91659, 35.40092], [-80.91672, 35.40084], [-80.91678, 35.40074], [-80.91672, 35.39991], [-80.91664, 35.39969], [-80.9164, 35.39931], [-80.91581, 35.39789], [-80.91581, 35.39789], [-80.91674, 35.39767], [-80.91906, 35.39753], [-80.91934, 35.39748], [-80.91958, 35.39737], [-80.9199, 35.3971], [-80.92047, 35.39649], [-80.92067, 35.39615], [-80.92072, 35.3957], [-80.92051, 35.39513], [-80.92051, 35.39513], [-80.92166, 35.39484], [-80.92184, 35.39483], [-80.92205, 35.39484], [-80.92291, 35.39509], [-80.9233, 35.39514], [-80.9233, 35.39514], [-80.92332, 35.39488], [-80.92325, 35.39456], [-80.92238, 35.39295], [-80.92238, 35.39295], [-80.92289, 35.39277], [-80.92289, 35.39277], [-80.92258, 35.39226], [-80.92129, 35.39095], [-80.921, 35.39048], [-80.9209, 35.39002], [-80.92104, 35.38889], [-80.92101, 35.38856], [-80.9204, 35.38572], [-80.91992, 35.38444], [-80.91896, 35.38215], [-80.91855, 35.38032], [-80.91836, 35.37999], [-80.91784, 35.37962], [-80.91459, 35.37792], [-80.91419, 35.3778], [-80.90934, 35.37673], [-80.90893, 35.37659], [-80.90856, 35.37638], [-80.90685, 35.37518], [-80.90685, 35.37518], [-80.90142, 35.38045], [-80.90098, 35.38081], [-80.9007, 35.38095], [-80.9003, 35.38106], [-80.89887, 35.38119], [-80.8984, 35.38128], [-80.89811, 35.3814], [-80.89388, 35.38436], [-80.89335, 35.38469], [-80.89222, 35.3852], [-80.89078, 35.38558], [-80.88752, 35.38629], [-80.88706, 35.38638], [-80.88671, 35.3864], [-80.88603, 35.38633], [-80.88532, 35.38612], [-80.87815, 35.38234], [-80.8773, 35.38191], [-80.87692, 35.38177], [-80.87614, 35.38159], [-80.86708, 35.38], [-80.86632, 35.37982], [-80.86536, 35.3795], [-80.85869, 35.37686], [-80.85415, 35.37558], [-80.83385, 35.37753], [-80.8336, 35.37748], [-80.8336, 35.37748], [-80.83331, 35.37468], [-80.83302, 35.37329], [-80.83263, 35.37206], [-80.83241, 35.37154], [-80.83199, 35.37084], [-80.83161, 35.37037], [-80.83152, 35.37014], [-80.83152, 35.37014], [-80.8312, 35.37016], [-80.82979, 35.37005], [-80.82774, 35.36978], [-80.8263, 35.36936], [-80.8223, 35.36804], [-80.82146, 35.36753], [-80.82113, 35.36721], [-80.81993, 35.36484], [-80.81967, 35.36392], [-80.81967, 35.36392], [-80.81933, 35.36421], [-80.81818, 35.365], [-80.81581, 35.3672], [-80.81521, 35.3677], [-80.81482, 35.36795], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80692, 35.37136], [-80.80675, 35.3709], [-80.80678, 35.37028], [-80.807, 35.36904], [-80.80697, 35.3687], [-80.80684, 35.3683], [-80.80602, 35.36752], [-80.80511, 35.36677], [-80.80399, 35.36514], [-80.8035, 35.36483], [-80.80261, 35.36458], [-80.80218, 35.36438], [-80.80105, 35.36326], [-80.80062, 35.36265], [-80.80048, 35.36233], [-80.79995, 35.36032], [-80.79995, 35.36032], [-80.79743, 35.36106], [-80.79256, 35.36327], [-80.78935, 35.3644], [-80.7887, 35.3647], [-80.78749, 35.36537], [-80.78749, 35.36537], [-80.78687, 35.36561], [-80.78602, 35.36574], [-80.78445, 35.36564], [-80.78445, 35.36564], [-80.78435, 35.36537], [-80.78399, 35.36477], [-80.78391, 35.36451], [-80.78392, 35.36417], [-80.78396, 35.36396], [-80.78425, 35.36346], [-80.78474, 35.36296], [-80.78474, 35.36296], [-80.78541, 35.36326], [-80.78712, 35.36482], [-80.78729, 35.365], [-80.78747, 35.3653], [-80.78754, 35.36569], [-80.7875, 35.36598], [-80.7873, 35.36639], [-80.78683, 35.36795], [-80.78572, 35.36951], [-80.78508, 35.3705], [-80.78471, 35.3712], [-80.78457, 35.37191], [-80.78472, 35.37284], [-80.78472, 35.37284], [-80.78339, 35.37296], [-80.78295, 35.3729], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76413, 35.37375], [-80.76381, 35.3737], [-80.76241, 35.37365], [-80.76186, 35.37358], [-80.76125, 35.37338], [-80.76079, 35.37315], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.7294, 35.38313], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73034, 35.39461], [-80.73051, 35.39643], [-80.7309, 35.39864], [-80.73028, 35.40139]]}, "date": "2012-03-08", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-78.86511, 35.77245], [-78.86528, 35.77267], [-78.86534, 35.77284], [-78.86515, 35.77427], [-78.86518, 35.77466], [-78.86518, 35.77466], [-78.8667, 35.77463], [-78.86701, 35.77456], [-78.86747, 35.77437], [-78.86777, 35.77413], [-78.86797, 35.77388], [-78.86821, 35.77329], [-78.86821, 35.77329], [-78.86894, 35.77339], [-78.87037, 35.77333], [-78.87169, 35.77347], [-78.87191, 35.77345], [-78.87258, 35.77308], [-78.87296, 35.77305], [-78.87339, 35.7731], [-78.87339, 35.7731], [-78.8757, 35.76102], [-78.87603, 35.75903], [-78.87681, 35.75501], [-78.87704, 35.75354], [-78.87712, 35.75262], [-78.87711, 35.75149], [-78.87673, 35.75016], [-78.87633, 35.74931], [-78.87633, 35.74931], [-78.87563, 35.7496], [-78.87517, 35.7497], [-78.87502, 35.74969], [-78.87477, 35.74961], [-78.87449, 35.74937], [-78.87442, 35.74912], [-78.87446, 35.74887], [-78.87472, 35.74863], [-78.87493, 35.74854], [-78.87579, 35.74839], [-78.8821, 35.74792], [-78.89482, 35.74685], [-78.90031, 35.74631], [-78.90471, 35.74582], [-78.95019, 35.74127], [-78.95263, 35.74098], [-78.97415, 35.73745], [-78.98747, 35.73557], [-78.98834, 35.73548], [-78.98926, 35.73547], [-78.98991, 35.73551], [-79.0003, 35.73684], [-79.00345, 35.73714], [-79.00631, 35.73752], [-79.00767, 35.73764], [-79.00879, 35.73768], [-79.01002, 35.73766], [-79.01698, 35.73717], [-79.01876, 35.73714], [-79.05511, 35.73871], [-79.06538, 35.73958], [-79.066, 35.73958], [-79.06808, 35.73943], [-79.06906, 35.73926], [-79.07038, 35.73896], [-79.07187, 35.73853], [-79.07603, 35.73747], [-79.07783, 35.73727], [-79.08366, 35.73696], [-79.08758, 35.73661], [-79.09328, 35.73588], [-79.09518, 35.73554], [-79.0991, 35.73465], [-79.10132, 35.7339], [-79.10334, 35.7331], [-79.10729, 35.73137], [-79.11103, 35.72965], [-79.11392, 35.72838], [-79.12029, 35.72567], [-79.12029, 35.72567], [-79.12113, 35.72537], [-79.12205, 35.7252], [-79.1232, 35.72517], [-79.12514, 35.72538], [-79.12593, 35.72535], [-79.12676, 35.72509], [-79.12711, 35.72496], [-79.12787, 35.72451], [-79.12856, 35.72386], [-79.12983, 35.72237], [-79.12983, 35.72237], [-79.13064, 35.72155], [-79.13068, 35.72146], [-79.13091, 35.72128], [-79.13205, 35.72065], [-79.13306, 35.72024], [-79.14427, 35.71821], [-79.14531, 35.71809], [-79.14612, 35.71811], [-79.1473, 35.71823], [-79.1534, 35.71917], [-79.15475, 35.71934], [-79.15645, 35.71949], [-79.15895, 35.71962], [-79.17642, 35.72028], [-79.17684, 35.72039], [-79.17684, 35.72039], [-79.17693, 35.72051], [-79.17706, 35.72057], [-79.17728, 35.72056], [-79.17746, 35.72042], [-79.17801, 35.72034], [-79.18516, 35.72058], [-79.18686, 35.72066], [-79.1874, 35.72072], [-79.23267, 35.72712], [-79.23267, 35.72712], [-79.23303, 35.72719], [-79.23366, 35.72741], [-79.23515, 35.72817], [-79.23557, 35.72833], [-79.23593, 35.72845], [-79.23665, 35.72858], [-79.23744, 35.72857], [-79.23844, 35.72842], [-79.23889, 35.72831], [-79.23978, 35.72821], [-79.24027, 35.72821], [-79.2413, 35.72831], [-79.27388, 35.73284], [-79.27644, 35.73306], [-79.27809, 35.73314], [-79.28184, 35.73318], [-79.28924, 35.73338], [-79.29509, 35.73345], [-79.29829, 35.73354], [-79.32513, 35.73404], [-79.33289, 35.73423], [-79.34194, 35.73435], [-79.34465, 35.73423], [-79.35053, 35.73389], [-79.35297, 35.73371], [-79.3579, 35.73347], [-79.36653, 35.73297], [-79.36868, 35.73293], [-79.37057, 35.73298], [-79.38711, 35.73374], [-79.40905, 35.73481], [-79.40946, 35.73477], [-79.41011, 35.7348], [-79.41342, 35.73496], [-79.41394, 35.73503], [-79.41668, 35.73522], [-79.41901, 35.73531], [-79.42665, 35.73473], [-79.4269, 35.73478], [-79.42946, 35.73457], [-79.43131, 35.73439], [-79.4332, 35.73415], [-79.43397, 35.73412], [-79.43429, 35.73408], [-79.43453, 35.734], [-79.43805, 35.73367], [-79.44529, 35.73286], [-79.44766, 35.73276], [-79.47644, 35.73377], [-79.4774, 35.73376], [-79.48374, 35.73337], [-79.48527, 35.73335], [-79.49954, 35.73404], [-79.50458, 35.73435], [-79.50498, 35.73442], [-79.50714, 35.73461], [-79.51357, 35.735], [-79.51834, 35.73518], [-79.51925, 35.7353], [-79.52118, 35.7358], [-79.54688, 35.74298], [-79.54778, 35.74321], [-79.54915, 35.74346], [-79.55019, 35.74355], [-79.55157, 35.74353], [-79.55627, 35.74273], [-79.55819, 35.74265], [-79.57042, 35.7424], [-79.57232, 35.74257], [-79.57896, 35.74391], [-79.57896, 35.74391], [-79.58023, 35.74218], [-79.58023, 35.74218], [-79.58329, 35.74267], [-79.58433, 35.7428], [-79.58494, 35.7428], [-79.58681, 35.74225], [-79.59082, 35.74091], [-79.59192, 35.74075], [-79.59324, 35.7407], [-79.59421, 35.74073], [-79.596, 35.74147], [-79.59643, 35.7416], [-79.60168, 35.74193], [-79.60251, 35.7419], [-79.60302, 35.74179], [-79.60367, 35.74159], [-79.60424, 35.74135], [-79.60878, 35.73855], [-79.61068, 35.73758], [-79.61157, 35.73705], [-79.6128, 35.73578], [-79.61303, 35.73533], [-79.61331, 35.73457], [-79.61358, 35.73419], [-79.61427, 35.7337], [-79.61559, 35.733], [-79.61616, 35.73277], [-79.61616, 35.73277], [-79.61612, 35.73129], [-79.61612, 35.73129], [-79.62126, 35.73144], [-79.62243, 35.73146], [-79.62281, 35.73143], [-79.62388, 35.73128], [-79.62993, 35.72999], [-79.63091, 35.7299], [-79.63238, 35.72997], [-79.63404, 35.73023], [-79.63719, 35.7303], [-79.63762, 35.73034], [-79.64002, 35.73084], [-79.64307, 35.7308], [-79.645, 35.73095], [-79.64577, 35.73096], [-79.64618, 35.73093], [-79.64684, 35.73075], [-79.64684, 35.73075], [-79.64713, 35.73107], [-79.64813, 35.73173], [-79.6489, 35.73243], [-79.64951, 35.73277], [-79.65001, 35.73297], [-79.651, 35.73327], [-79.65215, 35.73319], [-79.65215, 35.73319], [-79.6527, 35.73267], [-79.65346, 35.73211], [-79.65377, 35.73195], [-79.65415, 35.73191], [-79.65415, 35.73191], [-79.65412, 35.73149], [-79.65412, 35.73149], [-79.65891, 35.72947], [-79.6592, 35.72918], [-79.65971, 35.72835], [-79.66067, 35.72711], [-79.66099, 35.72651], [-79.66099, 35.72651], [-79.66168, 35.72643], [-79.66268, 35.7264], [-79.66268, 35.7264], [-79.66338, 35.72639], [-79.6654, 35.72666], [-79.66723, 35.72721], [-79.6682, 35.72738], [-79.67197, 35.72768], [-79.67454, 35.7276], [-79.67562, 35.7277], [-79.67674, 35.7279], [-79.67942, 35.72865], [-79.68015, 35.72874], [-79.68062, 35.72872], [-79.68109, 35.72864], [-79.68167, 35.72844], [-79.68229, 35.7281], [-79.68369, 35.72702], [-79.68369, 35.72702], [-79.68456, 35.7286], [-79.68456, 35.7286], [-79.68579, 35.72826], [-79.68696, 35.728], [-79.68936, 35.72754], [-79.69505, 35.72658], [-79.69736, 35.72626], [-79.70305, 35.72569], [-79.70503, 35.7254], [-79.71362, 35.72433], [-79.71413, 35.7242], [-79.71572, 35.72419], [-79.72794, 35.72452], [-79.73046, 35.72463], [-79.73616, 35.72504], [-79.74024, 35.72528], [-79.74127, 35.72518], [-79.74546, 35.72455], [-79.7478, 35.72432], [-79.74829, 35.72433], [-79.75074, 35.72387], [-79.75162, 35.72361], [-79.7535, 35.72278], [-79.76014, 35.71875], [-79.76382, 35.71659], [-79.7639, 35.71645], [-79.77226, 35.71149], [-79.77285, 35.7111], [-79.77389, 35.71023], [-79.77549, 35.7086], [-79.77613, 35.70805], [-79.7802, 35.70486], [-79.78738, 35.69843], [-79.78772, 35.69808], [-79.78903, 35.69708], [-79.78981, 35.69657], [-79.79089, 35.69599], [-79.79206, 35.69547], [-79.79316, 35.69501], [-79.79326, 35.69502], [-79.80184, 35.69136], [-79.80534, 35.68999], [-79.80619, 35.68971], [-79.80855, 35.68912], [-79.81028, 35.68877], [-79.8127, 35.6885], [-79.82243, 35.68783], [-79.82396, 35.68763], [-79.82579, 35.68726], [-79.82681, 35.68693], [-79.82695, 35.68695], [-79.82828, 35.68649], [-79.83156, 35.68552], [-79.83272, 35.68536], [-79.8339, 35.68541], [-79.83455, 35.68553], [-79.83547, 35.68572], [-79.83839, 35.68646], [-79.83839, 35.68646], [-79.83756, 35.68511], [-79.83756, 35.68511], [-79.83938, 35.68449], [-79.84262, 35.68326], [-79.84802, 35.68135], [-79.84888, 35.68109], [-79.85096, 35.68027], [-79.85879, 35.67589], [-79.86197, 35.67435], [-79.86338, 35.67387], [-79.86477, 35.6735], [-79.86853, 35.67284], [-79.87019, 35.67247], [-79.87162, 35.67206], [-79.87273, 35.67165], [-79.88061, 35.66816], [-79.88259, 35.66741], [-79.88379, 35.66703], [-79.88912, 35.66593], [-79.89154, 35.66536], [-79.89275, 35.66496], [-79.91029, 35.65787], [-79.91856, 35.65488], [-79.92066, 35.65426], [-79.92266, 35.65387], [-79.92868, 35.65334], [-79.93073, 35.65301], [-79.93278, 35.65249], [-79.93622, 35.65115], [-79.94905, 35.646], [-79.95054, 35.64553], [-79.95211, 35.64512], [-79.95443, 35.6448], [-79.95897, 35.6443], [-79.96144, 35.64378], [-79.96281, 35.64331], [-79.96398, 35.64277], [-79.96698, 35.64108], [-79.96827, 35.64047], [-79.96984, 35.63995], [-79.97053, 35.63978], [-79.97241, 35.63946], [-79.97301, 35.6394], [-79.97405, 35.63939], [-79.97977, 35.63952], [-79.98106, 35.63946], [-79.99456, 35.63743], [-79.99559, 35.63724], [-79.99653, 35.63703], [-79.9971, 35.63683], [-79.99764, 35.63662], [-79.99881, 35.63605], [-79.99972, 35.63543], [-80.00057, 35.63467], [-80.00151, 35.6337], [-80.00561, 35.62604], [-80.00601, 35.62533], [-80.00657, 35.62456], [-80.0075, 35.6235], [-80.00828, 35.6227], [-80.01073, 35.61987], [-80.01768, 35.61204], [-80.01886, 35.61084], [-80.02012, 35.60973], [-80.02467, 35.60616], [-80.03078, 35.6015], [-80.03209, 35.60057], [-80.03358, 35.59967], [-80.03634, 35.5983], [-80.03713, 35.59788], [-80.03793, 35.59738], [-80.03913, 35.59655], [-80.04467, 35.59241], [-80.04671, 35.59111], [-80.05364, 35.58694], [-80.05655, 35.58508], [-80.05964, 35.58288], [-80.06417, 35.57974], [-80.0678, 35.57692], [-80.08174, 35.56575], [-80.08453, 35.56364], [-80.09, 35.55932], [-80.09076, 35.55864], [-80.10252, 35.54928], [-80.10319, 35.54865], [-80.10333, 35.54842], [-80.10483, 35.54682], [-80.10562, 35.54612], [-80.1061, 35.5458], [-80.10659, 35.54555], [-80.11281, 35.54354], [-80.11399, 35.54307], [-80.11468, 35.54264], [-80.11797, 35.53954], [-80.11866, 35.53902], [-80.11866, 35.53892], [-80.1212, 35.5365], [-80.12464, 35.53334], [-80.13174, 35.52648], [-80.1326, 35.52561], [-80.13367, 35.52437], [-80.13468, 35.52306], [-80.13654, 35.52081], [-80.13736, 35.51996], [-80.13858, 35.51898], [-80.14065, 35.51748], [-80.14457, 35.51474], [-80.14641, 35.51335], [-80.14761, 35.51273], [-80.14784, 35.51264], [-80.14869, 35.51245], [-80.14974, 35.51235], [-80.16021, 35.5122], [-80.17045, 35.51021], [-80.17461, 35.5093], [-80.17688, 35.50885], [-80.17707, 35.50889], [-80.18007, 35.50832], [-80.18084, 35.50812], [-80.18167, 35.50769], [-80.18631, 35.50445], [-80.18716, 35.50401], [-80.18871, 35.50354], [-80.19137, 35.50288], [-80.19153, 35.50278], [-80.19747, 35.50136], [-80.19828, 35.50108], [-80.19943, 35.50054], [-80.20036, 35.49997], [-80.2012, 35.49931], [-80.20546, 35.49522], [-80.20633, 35.49446], [-80.20757, 35.4937], [-80.20819, 35.4934], [-80.22635, 35.48599], [-80.2361, 35.48206], [-80.23853, 35.48123], [-80.23997, 35.4808], [-80.25437, 35.47701], [-80.25614, 35.47648], [-80.25816, 35.47578], [-80.26064, 35.47479], [-80.26827, 35.47113], [-80.26926, 35.47069], [-80.27032, 35.47028], [-80.27186, 35.46987], [-80.27353, 35.46959], [-80.28091, 35.46919], [-80.28423, 35.46905], [-80.28544, 35.46892], [-80.28704, 35.46866], [-80.28781, 35.46849], [-80.28937, 35.46806], [-80.31229, 35.46062], [-80.31376, 35.46022], [-80.31523, 35.45992], [-80.31707, 35.45968], [-80.33566, 35.45752], [-80.33662, 35.45738], [-80.33757, 35.45717], [-80.33842, 35.45696], [-80.33981, 35.45653], [-80.34066, 35.45621], [-80.34194, 35.45565], [-80.34368, 35.45475], [-80.36184, 35.44245], [-80.36316, 35.44167], [-80.36397, 35.44126], [-80.36592, 35.44046], [-80.36735, 35.43997], [-80.3694, 35.43951], [-80.37757, 35.43808], [-80.38182, 35.4374], [-80.38274, 35.43732], [-80.384, 35.43731], [-80.38846, 35.4376], [-80.38985, 35.43757], [-80.39097, 35.43745], [-80.39208, 35.43724], [-80.39338, 35.4369], [-80.39454, 35.43649], [-80.39547, 35.43606], [-80.3962, 35.43568], [-80.41672, 35.42337], [-80.4184, 35.42213], [-80.41954, 35.42109], [-80.42608, 35.41425], [-80.42703, 35.41347], [-80.42805, 35.4128], [-80.42905, 35.41226], [-80.43024, 35.41175], [-80.43196, 35.41122], [-80.43349, 35.41093], [-80.43442, 35.41083], [-80.44029, 35.41059], [-80.44232, 35.41043], [-80.44402, 35.41005], [-80.44537, 35.40961], [-80.47687, 35.39676], [-80.48378, 35.39354], [-80.4881, 35.39163], [-80.48894, 35.3913], [-80.49416, 35.38896], [-80.49841, 35.38695], [-80.49941, 35.38656], [-80.5001, 35.38639], [-80.50087, 35.38629], [-80.5192, 35.38528], [-80.52079, 35.38515], [-80.52223, 35.38486], [-80.5231, 35.38459], [-80.52405, 35.38422], [-80.52499, 35.38377], [-80.52584, 35.38325], [-80.52751, 35.38199], [-80.53259, 35.37783], [-80.53316, 35.37743], [-80.53384, 35.37706], [-80.53498, 35.37663], [-80.53612, 35.37635], [-80.54493, 35.37456], [-80.54604, 35.37437], [-80.54604, 35.37437], [-80.54629, 35.37438], [-80.54744, 35.3742], [-80.54838, 35.37412], [-80.54898, 35.37414], [-80.55071, 35.37446], [-80.55135, 35.37446], [-80.55135, 35.37446], [-80.55151, 35.37539], [-80.5515, 35.37566], [-80.55167, 35.37632], [-80.5519, 35.37688], [-80.55245, 35.37775], [-80.55306, 35.37842], [-80.55367, 35.37898], [-80.55454, 35.37956], [-80.55571, 35.38013], [-80.55667, 35.38045], [-80.55806, 35.3807], [-80.56322, 35.38136], [-80.56542, 35.38151], [-80.5748, 35.38112], [-80.57736, 35.38108], [-80.57815, 35.38112], [-80.57873, 35.3812], [-80.57992, 35.38145], [-80.5809, 35.38177], [-80.58098, 35.38187], [-80.58314, 35.38283], [-80.58411, 35.38332], [-80.58421, 35.38332], [-80.58549, 35.38394], [-80.58612, 35.38417], [-80.58711, 35.3844], [-80.59189, 35.38503], [-80.59249, 35.38517], [-80.59348, 35.38553], [-80.60327, 35.39093], [-80.60439, 35.39166], [-80.60506, 35.39228], [-80.6054, 35.39269], [-80.60582, 35.39336], [-80.60693, 35.39644], [-80.60693, 35.39644], [-80.60739, 35.39632], [-80.61074, 35.39586], [-80.61108, 35.39596], [-80.61123, 35.39609], [-80.61123, 35.39609], [-80.61244, 35.39568], [-80.61371, 35.39544], [-80.61603, 35.39511], [-80.61603, 35.39511], [-80.62518, 35.40051], [-80.62621, 35.40107], [-80.62711, 35.40144], [-80.62711, 35.40144], [-80.6274, 35.40148], [-80.628, 35.40146], [-80.63165, 35.40099], [-80.64086, 35.39871], [-80.64148, 35.39861], [-80.64447, 35.39843], [-80.64577, 35.3984], [-80.64925, 35.39863], [-80.65041, 35.39875], [-80.65101, 35.39878], [-80.65197, 35.39875], [-80.65742, 35.39831], [-80.65943, 35.39804], [-80.66011, 35.3979], [-80.66263, 35.39714], [-80.66346, 35.3968], [-80.66616, 35.39495], [-80.66651, 35.39475], [-80.66732, 35.39439], [-80.66854, 35.39393], [-80.66893, 35.39372], [-80.67052, 35.39243], [-80.67232, 35.39114], [-80.67232, 35.39114], [-80.67352, 35.39245], [-80.6738, 35.39284], [-80.67421, 35.39406], [-80.67429, 35.39459], [-80.67429, 35.39459], [-80.675, 35.39463], [-80.67537, 35.39478], [-80.67561, 35.395], [-80.67596, 35.39588], [-80.67648, 35.39668], [-80.6768, 35.39761], [-80.67698, 35.3979], [-80.67719, 35.39812], [-80.67719, 35.39812], [-80.6767, 35.39851], [-80.67636, 35.39866], [-80.67636, 35.39866], [-80.67662, 35.3993], [-80.67684, 35.39951], [-80.67699, 35.39959], [-80.6773, 35.39965], [-80.67982, 35.39982], [-80.68133, 35.40025], [-80.68164, 35.40043], [-80.68164, 35.40043], [-80.68129, 35.40107], [-80.68131, 35.40175], [-80.68125, 35.40211], [-80.6809, 35.40318], [-80.68092, 35.40359], [-80.68133, 35.40486], [-80.68133, 35.40486], [-80.68486, 35.40475], [-80.68915, 35.40417], [-80.68986, 35.40396], [-80.69314, 35.40241], [-80.69427, 35.40202], [-80.69556, 35.40178], [-80.69617, 35.40173], [-80.69686, 35.40172], [-80.69762, 35.40177], [-80.69845, 35.40189], [-80.69913, 35.40206], [-80.70393, 35.40368], [-80.71314, 35.40736], [-80.71716, 35.40911], [-80.71809, 35.4094], [-80.72187, 35.4098], [-80.72254, 35.40981], [-80.72326, 35.40966], [-80.72802, 35.40826], [-80.72892, 35.40821], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.72976, 35.40661], [-80.72956, 35.40612], [-80.72908, 35.40393], [-80.72912, 35.40332], [-80.72923, 35.40296], [-80.72939, 35.40268]]}, "date": "2012-03-12", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78501, 35.37401], [-80.78501, 35.37401], [-80.78493, 35.37402], [-80.78471, 35.37393], [-80.78345, 35.37329], [-80.78327, 35.37313], [-80.78319, 35.37294], [-80.78319, 35.37294], [-80.78269, 35.37283], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76413, 35.37375], [-80.76381, 35.3737], [-80.76228, 35.37364], [-80.76166, 35.37353], [-80.76079, 35.37315], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-03-13", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72865, 35.40114], [-80.73028, 35.40139], [-80.73028, 35.40139], [-80.73013, 35.40186], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.72892, 35.40821], [-80.72802, 35.40826], [-80.7229, 35.40976], [-80.7223, 35.40982], [-80.72187, 35.4098], [-80.71809, 35.4094], [-80.71772, 35.4093], [-80.71716, 35.40911], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.7117, 35.41006], [-80.71147, 35.41031], [-80.71023, 35.41139], [-80.71001, 35.41173], [-80.70982, 35.41217], [-80.70958, 35.4144], [-80.70914, 35.41998], [-80.70913, 35.42079], [-80.70932, 35.4215], [-80.71103, 35.42562], [-80.71151, 35.42623], [-80.71178, 35.42643], [-80.71209, 35.42663], [-80.71237, 35.42675], [-80.71375, 35.42715], [-80.71415, 35.42734], [-80.71627, 35.42868], [-80.71766, 35.42941], [-80.718, 35.42952], [-80.71963, 35.42982], [-80.72218, 35.43024], [-80.72277, 35.4304], [-80.72299, 35.43049], [-80.72329, 35.4307], [-80.72364, 35.43111], [-80.7238, 35.43138], [-80.72709, 35.43871], [-80.72779, 35.44124], [-80.72829, 35.44222], [-80.72956, 35.44443], [-80.72981, 35.44498], [-80.73005, 35.44569], [-80.73116, 35.45106], [-80.73178, 35.45356], [-80.73204, 35.455], [-80.73232, 35.4599], [-80.73239, 35.46039], [-80.73239, 35.46039], [-80.73192, 35.46179], [-80.7301, 35.46601], [-80.73, 35.46628], [-80.72993, 35.46673], [-80.73003, 35.4684], [-80.73073, 35.47428], [-80.73074, 35.47717], [-80.73053, 35.47774], [-80.73002, 35.47847], [-80.72737, 35.48121], [-80.72737, 35.48121], [-80.72712, 35.48104], [-80.72674, 35.48088], [-80.72635, 35.48077], [-80.72578, 35.4807], [-80.72384, 35.48068], [-80.7201, 35.48076], [-80.71857, 35.48073], [-80.71793, 35.48077], [-80.71668, 35.48107], [-80.71288, 35.48228], [-80.71197, 35.48253], [-80.71197, 35.48253], [-80.71212, 35.48275], [-80.71376, 35.4846], [-80.71392, 35.48495], [-80.71434, 35.48641], [-80.71455, 35.48695], [-80.71552, 35.48919], [-80.71587, 35.48972], [-80.71636, 35.4902], [-80.71727, 35.49087], [-80.72433, 35.49515], [-80.72491, 35.49553], [-80.7252, 35.49583], [-80.72522, 35.49599], [-80.72512, 35.49611], [-80.72426, 35.49639], [-80.72332, 35.49711], [-80.72308, 35.49716], [-80.7222, 35.49713], [-80.72111, 35.49738], [-80.72079, 35.49749], [-80.72053, 35.49764], [-80.72028, 35.49796], [-80.72023, 35.49817], [-80.72026, 35.49857], [-80.72091, 35.50204], [-80.72085, 35.50722], [-80.72085, 35.50722], [-80.72095, 35.51102], [-80.72076, 35.51262], [-80.71994, 35.51749], [-80.71985, 35.51861], [-80.71996, 35.52306], [-80.71992, 35.52714], [-80.72011, 35.53074], [-80.7201, 35.53143], [-80.72024, 35.53184], [-80.7214, 35.53365], [-80.72199, 35.53474], [-80.72249, 35.53616], [-80.72247, 35.53686], [-80.72229, 35.53768], [-80.72066, 35.54188], [-80.72013, 35.54382], [-80.72013, 35.54382], [-80.71714, 35.54435], [-80.71617, 35.54444], [-80.71303, 35.54451], [-80.71017, 35.54436], [-80.70919, 35.54426], [-80.70845, 35.54437], [-80.70689, 35.54477], [-80.70623, 35.545], [-80.70409, 35.54627], [-80.70184, 35.54724], [-80.7006, 35.54786], [-80.69996, 35.54823], [-80.69926, 35.54877], [-80.69885, 35.54916], [-80.69842, 35.54969], [-80.69796, 35.55039], [-80.69677, 35.55165], [-80.69406, 35.55412], [-80.69357, 35.55478], [-80.6932, 35.55545], [-80.69223, 35.55785], [-80.69154, 35.55874], [-80.69083, 35.55942], [-80.68902, 35.56071], [-80.68776, 35.56187], [-80.68718, 35.56256], [-80.68623, 35.56421], [-80.68359, 35.56943], [-80.68304, 35.57015], [-80.68093, 35.57231], [-80.68076, 35.57254], [-80.68076, 35.57254], [-80.68087, 35.57421], [-80.68073, 35.57475], [-80.67895, 35.579], [-80.67848, 35.58002], [-80.67784, 35.58115], [-80.67634, 35.58406], [-80.67584, 35.58454], [-80.67584, 35.58454], [-80.67506, 35.58511], [-80.67396, 35.5854], [-80.67304, 35.58547], [-80.6698, 35.58543], [-80.66837, 35.58567], [-80.66709, 35.58567], [-80.66534, 35.5863], [-80.66507, 35.58646], [-80.6647, 35.58682], [-80.66437, 35.58724], [-80.66417, 35.58739], [-80.66371, 35.58757], [-80.66105, 35.58775], [-80.66035, 35.58774], [-80.65812, 35.5873], [-80.65641, 35.58718], [-80.65565, 35.58718], [-80.6527, 35.58763], [-80.6527, 35.58763], [-80.65273, 35.58857], [-80.65327, 35.59368], [-80.65372, 35.59733], [-80.65379, 35.59857], [-80.65367, 35.6122], [-80.65364, 35.61312], [-80.65354, 35.61362], [-80.65334, 35.61426], [-80.65271, 35.61546], [-80.64453, 35.6292], [-80.64038, 35.63762], [-80.63831, 35.64166], [-80.63803, 35.64226], [-80.63778, 35.6432], [-80.63726, 35.64612], [-80.63716, 35.64686], [-80.6372, 35.64704], [-80.6372, 35.64704], [-80.63556, 35.64758], [-80.63468, 35.6477], [-80.61403, 35.64871], [-80.61361, 35.64876], [-80.61292, 35.64887], [-80.61246, 35.64899], [-80.61141, 35.64937], [-80.60984, 35.65023], [-80.60917, 35.6505], [-80.60825, 35.6507], [-80.60747, 35.65073], [-80.60498, 35.65068], [-80.60371, 35.65058], [-80.60168, 35.6503], [-80.60111, 35.65027], [-80.6001, 35.65029], [-80.59926, 35.65043], [-80.59803, 35.65076], [-80.59543, 35.65163], [-80.59442, 35.65199], [-80.59171, 35.65326], [-80.59088, 35.65358], [-80.59042, 35.6537], [-80.58962, 35.65388], [-80.58882, 35.65394], [-80.58789, 35.65392], [-80.58593, 35.6537], [-80.58593, 35.6537], [-80.58592, 35.65575], [-80.58566, 35.66328], [-80.58551, 35.66404], [-80.58425, 35.66831], [-80.58414, 35.6689], [-80.58398, 35.67186], [-80.58326, 35.67603], [-80.5831, 35.67638], [-80.58165, 35.67799], [-80.58143, 35.67846], [-80.58138, 35.67879], [-80.58132, 35.68435], [-80.58124, 35.68512], [-80.58086, 35.68621], [-80.58086, 35.68621], [-80.57986, 35.68637], [-80.56704, 35.68778], [-80.56655, 35.6878], [-80.56562, 35.68777], [-80.56426, 35.68753], [-80.56333, 35.68719], [-80.56186, 35.68652], [-80.56186, 35.68652], [-80.56176, 35.68904], [-80.56189, 35.69098], [-80.56209, 35.69245], [-80.56255, 35.69495], [-80.56258, 35.69578], [-80.56243, 35.69633], [-80.56064, 35.6988], [-80.55941, 35.70033], [-80.55719, 35.70326], [-80.55543, 35.7058], [-80.55543, 35.7058], [-80.55443, 35.70536], [-80.55384, 35.7052], [-80.55326, 35.7051], [-80.54783, 35.70477], [-80.54382, 35.70426], [-80.5432, 35.70414], [-80.5422, 35.70375], [-80.53373, 35.69957], [-80.52648, 35.69693], [-80.52563, 35.69668], [-80.51487, 35.69424], [-80.51487, 35.69424], [-80.51509, 35.69361], [-80.51509, 35.69361], [-80.51414, 35.69243], [-80.51325, 35.69196], [-80.51287, 35.6914], [-80.51233, 35.69031], [-80.51222, 35.69025], [-80.51205, 35.69025], [-80.51143, 35.69049], [-80.51143, 35.69049], [-80.51178, 35.69122]]}, "date": "2012-03-15", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72944, 35.40263], [-80.72918, 35.4031], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79428, 35.42758], [-80.7996, 35.43312], [-80.80167, 35.43512], [-80.80274, 35.43638], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80291, 35.43724], [-80.80286, 35.43748], [-80.80209, 35.43903], [-80.80199, 35.43932], [-80.80203, 35.43964], [-80.80255, 35.44072], [-80.80258, 35.44105], [-80.80246, 35.4415], [-80.8023, 35.44173], [-80.80188, 35.44207], [-80.80162, 35.44223], [-80.80083, 35.44253], [-80.80039, 35.44281], [-80.79874, 35.44451], [-80.79849, 35.44498], [-80.79682, 35.44892], [-80.79658, 35.4494], [-80.79601, 35.45024], [-80.79601, 35.45024], [-80.7967, 35.4507], [-80.80131, 35.4542], [-80.80201, 35.45462], [-80.80252, 35.45486], [-80.80252, 35.45486], [-80.80248, 35.45512], [-80.80255, 35.45548], [-80.80255, 35.45548], [-80.8019, 35.4561], [-80.8013, 35.45686], [-80.80091, 35.45718], [-80.7993, 35.45778], [-80.79892, 35.45788], [-80.7986, 35.4579], [-80.79796, 35.4578], [-80.79725, 35.4578], [-80.79607, 35.45794], [-80.79561, 35.45808], [-80.79484, 35.45842], [-80.79347, 35.45912], [-80.79187, 35.46022], [-80.79119, 35.46057], [-80.79083, 35.46068], [-80.79049, 35.46068], [-80.7902, 35.46056], [-80.79002, 35.46041], [-80.78961, 35.45976], [-80.78941, 35.45962], [-80.78887, 35.45958], [-80.78849, 35.45965], [-80.78713, 35.46014], [-80.78444, 35.46091], [-80.78392, 35.46096], [-80.78353, 35.46093], [-80.78317, 35.46084], [-80.78278, 35.46067], [-80.78235, 35.46033], [-80.78211, 35.46003], [-80.78173, 35.45908], [-80.78173, 35.45908], [-80.78093, 35.45929], [-80.78009, 35.4597], [-80.77975, 35.45992], [-80.77963, 35.46011], [-80.77934, 35.46216], [-80.77911, 35.46442], [-80.77914, 35.46472], [-80.77923, 35.46491], [-80.77953, 35.46526], [-80.77994, 35.46602], [-80.78114, 35.46795], [-80.78131, 35.46814], [-80.78193, 35.46861], [-80.78236, 35.4692], [-80.78294, 35.4695], [-80.78326, 35.46979], [-80.78408, 35.47125], [-80.78478, 35.473], [-80.78513, 35.47345], [-80.78513, 35.47345], [-80.78169, 35.47508], [-80.78129, 35.47516], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.77555, 35.47452], [-80.77496, 35.47451], [-80.77466, 35.47456], [-80.77385, 35.47479], [-80.77338, 35.47499], [-80.77129, 35.47627], [-80.77063, 35.47675], [-80.77051, 35.47695], [-80.77043, 35.47728], [-80.77029, 35.48141], [-80.77014, 35.48202], [-80.76692, 35.48734], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.75731, 35.48316], [-80.75679, 35.48229], [-80.75605, 35.48133], [-80.75561, 35.48089], [-80.75459, 35.48002], [-80.75185, 35.47785], [-80.7483, 35.4754], [-80.74705, 35.47439], [-80.74646, 35.47374], [-80.74394, 35.47036], [-80.7408, 35.46627], [-80.73887, 35.46342], [-80.73826, 35.46288], [-80.73723, 35.46219], [-80.73605, 35.46174], [-80.73293, 35.46071], [-80.73254, 35.46055], [-80.73239, 35.46039], [-80.73232, 35.4599], [-80.73204, 35.455], [-80.73178, 35.45356], [-80.73116, 35.45106], [-80.73005, 35.44569], [-80.72981, 35.44498], [-80.72956, 35.44443], [-80.72829, 35.44222], [-80.72779, 35.44124], [-80.72709, 35.43871], [-80.7238, 35.43138], [-80.72349, 35.4309], [-80.72299, 35.43049], [-80.72218, 35.43024], [-80.71963, 35.42982], [-80.718, 35.42952], [-80.71766, 35.42941], [-80.71627, 35.42868], [-80.71456, 35.42759], [-80.71387, 35.4272], [-80.71266, 35.42686], [-80.71209, 35.42663], [-80.71151, 35.42623], [-80.71103, 35.42562], [-80.70952, 35.42201], [-80.70926, 35.42133], [-80.70913, 35.42079], [-80.70914, 35.41998], [-80.70977, 35.41247], [-80.70992, 35.41192], [-80.71023, 35.41139], [-80.71147, 35.41031], [-80.7117, 35.41006], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.71716, 35.40911], [-80.71772, 35.4093], [-80.71809, 35.4094], [-80.72187, 35.4098], [-80.7223, 35.40982], [-80.7229, 35.40976], [-80.72802, 35.40826], [-80.72892, 35.40821], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.72976, 35.40661], [-80.72956, 35.40612], [-80.72908, 35.40393], [-80.72912, 35.40332], [-80.72923, 35.40296], [-80.72939, 35.40268]]}, "date": "2012-03-20", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78977, 35.38192], [-80.78905, 35.38232], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78586, 35.38513], [-80.78416, 35.3867], [-80.77943, 35.39042], [-80.7786, 35.39092], [-80.77556, 35.39213], [-80.77556, 35.39213], [-80.77503, 35.39166], [-80.77113, 35.38892], [-80.76918, 35.38759], [-80.76869, 35.38736], [-80.7676, 35.38716], [-80.76564, 35.38689], [-80.76521, 35.38686], [-80.76456, 35.3869], [-80.76378, 35.38712], [-80.76079, 35.38836], [-80.76018, 35.38853], [-80.75968, 35.38859], [-80.75927, 35.38859], [-80.75855, 35.38851], [-80.75789, 35.38828], [-80.75704, 35.38776], [-80.75664, 35.38732], [-80.75664, 35.38732], [-80.75512, 35.3881], [-80.75403, 35.38847], [-80.75355, 35.38855], [-80.75299, 35.38857], [-80.75129, 35.38849], [-80.75096, 35.38852], [-80.75016, 35.38874], [-80.75016, 35.38874], [-80.74955, 35.3877], [-80.74936, 35.38745], [-80.74917, 35.3873], [-80.74885, 35.38715], [-80.74856, 35.38708], [-80.74771, 35.38701], [-80.74716, 35.38692], [-80.74689, 35.38677], [-80.74671, 35.38659], [-80.74637, 35.38565], [-80.74569, 35.38468], [-80.74553, 35.38428], [-80.74554, 35.38408], [-80.74606, 35.38293], [-80.74609, 35.38274], [-80.74604, 35.38234], [-80.74587, 35.38206], [-80.74532, 35.38153], [-80.74514, 35.38118], [-80.74514, 35.38118], [-80.74515, 35.38104], [-80.74501, 35.38098], [-80.74489, 35.38105], [-80.74487, 35.38112], [-80.74446, 35.38125], [-80.74417, 35.38128], [-80.74362, 35.38123], [-80.74006, 35.38016], [-80.7396, 35.38007], [-80.73766, 35.37992], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-03-21", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75256, 35.42057], [-80.75294, 35.42086], [-80.7534, 35.42141], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.75628, 35.42376], [-80.75713, 35.42358], [-80.7578, 35.42352], [-80.75811, 35.42354], [-80.75839, 35.42362], [-80.75971, 35.42409], [-80.76016, 35.42421], [-80.7631, 35.42467], [-80.764, 35.42478], [-80.7644, 35.42474], [-80.76462, 35.42464], [-80.76747, 35.4226], [-80.76792, 35.42236], [-80.77201, 35.42084], [-80.77282, 35.42064], [-80.77335, 35.42061], [-80.77484, 35.42075], [-80.77551, 35.42084], [-80.77589, 35.42095], [-80.77666, 35.42129], [-80.77713, 35.42156], [-80.77754, 35.4219], [-80.77798, 35.4225], [-80.77821, 35.42269], [-80.77896, 35.42292], [-80.78116, 35.42347], [-80.78176, 35.42352], [-80.78718, 35.4232], [-80.7875, 35.42319], [-80.7879, 35.42324], [-80.78822, 35.42335], [-80.79105, 35.42488], [-80.79201, 35.42529], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80698, 35.37142], [-80.80677, 35.3708], [-80.80676, 35.37058], [-80.807, 35.36902], [-80.80689, 35.36846], [-80.80676, 35.36821], [-80.80606, 35.36751], [-80.80531, 35.36689], [-80.80434, 35.36553], [-80.80401, 35.36514], [-80.8035, 35.36483], [-80.80261, 35.36458], [-80.80218, 35.36438], [-80.80105, 35.36326], [-80.80062, 35.36265], [-80.80048, 35.36233], [-80.79995, 35.36032], [-80.79995, 35.36032], [-80.79743, 35.36106], [-80.79256, 35.36327], [-80.78935, 35.3644], [-80.7887, 35.3647], [-80.78749, 35.36537], [-80.78749, 35.36537], [-80.78754, 35.36569], [-80.7875, 35.36598], [-80.7873, 35.36639], [-80.78683, 35.36795], [-80.78572, 35.36951], [-80.78572, 35.36951], [-80.78456, 35.36876], [-80.78279, 35.36772], [-80.78234, 35.36764], [-80.7814, 35.36765], [-80.78109, 35.36755], [-80.78092, 35.36737], [-80.78059, 35.36674], [-80.7802, 35.36629], [-80.78004, 35.3662], [-80.7797, 35.36612], [-80.77551, 35.36575], [-80.77443, 35.36548], [-80.77298, 35.36531], [-80.77247, 35.36538], [-80.76979, 35.36604], [-80.76935, 35.36623], [-80.76785, 35.36709], [-80.76744, 35.36714], [-80.76591, 35.36699], [-80.76548, 35.36689], [-80.76493, 35.36658], [-80.76309, 35.36576], [-80.76279, 35.36555], [-80.76265, 35.36538], [-80.76204, 35.36368], [-80.7617, 35.36315], [-80.76137, 35.3628], [-80.76105, 35.36255], [-80.76022, 35.36206], [-80.75895, 35.361], [-80.75838, 35.36025], [-80.75806, 35.35883], [-80.7575, 35.35807], [-80.75734, 35.3577], [-80.75725, 35.35719], [-80.7572, 35.35573], [-80.75711, 35.35552], [-80.7569, 35.35532], [-80.7569, 35.35532], [-80.75642, 35.35627], [-80.75584, 35.35695], [-80.75314, 35.35892], [-80.75269, 35.35911], [-80.74949, 35.35954], [-80.74949, 35.35954], [-80.74897, 35.36103], [-80.74872, 35.36212], [-80.74846, 35.36343], [-80.74844, 35.36387], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-03-23", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73325, 35.40864], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74153, 35.41507], [-80.74153, 35.41507], [-80.741, 35.41553], [-80.741, 35.41553], [-80.7411, 35.41562], [-80.74167, 35.41518], [-80.74167, 35.41518], [-80.73984, 35.41359], [-80.73526, 35.41053], [-80.73379, 35.40906], [-80.73325, 35.40864], [-80.73263, 35.40842], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72969, 35.40648], [-80.72956, 35.40612], [-80.72945, 35.4055], [-80.72912, 35.40425], [-80.72908, 35.40376], [-80.72918, 35.4031], [-80.72939, 35.40268], [-80.72978, 35.40226]]}, "date": "2012-03-24", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.66288, 35.45129], [-80.66247, 35.45151], [-80.66246, 35.45165], [-80.66518, 35.45424], [-80.66556, 35.4547], [-80.66573, 35.45499], [-80.66573, 35.45499], [-80.66558, 35.45507], [-80.66445, 35.45622], [-80.66411, 35.45673], [-80.66389, 35.45721], [-80.66363, 35.45817], [-80.6636, 35.45874], [-80.66364, 35.45928], [-80.66379, 35.45991], [-80.66401, 35.46045], [-80.66442, 35.46113], [-80.66788, 35.46542], [-80.66973, 35.46783], [-80.66997, 35.46835], [-80.67019, 35.46912], [-80.67037, 35.47146], [-80.67057, 35.47234], [-80.67256, 35.47644], [-80.67285, 35.47734], [-80.67382, 35.48148], [-80.67384, 35.48234], [-80.67375, 35.48282], [-80.67273, 35.48582], [-80.67164, 35.48877], [-80.67139, 35.48993], [-80.67139, 35.48993], [-80.66997, 35.48957], [-80.66574, 35.48893], [-80.66574, 35.48893], [-80.66582, 35.48937], [-80.66603, 35.48983], [-80.66732, 35.49162], [-80.66782, 35.49245], [-80.66882, 35.49375], [-80.6705, 35.49643], [-80.67103, 35.49719], [-80.67167, 35.49778], [-80.67427, 35.49953], [-80.675, 35.50012], [-80.67543, 35.50064], [-80.67569, 35.50124], [-80.67576, 35.50174], [-80.67536, 35.50502], [-80.67537, 35.5057], [-80.67546, 35.50651], [-80.67546, 35.50651], [-80.67723, 35.50554], [-80.67815, 35.50522], [-80.67942, 35.505], [-80.68174, 35.5048], [-80.68501, 35.50429], [-80.68501, 35.50429], [-80.68404, 35.50083], [-80.6834, 35.49892], [-80.68315, 35.49846], [-80.68286, 35.49815], [-80.68243, 35.49797], [-80.68105, 35.49786], [-80.68022, 35.49774], [-80.67999, 35.49766], [-80.67965, 35.49748], [-80.67903, 35.49702], [-80.67858, 35.49657], [-80.67829, 35.49577], [-80.67802, 35.4946], [-80.67797, 35.494], [-80.67794, 35.49136], [-80.67789, 35.49096], [-80.67789, 35.49096], [-80.67733, 35.49105], [-80.67663, 35.49108], [-80.67561, 35.49098], [-80.67168, 35.49], [-80.67168, 35.49], [-80.67193, 35.48881], [-80.67378, 35.48357], [-80.67397, 35.48285], [-80.67408, 35.48202], [-80.67403, 35.48143], [-80.67306, 35.47712], [-80.67283, 35.47643], [-80.67129, 35.47322], [-80.67086, 35.47243], [-80.67069, 35.47194], [-80.67059, 35.47145], [-80.67042, 35.46914], [-80.67025, 35.46847], [-80.67002, 35.46791], [-80.66966, 35.46734], [-80.66882, 35.46621], [-80.66809, 35.46536], [-80.6676, 35.46466], [-80.66645, 35.46323], [-80.66569, 35.46239], [-80.66468, 35.4611], [-80.66421, 35.46035], [-80.66399, 35.45983], [-80.66387, 35.45938], [-80.66381, 35.45877], [-80.66384, 35.45828], [-80.66398, 35.45758], [-80.66446, 35.4566], [-80.66487, 35.45602], [-80.66487, 35.45602], [-80.66888, 35.45238], [-80.67001, 35.45124], [-80.67303, 35.44843], [-80.67385, 35.44772], [-80.67667, 35.44501], [-80.67812, 35.44324], [-80.67902, 35.44175], [-80.67947, 35.44081], [-80.68004, 35.4394], [-80.68004, 35.4394], [-80.68145, 35.43974], [-80.68217, 35.43997], [-80.68299, 35.44035], [-80.68395, 35.441], [-80.68395, 35.441], [-80.6836, 35.44175], [-80.68287, 35.44395], [-80.68273, 35.44445], [-80.68266, 35.44541], [-80.68339, 35.44929], [-80.68413, 35.45078], [-80.68594, 35.454], [-80.68638, 35.45485], [-80.68647, 35.45513], [-80.68715, 35.4592], [-80.68787, 35.46183], [-80.68787, 35.4622], [-80.68777, 35.46248], [-80.68717, 35.46356], [-80.68701, 35.46377], [-80.68688, 35.46385], [-80.68688, 35.46385], [-80.68587, 35.46252], [-80.68183, 35.45779], [-80.6777, 35.45461], [-80.67692, 35.45408], [-80.67393, 35.45236], [-80.67281, 35.45196], [-80.66977, 35.45119], [-80.66977, 35.45119], [-80.66677, 35.45405], [-80.66677, 35.45405], [-80.66596, 35.45477], [-80.66596, 35.45477], [-80.66556, 35.4547], [-80.66518, 35.45424], [-80.66246, 35.45165], [-80.66247, 35.45151], [-80.66285, 35.45131]]}, "date": "2012-03-25", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74541, 35.41836], [-80.74572, 35.41852], [-80.74572, 35.41852], [-80.74711, 35.41763], [-80.75152, 35.41452], [-80.75224, 35.41397], [-80.75258, 35.41364], [-80.75295, 35.41311], [-80.75351, 35.41216], [-80.75552, 35.40702], [-80.75588, 35.40632], [-80.75639, 35.40549], [-80.75699, 35.40481], [-80.75744, 35.4044], [-80.75998, 35.40249], [-80.76106, 35.40183], [-80.76106, 35.40183], [-80.76032, 35.40094], [-80.75992, 35.40059], [-80.75956, 35.4004], [-80.75877, 35.40014], [-80.75822, 35.39986], [-80.75749, 35.3992], [-80.75707, 35.39894], [-80.75504, 35.39795], [-80.75449, 35.39763], [-80.7536, 35.39685], [-80.75323, 35.39666], [-80.75276, 35.39655], [-80.75142, 35.39637], [-80.75086, 35.39625], [-80.75045, 35.39608], [-80.74982, 35.39571], [-80.74911, 35.39537], [-80.74704, 35.39472], [-80.74671, 35.39453], [-80.74625, 35.39409], [-80.74604, 35.39379], [-80.74587, 35.39336], [-80.74583, 35.39308], [-80.74592, 35.3924], [-80.74646, 35.39124], [-80.74669, 35.39084], [-80.74686, 35.39064], [-80.74738, 35.39027], [-80.74847, 35.38974], [-80.74964, 35.38898], [-80.75016, 35.38874], [-80.75096, 35.38852], [-80.75149, 35.38849], [-80.75299, 35.38857], [-80.75429, 35.38847], [-80.75516, 35.38819], [-80.75671, 35.38742], [-80.75671, 35.38742], [-80.7563, 35.38668], [-80.75565, 35.38518], [-80.75508, 35.38432], [-80.75413, 35.38323], [-80.75399, 35.38279], [-80.75402, 35.38243], [-80.75542, 35.37886], [-80.75563, 35.37846], [-80.75585, 35.37819], [-80.75632, 35.37781], [-80.75696, 35.37751], [-80.75735, 35.3774], [-80.75805, 35.37736], [-80.75844, 35.37739], [-80.75888, 35.3775], [-80.76196, 35.37867], [-80.76381, 35.37974], [-80.76381, 35.37974], [-80.76444, 35.37902], [-80.7651, 35.37744], [-80.76506, 35.3772], [-80.76489, 35.37696], [-80.76443, 35.37646], [-80.76395, 35.37603], [-80.7638, 35.3758], [-80.76374, 35.37527], [-80.76381, 35.3737], [-80.76381, 35.3737], [-80.76228, 35.37364], [-80.7615, 35.37348], [-80.76066, 35.37308], [-80.75893, 35.37207], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75591, 35.37084], [-80.75542, 35.37048], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-03-26", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.73029, 35.3936], [-80.73051, 35.39643], [-80.73066, 35.3974], [-80.73086, 35.39825], [-80.73088, 35.39884], [-80.73019, 35.40173], [-80.72999, 35.40205], [-80.72939, 35.40268], [-80.72923, 35.40296], [-80.7291, 35.40344], [-80.72908, 35.40393], [-80.72961, 35.40628], [-80.73004, 35.40709], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75654, 35.48194], [-80.75707, 35.48274], [-80.75871, 35.48597], [-80.75871, 35.48597], [-80.76024, 35.48539], [-80.76524, 35.48337], [-80.76614, 35.48306], [-80.76733, 35.48285], [-80.76771, 35.48283], [-80.76961, 35.48291], [-80.76961, 35.48291], [-80.77014, 35.48202], [-80.77025, 35.48167], [-80.77033, 35.48068], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77096, 35.47649], [-80.77351, 35.47492], [-80.77413, 35.4747], [-80.77496, 35.47451], [-80.77616, 35.47458], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78513, 35.47345], [-80.78513, 35.47345], [-80.78478, 35.473], [-80.78408, 35.47125], [-80.78326, 35.46979], [-80.78294, 35.4695], [-80.78236, 35.4692], [-80.78193, 35.46861], [-80.78131, 35.46814], [-80.78114, 35.46795], [-80.77994, 35.46602], [-80.77953, 35.46526], [-80.77923, 35.46491], [-80.77914, 35.46472], [-80.77911, 35.46442], [-80.77934, 35.46216], [-80.77963, 35.46011], [-80.77975, 35.45992], [-80.78009, 35.4597], [-80.78093, 35.45929], [-80.78173, 35.45908], [-80.78173, 35.45908], [-80.78211, 35.46003], [-80.78235, 35.46033], [-80.78278, 35.46067], [-80.78317, 35.46084], [-80.78353, 35.46093], [-80.78392, 35.46096], [-80.78444, 35.46091], [-80.78713, 35.46014], [-80.78849, 35.45965], [-80.78887, 35.45958], [-80.78941, 35.45962], [-80.78961, 35.45976], [-80.79002, 35.46041], [-80.7902, 35.46056], [-80.79049, 35.46068], [-80.79083, 35.46068], [-80.79119, 35.46057], [-80.79187, 35.46022], [-80.79347, 35.45912], [-80.79484, 35.45842], [-80.79561, 35.45808], [-80.79607, 35.45794], [-80.79725, 35.4578], [-80.79796, 35.4578], [-80.7986, 35.4579], [-80.79892, 35.45788], [-80.7993, 35.45778], [-80.80091, 35.45718], [-80.8013, 35.45686], [-80.8019, 35.4561], [-80.80255, 35.45548], [-80.80255, 35.45548], [-80.80249, 35.4552], [-80.80262, 35.45501], [-80.8028, 35.45496], [-80.8028, 35.45496], [-80.80201, 35.45462], [-80.80131, 35.4542], [-80.7967, 35.4507], [-80.79601, 35.45024], [-80.79601, 35.45024], [-80.79658, 35.4494], [-80.79682, 35.44892], [-80.79849, 35.44498], [-80.79874, 35.44451], [-80.80039, 35.44281], [-80.80083, 35.44253], [-80.80162, 35.44223], [-80.80188, 35.44207], [-80.8023, 35.44173], [-80.80246, 35.4415], [-80.80258, 35.44105], [-80.80255, 35.44072], [-80.80203, 35.43964], [-80.80199, 35.43932], [-80.80209, 35.43903], [-80.80286, 35.43748], [-80.80291, 35.43724], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79406, 35.42406], [-80.79483, 35.42324], [-80.79732, 35.42077], [-80.79863, 35.41961], [-80.79885, 35.41926], [-80.80057, 35.41562], [-80.80089, 35.41512], [-80.80186, 35.41438], [-80.8022, 35.41425], [-80.80461, 35.41366], [-80.80461, 35.41366], [-80.80471, 35.41173], [-80.80469, 35.41138], [-80.80462, 35.41114], [-80.80437, 35.41073], [-80.80356, 35.40982], [-80.80334, 35.40933], [-80.8031, 35.40852], [-80.80282, 35.40789], [-80.80251, 35.40739], [-80.80203, 35.40691], [-80.80179, 35.40653], [-80.80133, 35.4049], [-80.80126, 35.40431], [-80.80129, 35.40417], [-80.80147, 35.40387], [-80.80186, 35.40341], [-80.80349, 35.40201], [-80.80366, 35.40169], [-80.80368, 35.40065], [-80.8035, 35.3993], [-80.80238, 35.39644], [-80.80226, 35.39591], [-80.80234, 35.39557], [-80.80272, 35.3948], [-80.80313, 35.39375], [-80.80431, 35.39016], [-80.80459, 35.38905], [-80.80465, 35.38868], [-80.80463, 35.38838], [-80.80426, 35.38685], [-80.8042, 35.38641], [-80.80425, 35.3853], [-80.80437, 35.38469], [-80.80457, 35.3844], [-80.80485, 35.38417], [-80.80551, 35.38377], [-80.80646, 35.38332], [-80.80968, 35.38193], [-80.80989, 35.38181], [-80.80998, 35.38165], [-80.80999, 35.38137], [-80.80989, 35.38108], [-80.80877, 35.37857], [-80.80872, 35.37813], [-80.80881, 35.37619], [-80.80859, 35.37423], [-80.80839, 35.37338], [-80.80821, 35.37295], [-80.8077, 35.37243], [-80.80745, 35.37203], [-80.80745, 35.37203], [-80.80574, 35.37294], [-80.80313, 35.37445], [-80.7944, 35.3804], [-80.79396, 35.38059], [-80.78991, 35.38187], [-80.78948, 35.38206], [-80.78844, 35.38275], [-80.78813, 35.383], [-80.78686, 35.38424], [-80.78668, 35.38429], [-80.78668, 35.38429], [-80.78628, 35.38251], [-80.7859, 35.3803], [-80.78542, 35.37673], [-80.78482, 35.37283], [-80.78482, 35.37283], [-80.78339, 35.37296], [-80.78295, 35.3729], [-80.7817, 35.37251], [-80.78139, 35.37247], [-80.78075, 35.37251], [-80.77909, 35.37297], [-80.77405, 35.37449], [-80.77076, 35.37531], [-80.77037, 35.37537], [-80.77002, 35.37536], [-80.76961, 35.37529], [-80.76517, 35.37399], [-80.76413, 35.37375], [-80.76381, 35.3737], [-80.76241, 35.37365], [-80.76186, 35.37358], [-80.76125, 35.37338], [-80.76079, 35.37315], [-80.7582, 35.37169], [-80.75623, 35.371], [-80.75575, 35.37073], [-80.75496, 35.37006], [-80.75376, 35.36863], [-80.75176, 35.36689], [-80.74977, 35.36557], [-80.74935, 35.36524], [-80.74851, 35.36414], [-80.74851, 35.36414], [-80.74841, 35.36441], [-80.74807, 35.36734], [-80.74768, 35.36903], [-80.74752, 35.36956], [-80.74734, 35.36994], [-80.74705, 35.37032], [-80.74668, 35.37067], [-80.74567, 35.37137], [-80.74519, 35.37161], [-80.7433, 35.3722], [-80.74276, 35.37251], [-80.74218, 35.37306], [-80.74182, 35.37368], [-80.7397, 35.37996], [-80.7396, 35.38007], [-80.7396, 35.38007], [-80.73754, 35.37989], [-80.73724, 35.37978], [-80.7365, 35.3794], [-80.73565, 35.37884], [-80.73565, 35.37884], [-80.73496, 35.37958], [-80.73431, 35.38006], [-80.73298, 35.38066], [-80.73168, 35.38118], [-80.73056, 35.3817], [-80.72993, 35.38223], [-80.72947, 35.38294], [-80.72937, 35.38327], [-80.72904, 35.38526], [-80.72899, 35.38591], [-80.72911, 35.38634], [-80.72996, 35.38803], [-80.7302, 35.38882], [-80.73029, 35.39311]]}, "date": "2012-03-27", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76386, 35.44109], [-80.75953, 35.44138], [-80.74873, 35.4422], [-80.74757, 35.4422], [-80.74077, 35.44183], [-80.73907, 35.44168], [-80.73599, 35.4413], [-80.71472, 35.43856], [-80.71319, 35.43832], [-80.70981, 35.43753], [-80.7088, 35.43736], [-80.70755, 35.43728], [-80.70671, 35.43728], [-80.70461, 35.43741], [-80.70395, 35.43741], [-80.7034, 35.43738], [-80.70253, 35.43725], [-80.70253, 35.43725], [-80.70259, 35.43678], [-80.70244, 35.43408], [-80.70247, 35.43377], [-80.7039, 35.43077], [-80.70482, 35.42908], [-80.70551, 35.42677], [-80.70551, 35.42677], [-80.70495, 35.42666], [-80.70472, 35.42659], [-80.70449, 35.42646], [-80.70351, 35.42533], [-80.70326, 35.42513], [-80.70272, 35.42493], [-80.70188, 35.42477], [-80.70188, 35.42477], [-80.70207, 35.42401], [-80.70291, 35.41886], [-80.70312, 35.41831], [-80.7034, 35.4179], [-80.70426, 35.41721], [-80.70548, 35.41678], [-80.7063, 35.41639], [-80.7069, 35.41606], [-80.70758, 35.41552], [-80.70799, 35.41526], [-80.70958, 35.4144], [-80.70958, 35.4144], [-80.70977, 35.41247], [-80.70982, 35.41217], [-80.71001, 35.41173], [-80.71023, 35.41139], [-80.71147, 35.41031], [-80.7117, 35.41006], [-80.71334, 35.40745], [-80.71334, 35.40745], [-80.71716, 35.40911], [-80.71772, 35.4093], [-80.71809, 35.4094], [-80.72187, 35.4098], [-80.7223, 35.40982], [-80.7229, 35.40976], [-80.72802, 35.40826], [-80.72892, 35.40821], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.73004, 35.40709], [-80.72969, 35.40648], [-80.72956, 35.40612], [-80.72945, 35.4055], [-80.72912, 35.40425], [-80.72908, 35.40376], [-80.72918, 35.4031], [-80.72939, 35.40268], [-80.72978, 35.40226]]}, "date": "2012-03-28", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.7483, 35.4754], [-80.74736, 35.47467], [-80.74646, 35.47374], [-80.74646, 35.47374], [-80.74571, 35.47408], [-80.74504, 35.4743], [-80.74071, 35.4754], [-80.73951, 35.47559], [-80.73847, 35.47566], [-80.73744, 35.47567], [-80.73381, 35.4753], [-80.73306, 35.47509], [-80.73093, 35.4743], [-80.73073, 35.47428], [-80.73073, 35.47428], [-80.73077, 35.47686], [-80.73074, 35.47717], [-80.73062, 35.47756], [-80.73002, 35.47847], [-80.72737, 35.48121], [-80.72737, 35.48121], [-80.72712, 35.48104], [-80.72674, 35.48088], [-80.72635, 35.48077], [-80.72578, 35.4807], [-80.72384, 35.48068], [-80.7201, 35.48076], [-80.71857, 35.48073], [-80.71793, 35.48077], [-80.71668, 35.48107], [-80.71242, 35.48242], [-80.70905, 35.48315], [-80.70905, 35.48315], [-80.70913, 35.48341], [-80.70894, 35.48408], [-80.70794, 35.48598], [-80.70774, 35.4866], [-80.70737, 35.48863], [-80.70687, 35.49044], [-80.70653, 35.49275], [-80.70589, 35.49429], [-80.70537, 35.49572], [-80.70446, 35.49884], [-80.70443, 35.49934], [-80.70455, 35.50021], [-80.70447, 35.50041], [-80.70434, 35.50056], [-80.70356, 35.50107], [-80.70289, 35.50136], [-80.69995, 35.50199], [-80.69934, 35.50197], [-80.69807, 35.5016], [-80.69723, 35.50145], [-80.69669, 35.50147], [-80.69601, 35.50156], [-80.69414, 35.50191], [-80.68939, 35.50302], [-80.68742, 35.50362], [-80.68501, 35.50429], [-80.68501, 35.50429], [-80.68404, 35.50083], [-80.6834, 35.49892], [-80.68315, 35.49846], [-80.68286, 35.49815], [-80.68243, 35.49797], [-80.68105, 35.49786], [-80.68022, 35.49774], [-80.67999, 35.49766], [-80.67965, 35.49748], [-80.67903, 35.49702], [-80.67858, 35.49657], [-80.67829, 35.49577], [-80.67802, 35.4946], [-80.67797, 35.494], [-80.67794, 35.49136], [-80.67789, 35.49096], [-80.67789, 35.49096], [-80.67733, 35.49105], [-80.67663, 35.49108], [-80.67561, 35.49098], [-80.67168, 35.49], [-80.67168, 35.49], [-80.67193, 35.48881], [-80.67378, 35.48357], [-80.67397, 35.48285], [-80.67408, 35.48202], [-80.67403, 35.48143], [-80.67306, 35.47712], [-80.67283, 35.47643], [-80.67129, 35.47322], [-80.67086, 35.47243], [-80.67069, 35.47194], [-80.67059, 35.47145], [-80.67042, 35.46914], [-80.67025, 35.46847], [-80.67002, 35.46791], [-80.66966, 35.46734], [-80.66882, 35.46621], [-80.66809, 35.46536], [-80.6676, 35.46466], [-80.66645, 35.46323], [-80.66569, 35.46239], [-80.66468, 35.4611], [-80.66421, 35.46035], [-80.66399, 35.45983], [-80.66387, 35.45938], [-80.66381, 35.45877], [-80.66384, 35.45828], [-80.66398, 35.45758], [-80.66446, 35.4566], [-80.66487, 35.45602], [-80.66487, 35.45602], [-80.66888, 35.45238], [-80.67001, 35.45124], [-80.67303, 35.44843], [-80.67385, 35.44772], [-80.67667, 35.44501], [-80.67812, 35.44324], [-80.67902, 35.44175], [-80.67947, 35.44081], [-80.68004, 35.4394], [-80.68025, 35.43848], [-80.68028, 35.43818], [-80.68024, 35.43811], [-80.68043, 35.43723], [-80.6805, 35.43642], [-80.68052, 35.43498], [-80.68034, 35.43314], [-80.67877, 35.42615], [-80.67857, 35.4255], [-80.67736, 35.42331], [-80.67736, 35.42318], [-80.67555, 35.42096], [-80.67481, 35.42028], [-80.6742, 35.41983], [-80.67388, 35.41964], [-80.67375, 35.41959], [-80.67364, 35.41961], [-80.67303, 35.41927], [-80.67303, 35.41927], [-80.67148, 35.41836], [-80.67027, 35.41757], [-80.66937, 35.41675], [-80.6681, 35.41544], [-80.66777, 35.41504], [-80.66624, 35.41238], [-80.66624, 35.41238], [-80.6692, 35.41117], [-80.67312, 35.4089], [-80.6735, 35.40858]]}, "date": "2012-03-30", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.7483, 35.4754], [-80.74736, 35.47467], [-80.74646, 35.47374], [-80.74646, 35.47374], [-80.74571, 35.47408], [-80.74504, 35.4743], [-80.74071, 35.4754], [-80.73951, 35.47559], [-80.73847, 35.47566], [-80.73744, 35.47567], [-80.73381, 35.4753], [-80.73306, 35.47509], [-80.73093, 35.4743], [-80.73073, 35.47428], [-80.73073, 35.47428], [-80.73077, 35.47686], [-80.73074, 35.47717], [-80.73062, 35.47756], [-80.73002, 35.47847], [-80.72737, 35.48121], [-80.72737, 35.48121], [-80.72712, 35.48104], [-80.72674, 35.48088], [-80.72635, 35.48077], [-80.72578, 35.4807], [-80.72384, 35.48068], [-80.7201, 35.48076], [-80.71857, 35.48073], [-80.71793, 35.48077], [-80.71668, 35.48107], [-80.71242, 35.48242], [-80.70905, 35.48315], [-80.70905, 35.48315], [-80.70913, 35.48341], [-80.70894, 35.48408], [-80.70794, 35.48598], [-80.70774, 35.4866], [-80.70737, 35.48863], [-80.70687, 35.49044], [-80.70653, 35.49275], [-80.70589, 35.49429], [-80.70537, 35.49572], [-80.70446, 35.49884], [-80.70443, 35.49934], [-80.70455, 35.50021], [-80.70447, 35.50041], [-80.70434, 35.50056], [-80.70356, 35.50107], [-80.70289, 35.50136], [-80.69995, 35.50199], [-80.69934, 35.50197], [-80.69807, 35.5016], [-80.69723, 35.50145], [-80.69669, 35.50147], [-80.69601, 35.50156], [-80.69414, 35.50191], [-80.68939, 35.50302], [-80.68742, 35.50362], [-80.68501, 35.50429], [-80.68501, 35.50429], [-80.68404, 35.50083], [-80.6834, 35.49892], [-80.68315, 35.49846], [-80.68286, 35.49815], [-80.68243, 35.49797], [-80.68105, 35.49786], [-80.68022, 35.49774], [-80.67999, 35.49766], [-80.67965, 35.49748], [-80.67903, 35.49702], [-80.67858, 35.49657], [-80.67829, 35.49577], [-80.67802, 35.4946], [-80.67797, 35.494], [-80.67794, 35.49136], [-80.67789, 35.49096], [-80.67789, 35.49096], [-80.67733, 35.49105], [-80.67663, 35.49108], [-80.67561, 35.49098], [-80.67168, 35.49], [-80.67168, 35.49], [-80.67193, 35.48881], [-80.67378, 35.48357], [-80.67397, 35.48285], [-80.67408, 35.48202], [-80.67403, 35.48143], [-80.67306, 35.47712], [-80.67283, 35.47643], [-80.67129, 35.47322], [-80.67086, 35.47243], [-80.67069, 35.47194], [-80.67059, 35.47145], [-80.67042, 35.46914], [-80.67025, 35.46847], [-80.67002, 35.46791], [-80.66966, 35.46734], [-80.66882, 35.46621], [-80.66809, 35.46536], [-80.6676, 35.46466], [-80.66645, 35.46323], [-80.66569, 35.46239], [-80.66468, 35.4611], [-80.66421, 35.46035], [-80.66399, 35.45983], [-80.66387, 35.45938], [-80.66381, 35.45877], [-80.66384, 35.45828], [-80.66398, 35.45758], [-80.66446, 35.4566], [-80.66487, 35.45602], [-80.66487, 35.45602], [-80.66888, 35.45238], [-80.67001, 35.45124], [-80.67303, 35.44843], [-80.67385, 35.44772], [-80.67667, 35.44501], [-80.67812, 35.44324], [-80.67902, 35.44175], [-80.67947, 35.44081], [-80.68004, 35.4394], [-80.68025, 35.43848], [-80.68028, 35.43818], [-80.68024, 35.43811], [-80.68043, 35.43723], [-80.6805, 35.43642], [-80.68052, 35.43498], [-80.68034, 35.43314], [-80.67877, 35.42615], [-80.67857, 35.4255], [-80.67736, 35.42331], [-80.67736, 35.42318], [-80.67555, 35.42096], [-80.67481, 35.42028], [-80.6742, 35.41983], [-80.67388, 35.41964], [-80.67375, 35.41959], [-80.67364, 35.41961], [-80.67303, 35.41927], [-80.67303, 35.41927], [-80.67148, 35.41836], [-80.67027, 35.41757], [-80.66937, 35.41675], [-80.6681, 35.41544], [-80.66777, 35.41504], [-80.66624, 35.41238], [-80.66624, 35.41238], [-80.6692, 35.41117], [-80.67312, 35.4089], [-80.6735, 35.40858]]}, "date": "2012-03-31", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.91849, 35.51785], [-80.91832, 35.51756], [-80.91832, 35.51756], [-80.91902, 35.51734], [-80.91902, 35.51734], [-80.92117, 35.52427], [-80.92126, 35.52444], [-80.92189, 35.52498], [-80.92373, 35.52631], [-80.92506, 35.52712], [-80.92506, 35.52712], [-80.92376, 35.52832], [-80.92354, 35.5286], [-80.92336, 35.529], [-80.92292, 35.53117], [-80.92257, 35.53218], [-80.92209, 35.53317], [-80.92193, 35.53339], [-80.92116, 35.53423], [-80.9208, 35.53448], [-80.9208, 35.53448], [-80.92042, 35.53444], [-80.92013, 35.53459], [-80.92007, 35.53482], [-80.92018, 35.53507], [-80.91953, 35.53568], [-80.91937, 35.5359], [-80.91816, 35.53712], [-80.91768, 35.53774], [-80.91708, 35.53865], [-80.91699, 35.53889], [-80.91694, 35.53939], [-80.91725, 35.54242], [-80.9175, 35.54319], [-80.9177, 35.54356], [-80.91822, 35.54425], [-80.9186, 35.54469], [-80.92057, 35.54651], [-80.92143, 35.54737], [-80.92163, 35.54764], [-80.92326, 35.55075], [-80.92463, 35.55288], [-80.92475, 35.55321], [-80.92479, 35.5539], [-80.92458, 35.55452], [-80.9242, 35.55504], [-80.92265, 35.55629], [-80.92202, 35.5567], [-80.92114, 35.55753], [-80.92038, 35.55843], [-80.91896, 35.56039], [-80.91844, 35.56094], [-80.91766, 35.56161], [-80.91658, 35.56235], [-80.91541, 35.5629], [-80.91391, 35.56344], [-80.91227, 35.56396], [-80.91144, 35.5643], [-80.91072, 35.56466], [-80.90984, 35.56524], [-80.9092, 35.56579], [-80.90843, 35.56661], [-80.90762, 35.56762], [-80.90699, 35.56814], [-80.90631, 35.56851], [-80.90572, 35.56873], [-80.90504, 35.56889], [-80.90443, 35.56896], [-80.9038, 35.56899], [-80.90314, 35.56893], [-80.90149, 35.56849], [-80.9008, 35.56843], [-80.90011, 35.56846], [-80.89943, 35.56857], [-80.89909, 35.56865], [-80.89853, 35.56887], [-80.89787, 35.56937], [-80.89755, 35.56969], [-80.89601, 35.57213], [-80.89573, 35.57244], [-80.8954, 35.57268], [-80.89459, 35.57305], [-80.89162, 35.57395], [-80.89104, 35.57422], [-80.88943, 35.57518], [-80.88765, 35.57643], [-80.88599, 35.57814], [-80.88544, 35.57858], [-80.88469, 35.57909], [-80.88193, 35.58046], [-80.88131, 35.58073], [-80.87809, 35.58198], [-80.87615, 35.58254], [-80.87533, 35.58286], [-80.87486, 35.58314], [-80.8738, 35.58402], [-80.8738, 35.58402], [-80.87351, 35.58261], [-80.87341, 35.58235], [-80.87285, 35.58125], [-80.87278, 35.58119], [-80.87126, 35.57806], [-80.87025, 35.57617], [-80.86613, 35.56887], [-80.86601, 35.56849], [-80.86598, 35.5681], [-80.86614, 35.56612], [-80.86613, 35.56539], [-80.86542, 35.56164], [-80.86527, 35.56105], [-80.86512, 35.56071], [-80.86449, 35.55988], [-80.86308, 35.55826], [-80.8617, 35.55633], [-80.86117, 35.55572], [-80.86004, 35.55477], [-80.86001, 35.5547], [-80.85931, 35.55418], [-80.8574, 35.55315], [-80.8574, 35.55315], [-80.85679, 35.55276], [-80.85642, 35.5527], [-80.85612, 35.55271], [-80.85612, 35.55271], [-80.85596, 35.55264], [-80.85585, 35.55252], [-80.85586, 35.55229], [-80.85714, 35.55023], [-80.85784, 35.54894], [-80.85789, 35.54876], [-80.85787, 35.54834], [-80.85776, 35.54814], [-80.85739, 35.54785], [-80.85715, 35.54777], [-80.85689, 35.54774], [-80.85326, 35.54777], [-80.85093, 35.54774], [-80.84932, 35.54769], [-80.84809, 35.54759], [-80.84772, 35.54766], [-80.84682, 35.54808], [-80.84663, 35.5481], [-80.8461, 35.54802], [-80.8461, 35.54802], [-80.84655, 35.54634], [-80.8477, 35.54071], [-80.84789, 35.53926], [-80.84785, 35.53828], [-80.84777, 35.53781], [-80.84753, 35.5369], [-80.8386, 35.51319], [-80.83841, 35.51254], [-80.83836, 35.51177], [-80.83844, 35.51132], [-80.83878, 35.5105], [-80.83906, 35.51009], [-80.83961, 35.50944], [-80.8399, 35.50919], [-80.84038, 35.50888], [-80.84277, 35.50767], [-80.84334, 35.50722], [-80.84585, 35.50488], [-80.84621, 35.50434], [-80.84677, 35.50319], [-80.84848, 35.49926], [-80.84848, 35.49926], [-80.84537, 35.49862], [-80.84505, 35.49851], [-80.84426, 35.498], [-80.84174, 35.49611], [-80.84151, 35.49599], [-80.83693, 35.49456], [-80.83665, 35.49444], [-80.82061, 35.48452], [-80.81997, 35.48405], [-80.81997, 35.48405], [-80.81992, 35.4839], [-80.82006, 35.48347], [-80.81999, 35.47998], [-80.81993, 35.47907], [-80.81968, 35.47795], [-80.81968, 35.47795], [-80.82078, 35.47755], [-80.8237, 35.47559], [-80.82484, 35.47491], [-80.82484, 35.47491], [-80.82469, 35.47438], [-80.82487, 35.47399], [-80.82512, 35.4737], [-80.82599, 35.47322], [-80.82656, 35.47282], [-80.82699, 35.47259], [-80.82776, 35.47231], [-80.82807, 35.47226], [-80.82807, 35.47226], [-80.82827, 35.47184], [-80.82922, 35.47103], [-80.82941, 35.47076], [-80.82954, 35.47047], [-80.82957, 35.47024], [-80.82951, 35.46963], [-80.82951, 35.46963], [-80.82873, 35.46963], [-80.82841, 35.46957], [-80.82776, 35.46931], [-80.82473, 35.46763], [-80.82421, 35.46728], [-80.82295, 35.46631], [-80.822, 35.46556], [-80.82184, 35.46535], [-80.82161, 35.4649], [-80.82157, 35.46456], [-80.82161, 35.46418], [-80.82188, 35.46332], [-80.82188, 35.46307], [-80.82099, 35.46008], [-80.8208, 35.45901], [-80.82081, 35.45874], [-80.82114, 35.45733], [-80.82114, 35.45733], [-80.82191, 35.45736], [-80.82235, 35.45729], [-80.82292, 35.4571], [-80.82346, 35.45677], [-80.8248, 35.45557], [-80.82569, 35.45508], [-80.82569, 35.45508], [-80.82519, 35.45428], [-80.82478, 35.45344], [-80.82468, 35.4531], [-80.82448, 35.45284], [-80.82427, 35.45275], [-80.82243, 35.45225], [-80.82106, 35.45175], [-80.82032, 35.45139], [-80.81947, 35.45075], [-80.81947, 35.45075], [-80.81081, 35.45394], [-80.81071, 35.45393], [-80.80952, 35.45437], [-80.80952, 35.45437], [-80.80915, 35.45367], [-80.80883, 35.45325], [-80.80873, 35.45299], [-80.80874, 35.45266], [-80.80905, 35.45202], [-80.80909, 35.45169], [-80.80901, 35.45133], [-80.80835, 35.44964], [-80.8083, 35.44934], [-80.80843, 35.44883], [-80.8092, 35.44677], [-80.80935, 35.44614], [-80.80933, 35.44579], [-80.80882, 35.4434], [-80.80893, 35.44234], [-80.80915, 35.44185], [-80.80997, 35.44059], [-80.81098, 35.43885], [-80.81108, 35.43807], [-80.81127, 35.43767], [-80.81266, 35.43567], [-80.81266, 35.43567], [-80.81239, 35.43564], [-80.80952, 35.43566], [-80.80873, 35.43561], [-80.80834, 35.43552], [-80.80809, 35.43541], [-80.80764, 35.43509], [-80.80696, 35.43446], [-80.8058, 35.43394], [-80.80532, 35.43386], [-80.80441, 35.43388], [-80.80358, 35.43395], [-80.80358, 35.43395], [-80.80308, 35.43501], [-80.80302, 35.43527], [-80.80293, 35.43653], [-80.80293, 35.43653], [-80.80274, 35.43638], [-80.80167, 35.43512], [-80.7996, 35.43312], [-80.79428, 35.42758], [-80.79248, 35.42554], [-80.79248, 35.42554], [-80.79201, 35.42529], [-80.79105, 35.42488], [-80.78822, 35.42335], [-80.7879, 35.42324], [-80.7875, 35.42319], [-80.78718, 35.4232], [-80.78176, 35.42352], [-80.78116, 35.42347], [-80.77896, 35.42292], [-80.77821, 35.42269], [-80.77798, 35.4225], [-80.77754, 35.4219], [-80.77713, 35.42156], [-80.77666, 35.42129], [-80.77589, 35.42095], [-80.77551, 35.42084], [-80.77484, 35.42075], [-80.77335, 35.42061], [-80.77282, 35.42064], [-80.77201, 35.42084], [-80.76792, 35.42236], [-80.76747, 35.4226], [-80.76462, 35.42464], [-80.7644, 35.42474], [-80.764, 35.42478], [-80.7631, 35.42467], [-80.76016, 35.42421], [-80.75971, 35.42409], [-80.75839, 35.42362], [-80.75811, 35.42354], [-80.7578, 35.42352], [-80.75713, 35.42358], [-80.75628, 35.42376], [-80.75512, 35.42432], [-80.75512, 35.42432], [-80.7534, 35.42141], [-80.75294, 35.42086], [-80.75256, 35.42057], [-80.75208, 35.42031], [-80.75159, 35.42013], [-80.74601, 35.41862], [-80.74558, 35.41847], [-80.74309, 35.41645], [-80.74092, 35.4145], [-80.73984, 35.41359], [-80.73526, 35.41053], [-80.73379, 35.40906], [-80.73343, 35.40876], [-80.73307, 35.40855], [-80.73263, 35.40842], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73068, 35.40803], [-80.72976, 35.40661], [-80.72956, 35.40612], [-80.72908, 35.40393], [-80.72912, 35.40332], [-80.72923, 35.40296], [-80.72939, 35.40268]]}, "date": "2012-04-02", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-78.86458, 35.77229], [-78.86477, 35.77231], [-78.86508, 35.77242], [-78.86528, 35.77267], [-78.86534, 35.77284], [-78.86515, 35.77427], [-78.86518, 35.77466], [-78.86518, 35.77466], [-78.86468, 35.77476], [-78.86377, 35.77503], [-78.86301, 35.77503], [-78.86235, 35.77492], [-78.86197, 35.7749], [-78.86111, 35.77503], [-78.86066, 35.77501], [-78.86066, 35.77501], [-78.8603, 35.77647], [-78.85925, 35.77839], [-78.85908, 35.7797], [-78.85892, 35.7816], [-78.85857, 35.78253], [-78.858, 35.78368], [-78.85771, 35.784], [-78.85735, 35.7842], [-78.85676, 35.7843], [-78.85621, 35.78432], [-78.85621, 35.78432], [-78.85619, 35.78662], [-78.85621, 35.78693], [-78.8563, 35.78725], [-78.8565, 35.78761], [-78.85717, 35.78835], [-78.85741, 35.78853], [-78.85808, 35.78889], [-78.85823, 35.78916], [-78.85825, 35.7893], [-78.85825, 35.7893], [-78.859, 35.78915], [-78.86127, 35.78896], [-78.86666, 35.7888], [-78.86703, 35.78876], [-78.8676, 35.78865], [-78.86893, 35.78818], [-78.86977, 35.78798], [-78.87089, 35.7878], [-78.87089, 35.7878], [-78.87227, 35.78752], [-78.87393, 35.78728], [-78.8776, 35.78608], [-78.87933, 35.78524], [-78.8806, 35.78479], [-78.88142, 35.7846], [-78.88288, 35.78438], [-78.88417, 35.78398], [-78.88484, 35.78365], [-78.88691, 35.78221], [-78.88721, 35.78205], [-78.88749, 35.78196], [-78.89007, 35.78167], [-78.89207, 35.78121], [-78.89584, 35.78124], [-78.89912, 35.78121], [-78.8995, 35.78119], [-78.89991, 35.78108], [-78.89991, 35.78108], [-78.90001, 35.78116], [-78.90126, 35.78174], [-78.90172, 35.7819], [-78.90209, 35.78196], [-78.90369, 35.78203], [-78.90369, 35.78203], [-78.90366, 35.78617], [-78.9036, 35.78645], [-78.90336, 35.78696], [-78.90242, 35.78829], [-78.90208, 35.78893], [-78.90186, 35.78952], [-78.90052, 35.79486], [-78.89985, 35.79671], [-78.8997, 35.7973], [-78.89972, 35.79756], [-78.90027, 35.79892], [-78.90132, 35.801], [-78.90189, 35.8019], [-78.9025, 35.8025], [-78.9025, 35.8025], [-78.90249, 35.80257], [-78.90226, 35.80271], [-78.90183, 35.8028], [-78.90174, 35.80295], [-78.90236, 35.80682], [-78.90304, 35.80904], [-78.90331, 35.80972], [-78.90348, 35.81002], [-78.9035, 35.81041], [-78.9033, 35.81326], [-78.9024, 35.81723], [-78.90239, 35.82066], [-78.90223, 35.8223], [-78.90223, 35.8223], [-78.90241, 35.82225], [-78.90315, 35.82223], [-78.90722, 35.82252], [-78.909, 35.82322], [-78.90945, 35.82346], [-78.91059, 35.82446], [-78.9115, 35.82519], [-78.91192, 35.82551], [-78.91232, 35.82574], [-78.91283, 35.82594], [-78.91532, 35.8266], [-78.91564, 35.82689], [-78.91612, 35.82748], [-78.91612, 35.82748], [-78.91543, 35.82784], [-78.91519, 35.82804], [-78.91519, 35.82804], [-78.91564, 35.82833], [-78.91622, 35.82882], [-78.91664, 35.82898], [-78.91703, 35.82901], [-78.91854, 35.82869], [-78.91886, 35.82853], [-78.91937, 35.82849], [-78.92037, 35.8282], [-78.92062, 35.82807], [-78.92095, 35.82773], [-78.92095, 35.82773], [-78.92042, 35.82717], [-78.92028, 35.82685], [-78.92026, 35.82552], [-78.92026, 35.82552], [-78.91901, 35.82554], [-78.91871, 35.82561], [-78.91858, 35.82568], [-78.91782, 35.82643], [-78.91717, 35.82696], [-78.91668, 35.82717], [-78.91543, 35.82784], [-78.91511, 35.82811], [-78.91497, 35.82834], [-78.91458, 35.82948], [-78.91465, 35.82994], [-78.91512, 35.83084], [-78.91506, 35.83108], [-78.91494, 35.83127], [-78.91479, 35.83139], [-78.91397, 35.83172], [-78.91397, 35.83172], [-78.91503, 35.83354], [-78.91513, 35.83449], [-78.91508, 35.83473], [-78.91487, 35.83509], [-78.91463, 35.83528], [-78.91322, 35.83587], [-78.91276, 35.83625], [-78.91276, 35.83625], [-78.91199, 35.83593], [-78.91199, 35.83593], [-78.91103, 35.8377], [-78.91074, 35.83838], [-78.91063, 35.83884], [-78.91057, 35.8395], [-78.90967, 35.84299], [-78.90967, 35.84299], [-78.91058, 35.84306], [-78.91101, 35.84316], [-78.91167, 35.8434], [-78.9123, 35.84377], [-78.91283, 35.84422], [-78.91298, 35.84429], [-78.91323, 35.84454], [-78.91357, 35.84477], [-78.91387, 35.84494], [-78.9145, 35.84516], [-78.91495, 35.84524], [-78.91665, 35.84537], [-78.91849, 35.8458], [-78.91908, 35.8459], [-78.91966, 35.8459], [-78.92136, 35.84567], [-78.92187, 35.8457], [-78.92247, 35.84586], [-78.92451, 35.84681], [-78.9256, 35.84703], [-78.92615, 35.84706], [-78.92669, 35.84703], [-78.92723, 35.84689], [-78.92806, 35.8466], [-78.9284, 35.84655], [-78.92878, 35.84657], [-78.92914, 35.84666], [-78.93007, 35.84702], [-78.93051, 35.84724], [-78.93086, 35.8475], [-78.93207, 35.84882], [-78.93259, 35.84926], [-78.93309, 35.84953], [-78.93385, 35.84982], [-78.9345, 35.85014], [-78.9369, 35.85152], [-78.93731, 35.8518], [-78.93788, 35.85228], [-78.93856, 35.85305], [-78.93892, 35.8536], [-78.93917, 35.85409], [-78.94113, 35.85919], [-78.94133, 35.8598], [-78.94141, 35.86126], [-78.9416, 35.86185], [-78.94196, 35.86232], [-78.94308, 35.863], [-78.94352, 35.8634], [-78.94374, 35.86379], [-78.94412, 35.86507], [-78.94423, 35.86523], [-78.94423, 35.86523], [-78.94513, 35.8641], [-78.94595, 35.8632], [-78.94844, 35.86133], [-78.94881, 35.86099], [-78.94901, 35.86074], [-78.94935, 35.86016], [-78.95032, 35.85788], [-78.95078, 35.85704], [-78.95462, 35.85228], [-78.95627, 35.8497], [-78.95922, 35.84484], [-78.96218, 35.84124], [-78.96247, 35.8408], [-78.96304, 35.83969], [-78.96348, 35.83858], [-78.96362, 35.83774], [-78.9635, 35.83187], [-78.96351, 35.8309], [-78.96357, 35.83031], [-78.96387, 35.82912], [-78.96477, 35.82607], [-78.96494, 35.82503], [-78.96496, 35.82428], [-78.96475, 35.8206], [-78.96484, 35.81973], [-78.96512, 35.81862], [-78.96512, 35.81862], [-78.96047, 35.81851], [-78.95811, 35.81825], [-78.95757, 35.8183], [-78.95695, 35.81845], [-78.95627, 35.81878], [-78.9549, 35.81971], [-78.95135, 35.82139], [-78.95091, 35.82153], [-78.9488, 35.82198], [-78.9456, 35.82301], [-78.94525, 35.82319], [-78.94498, 35.82341], [-78.94405, 35.82469], [-78.94369, 35.82498], [-78.94342, 35.82511], [-78.94298, 35.82523], [-78.94253, 35.82525], [-78.94229, 35.82522], [-78.94229, 35.82522], [-78.94231, 35.82334], [-78.94222, 35.8214], [-78.94226, 35.82079], [-78.94247, 35.81949], [-78.943, 35.8169], [-78.9434, 35.81507], [-78.94365, 35.81421], [-78.94403, 35.8137], [-78.9442, 35.81357], [-78.94459, 35.81329], [-78.94682, 35.81195], [-78.94835, 35.81094], [-78.95097, 35.80882], [-78.95097, 35.80882], [-78.95081, 35.80862], [-78.9504, 35.80765], [-78.95019, 35.8073], [-78.94969, 35.80667], [-78.94923, 35.80635], [-78.94906, 35.80628], [-78.94808, 35.80608], [-78.94743, 35.80583], [-78.9471, 35.80564], [-78.94299, 35.80148], [-78.94247, 35.80087], [-78.942, 35.80003], [-78.94176, 35.79937], [-78.94017, 35.79431], [-78.94017, 35.79431], [-78.93954, 35.79435], [-78.93647, 35.79475], [-78.93547, 35.79479], [-78.93361, 35.79468], [-78.93095, 35.7944], [-78.93095, 35.7944], [-78.92961, 35.79409], [-78.92844, 35.79389], [-78.92588, 35.79361], [-78.92588, 35.79361], [-78.92612, 35.78966], [-78.92602, 35.78908], [-78.92584, 35.78875], [-78.92556, 35.78841], [-78.92409, 35.78717], [-78.92308, 35.78607], [-78.92276, 35.78541], [-78.92237, 35.78371], [-78.92219, 35.78308], [-78.92203, 35.78275], [-78.92182, 35.78252], [-78.9216, 35.78236], [-78.92041, 35.78185], [-78.91995, 35.78148], [-78.91974, 35.78115], [-78.91951, 35.78038], [-78.91932, 35.77925], [-78.91937, 35.77662], [-78.91926, 35.77515], [-78.91926, 35.77515], [-78.91709, 35.77589], [-78.91553, 35.77637], [-78.91326, 35.77695], [-78.90845, 35.77785], [-78.9074, 35.77801], [-78.90447, 35.77835], [-78.90405, 35.77845], [-78.9018, 35.77918], [-78.90132, 35.77938], [-78.90113, 35.77952], [-78.90096, 35.77973], [-78.90063, 35.7804], [-78.90033, 35.78082], [-78.90004, 35.78102], [-78.8996, 35.78117], [-78.89912, 35.78121], [-78.89584, 35.78124], [-78.89207, 35.78121], [-78.89007, 35.78167], [-78.88749, 35.78196], [-78.88721, 35.78205], [-78.88691, 35.78221], [-78.88484, 35.78365], [-78.88417, 35.78398], [-78.88288, 35.78438], [-78.88142, 35.7846], [-78.8806, 35.78479], [-78.87933, 35.78524], [-78.8776, 35.78608], [-78.87393, 35.78728], [-78.87147, 35.78766], [-78.87131, 35.78763], [-78.87071, 35.78769], [-78.87071, 35.78769], [-78.86933, 35.78796], [-78.86756, 35.78854], [-78.86702, 35.78864], [-78.8645, 35.78875], [-78.86127, 35.78883], [-78.85914, 35.789], [-78.85823, 35.78916], [-78.85823, 35.78916], [-78.85808, 35.78889], [-78.85741, 35.78853], [-78.85717, 35.78835], [-78.8565, 35.78761], [-78.8563, 35.78725], [-78.85621, 35.78693], [-78.85619, 35.78662], [-78.85621, 35.78432], [-78.85621, 35.78432], [-78.85676, 35.7843], [-78.85735, 35.7842], [-78.85771, 35.784], [-78.858, 35.78368], [-78.85857, 35.78253], [-78.85892, 35.7816], [-78.85908, 35.7797], [-78.85925, 35.77839], [-78.8603, 35.77647], [-78.86066, 35.77501], [-78.86066, 35.77501], [-78.86111, 35.77503], [-78.86197, 35.7749], [-78.86235, 35.77492], [-78.86301, 35.77503], [-78.86377, 35.77503], [-78.86468, 35.77476], [-78.86518, 35.77466], [-78.86518, 35.77466], [-78.86515, 35.77427], [-78.86534, 35.77302]]}, "date": "2012-04-04", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-78.86478, 35.77231], [-78.8646, 35.77229], [-78.86425, 35.77234], [-78.86367, 35.77256], [-78.86367, 35.77256], [-78.86385, 35.77294], [-78.86397, 35.77334], [-78.86396, 35.77424], [-78.8642, 35.77491], [-78.8642, 35.77491], [-78.86377, 35.77503], [-78.86301, 35.77503], [-78.86235, 35.77492], [-78.86197, 35.7749], [-78.86111, 35.77503], [-78.86066, 35.77501], [-78.86066, 35.77501], [-78.86096, 35.7736], [-78.86101, 35.77303], [-78.861, 35.77243], [-78.86082, 35.77153], [-78.86068, 35.77118], [-78.86047, 35.77088], [-78.85953, 35.77002], [-78.85922, 35.76963], [-78.85903, 35.76927], [-78.85897, 35.76905], [-78.85886, 35.76752], [-78.85886, 35.76752], [-78.86188, 35.76741], [-78.86265, 35.7673], [-78.863, 35.76721], [-78.86347, 35.76701], [-78.86557, 35.7658], [-78.86594, 35.76569], [-78.86651, 35.76565], [-78.86899, 35.76573], [-78.86938, 35.76572], [-78.86978, 35.76561], [-78.87045, 35.76524], [-78.87098, 35.76472], [-78.87188, 35.76324], [-78.87213, 35.76268], [-78.87242, 35.76227], [-78.87269, 35.76203], [-78.8731, 35.7618], [-78.87427, 35.76124], [-78.87479, 35.76076], [-78.87479, 35.76076], [-78.87525, 35.76098], [-78.8757, 35.76102], [-78.8757, 35.76102], [-78.87834, 35.76081], [-78.8796, 35.76067], [-78.88245, 35.76027], [-78.88274, 35.76018], [-78.88676, 35.75782], [-78.88834, 35.75677], [-78.88934, 35.75602], [-78.89035, 35.7555], [-78.89131, 35.75518], [-78.89226, 35.75499], [-78.89358, 35.75491], [-78.89449, 35.75498], [-78.8963, 35.7552], [-78.89732, 35.75524], [-78.89792, 35.7552], [-78.89835, 35.75512], [-78.89958, 35.7548], [-78.90031, 35.75448], [-78.90223, 35.75345], [-78.90263, 35.75328], [-78.903, 35.75304], [-78.90513, 35.75084], [-78.90563, 35.7505], [-78.90645, 35.75015], [-78.90955, 35.74952], [-78.90955, 35.74952], [-78.91068, 35.75144], [-78.9109, 35.7517], [-78.91117, 35.75192], [-78.91153, 35.75215], [-78.91259, 35.75267], [-78.91279, 35.75273], [-78.9138, 35.75325], [-78.91637, 35.75481], [-78.91677, 35.75512], [-78.91709, 35.75548], [-78.91785, 35.75662], [-78.9192, 35.75909], [-78.9195, 35.75954], [-78.91972, 35.75976], [-78.92115, 35.76082], [-78.92251, 35.76206], [-78.92316, 35.76273], [-78.92398, 35.76398], [-78.92467, 35.76538], [-78.92641, 35.76699], [-78.92676, 35.76745], [-78.92712, 35.76814], [-78.92721, 35.76844], [-78.92721, 35.76867], [-78.92711, 35.76902], [-78.92715, 35.76915], [-78.9271, 35.76954], [-78.92709, 35.77055], [-78.92726, 35.77153], [-78.92729, 35.77248], [-78.92735, 35.77264], [-78.92735, 35.77264], [-78.92661, 35.77287], [-78.92497, 35.77322], [-78.91709, 35.77589], [-78.91553, 35.77637], [-78.91326, 35.77695], [-78.90845, 35.77785], [-78.9074, 35.77801], [-78.90447, 35.77835], [-78.90405, 35.77845], [-78.9018, 35.77918], [-78.90132, 35.77938], [-78.90113, 35.77952], [-78.90096, 35.77973], [-78.90063, 35.7804], [-78.90033, 35.78082], [-78.90004, 35.78102], [-78.8996, 35.78117], [-78.89912, 35.78121], [-78.89584, 35.78124], [-78.89207, 35.78121], [-78.89007, 35.78167], [-78.88749, 35.78196], [-78.88721, 35.78205], [-78.88691, 35.78221], [-78.88484, 35.78365], [-78.88417, 35.78398], [-78.88288, 35.78438], [-78.88142, 35.7846], [-78.8806, 35.78479], [-78.87933, 35.78524], [-78.8776, 35.78608], [-78.87393, 35.78728], [-78.87147, 35.78766], [-78.87131, 35.78763], [-78.8709, 35.78767], [-78.8709, 35.78767], [-78.87117, 35.78573], [-78.87117, 35.78573], [-78.87045, 35.78569], [-78.87015, 35.78563], [-78.86978, 35.78544], [-78.86966, 35.78533], [-78.86957, 35.78499], [-78.86963, 35.78484], [-78.86994, 35.78442], [-78.8699, 35.78419], [-78.8699, 35.78419], [-78.86931, 35.78439], [-78.86855, 35.78477], [-78.86828, 35.78477], [-78.8681, 35.78472], [-78.86786, 35.78453], [-78.86781, 35.78433], [-78.86787, 35.78412], [-78.86799, 35.78396], [-78.86923, 35.78352], [-78.86947, 35.78336], [-78.86987, 35.78293], [-78.86999, 35.78271], [-78.87003, 35.78242], [-78.87005, 35.78158], [-78.87039, 35.78063], [-78.87033, 35.78022], [-78.87021, 35.78], [-78.86956, 35.77931], [-78.86905, 35.77905], [-78.86808, 35.77869], [-78.86765, 35.77843], [-78.86751, 35.77823], [-78.86748, 35.77806], [-78.8676, 35.77773], [-78.8676, 35.77773], [-78.86717, 35.77746], [-78.86717, 35.77746], [-78.86727, 35.7772], [-78.86728, 35.77657], [-78.86715, 35.77631], [-78.86682, 35.77604], [-78.86642, 35.77558], [-78.86631, 35.77539], [-78.86625, 35.77517], [-78.86627, 35.77465], [-78.86627, 35.77465], [-78.86518, 35.77466], [-78.86518, 35.77466], [-78.86515, 35.77427], [-78.86534, 35.77284], [-78.86528, 35.77267], [-78.86508, 35.77242], [-78.86487, 35.77234]]}, "date": "2012-04-07", "type": "Feature"}, {"geometry": {"type": "LineString", "coordinates": [[-80.72939, 35.40268], [-80.72923, 35.40296], [-80.72912, 35.40332], [-80.72908, 35.40393], [-80.72956, 35.40612], [-80.72976, 35.40661], [-80.73068, 35.40803], [-80.73078, 35.40827], [-80.73078, 35.40827], [-80.73263, 35.40842], [-80.73307, 35.40855], [-80.73343, 35.40876], [-80.73379, 35.40906], [-80.73526, 35.41053], [-80.73984, 35.41359], [-80.74092, 35.4145], [-80.74309, 35.41645], [-80.74558, 35.41847], [-80.74601, 35.41862], [-80.75159, 35.42013], [-80.75208, 35.42031], [-80.75277, 35.42072], [-80.75314, 35.42107], [-80.75352, 35.42159], [-80.75726, 35.42794], [-80.75893, 35.42995], [-80.75928, 35.43016], [-80.75977, 35.43028], [-80.75977, 35.43028], [-80.76035, 35.43043], [-80.7609, 35.43069], [-80.7615, 35.43114], [-80.76222, 35.43187], [-80.76251, 35.43225], [-80.76261, 35.43246], [-80.76266, 35.43278], [-80.76265, 35.43332], [-80.76279, 35.43377], [-80.76308, 35.43413], [-80.76379, 35.43464], [-80.76412, 35.43503], [-80.76434, 35.43565], [-80.76441, 35.4362], [-80.76453, 35.43788], [-80.76452, 35.4382], [-80.76442, 35.43866], [-80.76442, 35.43866], [-80.76392, 35.43969], [-80.76382, 35.4401], [-80.76386, 35.44109], [-80.76401, 35.44217], [-80.76426, 35.44283], [-80.7658, 35.4448], [-80.76597, 35.44519], [-80.76602, 35.44555], [-80.76596, 35.44596], [-80.76568, 35.44642], [-80.76487, 35.44716], [-80.76418, 35.44801], [-80.76401, 35.44829], [-80.76397, 35.44856], [-80.76409, 35.44928], [-80.76409, 35.44955], [-80.76402, 35.45106], [-80.76393, 35.4515], [-80.76371, 35.45188], [-80.76308, 35.45271], [-80.76264, 35.45402], [-80.76246, 35.45445], [-80.76209, 35.4551], [-80.76173, 35.45558], [-80.76115, 35.45618], [-80.75998, 35.45718], [-80.75959, 35.45762], [-80.75939, 35.45793], [-80.75932, 35.45819], [-80.75922, 35.45922], [-80.75855, 35.46121], [-80.75779, 35.46275], [-80.75738, 35.46478], [-80.75633, 35.46824], [-80.75619, 35.46857], [-80.75016, 35.47668], [-80.75016, 35.47668], [-80.75134, 35.47748], [-80.75278, 35.47857], [-80.75522, 35.48055], [-80.75605, 35.48133], [-80.75679, 35.48229], [-80.75731, 35.48316], [-80.76001, 35.48856], [-80.76001, 35.48856], [-80.76471, 35.49024], [-80.76471, 35.49024], [-80.76692, 35.48734], [-80.77014, 35.48202], [-80.77029, 35.48141], [-80.77043, 35.47728], [-80.77051, 35.47695], [-80.77063, 35.47675], [-80.77129, 35.47627], [-80.77338, 35.47499], [-80.77385, 35.47479], [-80.77466, 35.47456], [-80.77496, 35.47451], [-80.77555, 35.47452], [-80.78021, 35.47508], [-80.78021, 35.47508], [-80.78108, 35.47516], [-80.7814, 35.47515], [-80.78169, 35.47508], [-80.78513, 35.47345], [-80.78513, 35.47345], [-80.78519, 35.47351], [-80.7864, 35.47851], [-80.78655, 35.47896], [-80.78812, 35.48223], [-80.7884, 35.48261], [-80.78921, 35.48339], [-80.78938, 35.48364], [-80.78949, 35.48391], [-80.78954, 35.48437], [-80.78947, 35.48534], [-80.78953, 35.4857], [-80.78968, 35.48607], [-80.79059, 35.48729], [-80.79077, 35.48762], [-80.79088, 35.48799], [-80.7909, 35.48831], [-80.79088, 35.48957], [-80.79096, 35.48994], [-80.79114, 35.49034], [-80.79134, 35.49062], [-80.7917, 35.49097], [-80.7953, 35.49395], [-80.79562, 35.4943], [-80.79582, 35.4946], [-80.79609, 35.49521], [-80.79621, 35.49579], [-80.7962, 35.49629], [-80.79592, 35.49782], [-80.79587, 35.49837], [-80.79602, 35.50063], [-80.79599, 35.5009], [-80.79449, 35.50359], [-80.79435, 35.50407], [-80.79431, 35.50461], [-80.79454, 35.50565], [-80.79477, 35.50604], [-80.79503, 35.50628], [-80.79549, 35.50658], [-80.79666, 35.50716], [-80.79666, 35.50716], [-80.79725, 35.50738], [-80.79769, 35.5078], [-80.79829, 35.50874], [-80.79861, 35.50931], [-80.79867, 35.5095], [-80.79874, 35.50979], [-80.79878, 35.51058], [-80.79874, 35.51356], [-80.79877, 35.51507], [-80.79935, 35.51739], [-80.79929, 35.5179], [-80.799, 35.5188], [-80.79879, 35.51977], [-80.79866, 35.52057], [-80.79863, 35.5211], [-80.79874, 35.52158], [-80.7994, 35.52291], [-80.79947, 35.52326], [-80.79942, 35.5237], [-80.79915, 35.52421], [-80.79729, 35.52663], [-80.79716, 35.52693], [-80.79719, 35.52724], [-80.79829, 35.52956], [-80.7995, 35.5326], [-80.79983, 35.53326], [-80.80225, 35.53698], [-80.80457, 35.53976], [-80.80494, 35.54027], [-80.80513, 35.54095], [-80.80551, 35.54362], [-80.80582, 35.54477], [-80.80634, 35.54573], [-80.80817, 35.54838], [-80.80955, 35.55208], [-80.81046, 35.55502], [-80.81067, 35.55536], [-80.81132, 35.55612], [-80.81156, 35.55655], [-80.81249, 35.55928], [-80.81396, 35.56333], [-80.81468, 35.56476], [-80.81597, 35.56692], [-80.8168, 35.5688], [-80.81707, 35.56952], [-80.81707, 35.56952], [-80.81784, 35.57139], [-80.81799, 35.57249], [-80.81806, 35.57268], [-80.81822, 35.57294], [-80.81879, 35.57421], [-80.81888, 35.57425], [-80.81888, 35.57425], [-80.81921, 35.5742], [-80.82115, 35.57283], [-80.82115, 35.57283], [-80.82285, 35.57432], [-80.82285, 35.57432], [-80.81815, 35.57825], [-80.81815, 35.57825], [-80.81952, 35.57942], [-80.8209, 35.58055], [-80.8211, 35.58067], [-80.8213, 35.58074], [-80.82422, 35.58122], [-80.8275, 35.58121], [-80.82801, 35.58115], [-80.82841, 35.58103], [-80.82968, 35.58032], [-80.82987, 35.58026], [-80.8303, 35.58026], [-80.8309, 35.58037], [-80.83136, 35.58035], [-80.83236, 35.5801], [-80.83443, 35.57967], [-80.83733, 35.57974], [-80.83816, 35.57956], [-80.83962, 35.57906], [-80.84025, 35.57906], [-80.84025, 35.57906], [-80.84154, 35.57907], [-80.84187, 35.57901], [-80.84249, 35.57878], [-80.84303, 35.57836], [-80.84359, 35.57759], [-80.84378, 35.57741], [-80.84417, 35.57716], [-80.84447, 35.57704], [-80.84495, 35.57694], [-80.84639, 35.57685], [-80.84674, 35.57688], [-80.84716, 35.57696], [-80.84775, 35.57723], [-80.84841, 35.57763], [-80.84929, 35.57828], [-80.84989, 35.57858], [-80.8531, 35.57947], [-80.85407, 35.57978], [-80.85518, 35.57985], [-80.85953, 35.57979], [-80.8603, 35.5799], [-80.8609, 35.58007], [-80.86129, 35.58022], [-80.86159, 35.58039], [-80.86168, 35.58052], [-80.86373, 35.58233], [-80.8645, 35.58291], [-80.86673, 35.58403], [-80.86765, 35.58443], [-80.86807, 35.58456], [-80.86869, 35.58468], [-80.86959, 35.58474], [-80.87014, 35.58471], [-80.87311, 35.58437], [-80.87382, 35.5841], [-80.87503, 35.58314], [-80.87539, 35.58293], [-80.87596, 35.5827], [-80.87813, 35.58206], [-80.88136, 35.58081], [-80.88218, 35.58044], [-80.88441, 35.57932], [-80.88474, 35.57914], [-80.88605, 35.57817], [-80.88751, 35.57667], [-80.8881, 35.5762], [-80.88894, 35.5756], [-80.89069, 35.57454], [-80.89166, 35.57404], [-80.89369, 35.57345], [-80.89496, 35.57303], [-80.89554, 35.57274], [-80.8958, 35.57256], [-80.89615, 35.57217], [-80.89744, 35.57011], [-80.89781, 35.56961], [-80.89845, 35.5691], [-80.89894, 35.56886], [-80.89945, 35.56868], [-80.89991, 35.56858], [-80.90085, 35.56854], [-80.90128, 35.56858], [-80.90302, 35.56902], [-80.90389, 35.56911], [-80.90427, 35.5691], [-80.90485, 35.56905], [-80.90555, 35.56891], [-80.90636, 35.56863], [-80.9068, 35.5684], [-80.9074, 35.56799], [-80.90793, 35.56751], [-80.90884, 35.56639], [-80.90942, 35.56578], [-80.90999, 35.56531], [-80.91072, 35.5648], [-80.91133, 35.56447], [-80.91168, 35.56433], [-80.91396, 35.56357], [-80.916, 35.56277], [-80.91696, 35.56227], [-80.91774, 35.56174], [-80.91867, 35.56089], [-80.91923, 35.56028], [-80.92049, 35.5585], [-80.9211, 35.55774], [-80.92151, 35.55732], [-80.92258, 35.5564], [-80.92265, 35.55629], [-80.9242, 35.55504], [-80.92458, 35.55452], [-80.92471, 35.55423], [-80.92479, 35.5539], [-80.9248, 35.55355], [-80.92475, 35.55321], [-80.92463, 35.55288], [-80.92326, 35.55075], [-80.92163, 35.54764], [-80.92143, 35.54737], [-80.92057, 35.54651], [-80.9186, 35.54469], [-80.91822, 35.54425], [-80.9177, 35.54356], [-80.9175, 35.54319], [-80.91725, 35.54242], [-80.91694, 35.53939], [-80.91699, 35.53889], [-80.91708, 35.53865], [-80.91768, 35.53774], [-80.9185, 35.53674], [-80.91929, 35.53597], [-80.91962, 35.53574], [-80.92027, 35.53513], [-80.92027, 35.53513], [-80.92046, 35.53518], [-80.92066, 35.53517], [-80.92079, 35.53513], [-80.92092, 35.53502], [-80.92099, 35.53482], [-80.92088, 35.53455], [-80.92102, 35.53435], [-80.92171, 35.53367], [-80.92209, 35.53317], [-80.92267, 35.53196], [-80.92284, 35.53146], [-80.92342, 35.52883], [-80.92376, 35.52832], [-80.92506, 35.52712], [-80.92506, 35.52712], [-80.92373, 35.52631], [-80.92189, 35.52498], [-80.92126, 35.52444], [-80.92117, 35.52427], [-80.91902, 35.51734], [-80.91902, 35.51734], [-80.91832, 35.51756], [-80.91832, 35.51756], [-80.91849, 35.51785]]}, "date": "2012-04-09", "type": "Feature"}]} diff --git a/vendor/phayes/geophp/tests/input/pentagon.kml b/vendor/phayes/geophp/tests/input/pentagon.kml new file mode 100644 index 0000000..bdc85e3 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/pentagon.kml @@ -0,0 +1,34 @@ + + + + The Pentagon + + 1 + relativeToGround + + + + -77.05788457660967,38.87253259892824,100 + -77.05465973756702,38.87291016281703,100 + -77.05315536854791,38.87053267794386,100 + -77.05552622493516,38.868757801256,100 + -77.05844056290393,38.86996206506943,100 + -77.05788457660967,38.87253259892824,100 + + + + + + + -77.05668055019126,38.87154239798456,100 + -77.05542625960818,38.87167890344077,100 + -77.05485125901024,38.87076535397792,100 + -77.05577677433152,38.87008686581446,100 + -77.05691162017543,38.87054446963351,100 + -77.05668055019126,38.87154239798456,100 + + + + + + diff --git a/vendor/phayes/geophp/tests/input/point.georss b/vendor/phayes/geophp/tests/input/point.georss new file mode 100644 index 0000000..3b83276 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/point.georss @@ -0,0 +1,21 @@ + + + Earthquakes + International earthquake observation labs + + 2005-12-13T18:30:02Z + + Dr. Thaddeus Remor + tremor@quakelab.edu + + urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 + + M 3.2, Mona Passage + + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + 2005-08-17T07:02:32Z + We just had a big one. + 45.256 -71.92 + + \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/point.kml b/vendor/phayes/geophp/tests/input/point.kml new file mode 100644 index 0000000..f95894f --- /dev/null +++ b/vendor/phayes/geophp/tests/input/point.kml @@ -0,0 +1,11 @@ + + + + Simple placemark + Attached to the ground. Intelligently places itself + at the height of the underlying terrain. + + -122.0822035425683,37.42228990140251,0 + + + diff --git a/vendor/phayes/geophp/tests/input/point.wkt b/vendor/phayes/geophp/tests/input/point.wkt new file mode 100644 index 0000000..b3be821 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/point.wkt @@ -0,0 +1 @@ +POINT (10 12) diff --git a/vendor/phayes/geophp/tests/input/polygon.georss b/vendor/phayes/geophp/tests/input/polygon.georss new file mode 100644 index 0000000..14f54d1 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/polygon.georss @@ -0,0 +1,3 @@ + + 45.256 -110.45 46.46 -109.48 43.84 -109.86 45.256 -110.45 + diff --git a/vendor/phayes/geophp/tests/input/polygon.wkt b/vendor/phayes/geophp/tests/input/polygon.wkt new file mode 100644 index 0000000..dc9bcab --- /dev/null +++ b/vendor/phayes/geophp/tests/input/polygon.wkt @@ -0,0 +1 @@ +POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10)) diff --git a/vendor/phayes/geophp/tests/input/polygon2.wkt b/vendor/phayes/geophp/tests/input/polygon2.wkt new file mode 100644 index 0000000..4a75c84 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/polygon2.wkt @@ -0,0 +1 @@ +POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10), (20 30, 35 35, 30 20, 20 30)) diff --git a/vendor/phayes/geophp/tests/input/polygon3.wkt b/vendor/phayes/geophp/tests/input/polygon3.wkt new file mode 100644 index 0000000..ac5e500 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/polygon3.wkt @@ -0,0 +1 @@ +POLYGON ((-123.222653196 49.1529676585, -89.4726531957 49.3823707987, -81.0351531957 44.0875828344, -71.1914031957 44.3395630636, -62.0507781957 48.4583498573, -60.2929656957 45.0890334085, -78.9257781957 37.4399716272, -82.0898406957 31.3536343332, -81.3867156957 26.4312253295, -91.9335906957 29.8406412505, -98.2617156957 26.4312253295, -107.753903196 32.2499718728, -116.894528196 33.1375486348, -122.519528196 36.0313293064, -126.035153196 42.2935619329, -123.222653196 49.1529676585)) diff --git a/vendor/phayes/geophp/tests/input/polygon4.wkt b/vendor/phayes/geophp/tests/input/polygon4.wkt new file mode 100644 index 0000000..a713e7d --- /dev/null +++ b/vendor/phayes/geophp/tests/input/polygon4.wkt @@ -0,0 +1 @@ +POLYGON((4.8352495472368009 52.3561217600921438,4.8354139113045580 52.3561243429663534,4.8356082266282945 52.3561267417385281,4.8358010085903622 52.3561273083083663,4.8358010085903622 52.3561273083083663,4.8358035242637225 52.3559935212917722,4.8363777606561538 52.3559985348227173,4.8365863082998608 52.3560003600829731,4.8365523717335313 52.3570990145454189,4.8365884597636066 52.3572643433297529,4.8366320506970659 52.3574639095218686,4.8366736405531485 52.3576544056339870,4.8367264446828226 52.3578947700094304,4.8367922739966023 52.3581940807800450,4.8368228816936947 52.3583326871276356,4.8368228816936947 52.3583326871276356,4.8346348012064322 52.3583075969840550,4.8346348012064322 52.3583075969840550,4.8346348010943823 52.3583076059723282,4.8346348010943823 52.3583076059723282,4.8344931735728114 52.3583059732702338,4.8343773230572911 52.3583046496785585,4.8342182417472204 52.3583028092031384,4.8340047277034000 52.3583004442080195,4.8340047277034000 52.3583004442080195,4.8340047286008216 52.3583003723016063,4.8340047286008216 52.3583003723016063,4.8333843154510516 52.3582932434377639,4.8333843154510516 52.3582932434377639,4.8333915914677918 52.3580669388087898,4.8333968982183286 52.3578913129544787,4.8334415565569193 52.3563602568407660,4.8336003450092706 52.3563614767834267,4.8336013166539615 52.3563318721204567,4.8336013166539615 52.3563318721204567,4.8339582156582548 52.3563361223319603,4.8339656498645338 52.3561015845598732,4.8340692910524092 52.3561032110135258,4.8340692910524092 52.3561032110135258,4.8345511248958477 52.3561107854074095,4.8345511248958477 52.3561107854074095,4.8345513450958055 52.3561107864365809,4.8345513450958055 52.3561107864365809,4.8346742584771087 52.3561127181661092,4.8346742584771087 52.3561127181661092,4.8347750227755597 52.3561143035917596,4.8347750227755597 52.3561143035917596,4.8352495472368009 52.3561217600921438)) diff --git a/vendor/phayes/geophp/tests/input/polygon_spaces.wkt b/vendor/phayes/geophp/tests/input/polygon_spaces.wkt new file mode 100644 index 0000000..5511136 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/polygon_spaces.wkt @@ -0,0 +1,2 @@ + + POLYGON ((30 10 , 10 20 , 20 40 , 40 40 , 30 10 )) diff --git a/vendor/phayes/geophp/tests/input/route.gpx b/vendor/phayes/geophp/tests/input/route.gpx new file mode 100644 index 0000000..aa6354c --- /dev/null +++ b/vendor/phayes/geophp/tests/input/route.gpx @@ -0,0 +1,4749 @@ + + + + + Chris Archer + + + + Endomondo + + + + + + http://www.endomondo.com/ + + endomondo + + MOUNTAIN_BIKING + + + + + + 121.0 + + + + 121.0 + + + + 122.0 + + + + 122.0 + + + + 122.0 + + + + 123.0 + + + + 124.0 + + + + 130.0 + + + + 131.0 + + + + 131.0 + + + + 132.0 + + + + 131.0 + + + + 132.0 + + + + 129.0 + + + + 130.0 + + + + 125.0 + + + + 122.0 + + + + 127.0 + + + + 137.0 + + + + 138.0 + + + + 137.0 + + + + 133.0 + + + + 134.0 + + + + 140.0 + + + + 145.0 + + + + 137.0 + + + + 134.0 + + + + 143.0 + + + + 147.0 + + + + 141.0 + + + + 137.0 + + + + 132.0 + + + + 131.0 + + + + 136.0 + + + + 141.0 + + + + 135.0 + + + + 143.0 + + + + 149.0 + + + + 150.0 + + + + 150.0 + + + + 155.0 + + + + 160.0 + + + + 166.0 + + + + 156.0 + + + + 152.0 + + + + 160.0 + + + + 158.0 + + + + 154.0 + + + + 152.0 + + + + 153.0 + + + + 154.0 + + + + 161.0 + + + + 158.0 + + + + 154.0 + + + + 153.0 + + + + 159.0 + + + + 154.0 + + + + 154.0 + + + + 159.0 + + + + 155.0 + + + + 158.0 + + + + 166.0 + + + + 161.0 + + + + 152.0 + + + + 153.0 + + + + 161.0 + + + + 155.0 + + + + 158.0 + + + + 160.0 + + + + 165.0 + + + + 161.0 + + + + 163.0 + + + + 163.0 + + + + 160.0 + + + + 165.0 + + + + 166.0 + + + + 174.0 + + + + 171.0 + + + + 173.0 + + + + 175.0 + + + + 169.0 + + + + 170.0 + + + + 174.0 + + + + 174.0 + + + + 175.0 + + + + 172.0 + + + + 171.0 + + + + 170.0 + + + + 169.0 + + + + 172.0 + + + + 178.0 + + + + 174.0 + + + + 179.0 + + + + 187.0 + + + + 180.0 + + + + 181.0 + + + + 179.0 + + + + 184.0 + + + + 181.0 + + + + 180.0 + + + + 181.0 + + + + 178.0 + + + + 180.0 + + + + 177.0 + + + + 187.0 + + + + 188.0 + + + + 189.0 + + + + 191.0 + + + + 189.0 + + + + 190.0 + + + + 183.0 + + + + 189.0 + + + + 186.0 + + + + 193.0 + + + + 190.0 + + + + 186.0 + + + + 192.0 + + + + 190.0 + + + + 194.0 + + + + 195.0 + + + + 203.0 + + + + 205.0 + + + + 208.0 + + + + 205.0 + + + + 212.0 + + + + 215.0 + + + + 220.0 + + + + 223.0 + + + + 222.0 + + + + 222.0 + + + + 229.0 + + + + 230.0 + + + + 227.0 + + + + 226.0 + + + + 225.0 + + + + 222.0 + + + + 219.0 + + + + 222.0 + + + + 219.0 + + + + 218.0 + + + + 219.0 + + + + 223.0 + + + + 227.0 + + + + 222.0 + + + + 224.0 + + + + 225.0 + + + + 230.0 + + + + 229.0 + + + + 231.0 + + + + 230.0 + + + + 233.0 + + + + 234.0 + + + + 236.0 + + + + 232.0 + + + + 232.0 + + + + 226.0 + + + + 227.0 + + + + 223.0 + + + + 220.0 + + + + 219.0 + + + + 217.0 + + + + 217.0 + + + + 211.0 + + + + 210.0 + + + + 204.0 + + + + 204.0 + + + + 196.0 + + + + 195.0 + + + + 194.0 + + + + 185.0 + + + + 187.0 + + + + 186.0 + + + + 189.0 + + + + 183.0 + + + + 180.0 + + + + 188.0 + + + + 178.0 + + + + 178.0 + + + + 177.0 + + + + 175.0 + + + + 178.0 + + + + 158.0 + + + + 169.0 + + + + 168.0 + + + + 159.0 + + + + 160.0 + + + + 157.0 + + + + 154.0 + + + + 151.0 + + + + 147.0 + + + + 143.0 + + + + 146.0 + + + + 147.0 + + + + 147.0 + + + + 149.0 + + + + 146.0 + + + + 146.0 + + + + 152.0 + + + + 146.0 + + + + 146.0 + + + + 150.0 + + + + 137.0 + + + + 145.0 + + + + 146.0 + + + + 148.0 + + + + 149.0 + + + + 143.0 + + + + 151.0 + + + + 153.0 + + + + 152.0 + + + + 150.0 + + + + 151.0 + + + + 153.0 + + + + 155.0 + + + + 155.0 + + + + 155.0 + + + + 158.0 + + + + 162.0 + + + + 167.0 + + + + 170.0 + + + + 165.0 + + + + 170.0 + + + + 171.0 + + + + 172.0 + + + + 173.0 + + + + 176.0 + + + + 173.0 + + + + 177.0 + + + + 176.0 + + + + 177.0 + + + + 173.0 + + + + 174.0 + + + + 174.0 + + + + 177.0 + + + + 178.0 + + + + 178.0 + + + + 175.0 + + + + 182.0 + + + + 184.0 + + + + 185.0 + + + + 181.0 + + + + 182.0 + + + + 184.0 + + + + 183.0 + + + + 185.0 + + + + 189.0 + + + + 195.0 + + + + 196.0 + + + + 194.0 + + + + 196.0 + + + + 196.0 + + + + 195.0 + + + + 194.0 + + + + 203.0 + + + + 197.0 + + + + 205.0 + + + + 205.0 + + + + 204.0 + + + + 206.0 + + + + 204.0 + + + + 209.0 + + + + 205.0 + + + + 209.0 + + + + 208.0 + + + + 206.0 + + + + 200.0 + + + + 199.0 + + + + 203.0 + + + + 212.0 + + + + 206.0 + + + + 206.0 + + + + 208.0 + + + + 215.0 + + + + 218.0 + + + + 218.0 + + + + 216.0 + + + + 214.0 + + + + 216.0 + + + + 214.0 + + + + 221.0 + + + + 219.0 + + + + 221.0 + + + + 216.0 + + + + 216.0 + + + + 217.0 + + + + 222.0 + + + + 224.0 + + + + 226.0 + + + + 226.0 + + + + 231.0 + + + + 231.0 + + + + 225.0 + + + + 228.0 + + + + 231.0 + + + + 228.0 + + + + 225.0 + + + + 225.0 + + + + 229.0 + + + + 231.0 + + + + 241.0 + + + + 237.0 + + + + 237.0 + + + + 236.0 + + + + 240.0 + + + + 237.0 + + + + 244.0 + + + + 243.0 + + + + 243.0 + + + + 236.0 + + + + 240.0 + + + + 240.0 + + + + 242.0 + + + + 237.0 + + + + 234.0 + + + + 229.0 + + + + 234.0 + + + + 222.0 + + + + 236.0 + + + + 237.0 + + + + 238.0 + + + + 236.0 + + + + 233.0 + + + + 225.0 + + + + 233.0 + + + + 232.0 + + + + 233.0 + + + + 234.0 + + + + 234.0 + + + + 228.0 + + + + 229.0 + + + + 233.0 + + + + 233.0 + + + + 235.0 + + + + 237.0 + + + + 238.0 + + + + 240.0 + + + + 235.0 + + + + 231.0 + + + + 230.0 + + + + 238.0 + + + + 236.0 + + + + 237.0 + + + + 237.0 + + + + 231.0 + + + + 232.0 + + + + 232.0 + + + + 235.0 + + + + 239.0 + + + + 243.0 + + + + 245.0 + + + + 243.0 + + + + 236.0 + + + + 233.0 + + + + 235.0 + + + + 243.0 + + + + 245.0 + + + + 239.0 + + + + 240.0 + + + + 246.0 + + + + 242.0 + + + + 243.0 + + + + 250.0 + + + + 240.0 + + + + 242.0 + + + + 241.0 + + + + 243.0 + + + + 235.0 + + + + 236.0 + + + + 239.0 + + + + 235.0 + + + + 233.0 + + + + 244.0 + + + + 248.0 + + + + 245.0 + + + + 248.0 + + + + 247.0 + + + + 251.0 + + + + 251.0 + + + + 248.0 + + + + 246.0 + + + + 247.0 + + + + 249.0 + + + + 249.0 + + + + 254.0 + + + + 242.0 + + + + 238.0 + + + + 239.0 + + + + 235.0 + + + + 249.0 + + + + 247.0 + + + + 240.0 + + + + 246.0 + + + + 254.0 + + + + 256.0 + + + + 260.0 + + + + 258.0 + + + + 263.0 + + + + 261.0 + + + + 264.0 + + + + 267.0 + + + + 262.0 + + + + 259.0 + + + + 259.0 + + + + 262.0 + + + + 263.0 + + + + 270.0 + + + + 269.0 + + + + 267.0 + + + + 273.0 + + + + 272.0 + + + + 271.0 + + + + 273.0 + + + + 271.0 + + + + 269.0 + + + + 264.0 + + + + 268.0 + + + + 270.0 + + + + 272.0 + + + + 280.0 + + + + 277.0 + + + + 277.0 + + + + 275.0 + + + + 278.0 + + + + 283.0 + + + + 283.0 + + + + 280.0 + + + + 278.0 + + + + 278.0 + + + + 272.0 + + + + 278.0 + + + + 281.0 + + + + 276.0 + + + + 279.0 + + + + 288.0 + + + + 288.0 + + + + 295.0 + + + + 285.0 + + + + 290.0 + + + + 281.0 + + + + 285.0 + + + + 287.0 + + + + 290.0 + + + + 287.0 + + + + 292.0 + + + + 290.0 + + + + 289.0 + + + + 298.0 + + + + 289.0 + + + + 285.0 + + + + 287.0 + + + + 279.0 + + + + 294.0 + + + + 289.0 + + + + 286.0 + + + + 295.0 + + + + 295.0 + + + + 297.0 + + + + 299.0 + + + + 295.0 + + + + 294.0 + + + + 296.0 + + + + 293.0 + + + + 299.0 + + + + 298.0 + + + + 299.0 + + + + 305.0 + + + + 301.0 + + + + 297.0 + + + + 292.0 + + + + 295.0 + + + + 298.0 + + + + 302.0 + + + + 307.0 + + + + 313.0 + + + + 316.0 + + + + 316.0 + + + + 316.0 + + + + 312.0 + + + + 314.0 + + + + 300.0 + + + + 306.0 + + + + 299.0 + + + + 308.0 + + + + 310.0 + + + + 308.0 + + + + 310.0 + + + + 311.0 + + + + 312.0 + + + + 321.0 + + + + 293.0 + + + + 303.0 + + + + 293.0 + + + + 294.0 + + + + 297.0 + + + + 293.0 + + + + 304.0 + + + + 302.0 + + + + 295.0 + + + + 296.0 + + + + 288.0 + + + + 294.0 + + + + 297.0 + + + + 298.0 + + + + 306.0 + + + + 303.0 + + + + 299.0 + + + + 282.0 + + + + 293.0 + + + + 309.0 + + + + 309.0 + + + + 301.0 + + + + 295.0 + + + + 294.0 + + + + 291.0 + + + + 289.0 + + + + 290.0 + + + + 291.0 + + + + 297.0 + + + + 293.0 + + + + 286.0 + + + + 278.0 + + + + 278.0 + + + + 279.0 + + + + 264.0 + + + + 245.0 + + + + 250.0 + + + + 249.0 + + + + 252.0 + + + + 250.0 + + + + 250.0 + + + + 253.0 + + + + 249.0 + + + + 263.0 + + + + 271.0 + + + + 258.0 + + + + 263.0 + + + + 262.0 + + + + 266.0 + + + + 260.0 + + + + 260.0 + + + + 265.0 + + + + 260.0 + + + + 258.0 + + + + 253.0 + + + + 255.0 + + + + 249.0 + + + + 250.0 + + + + 247.0 + + + + 247.0 + + + + 247.0 + + + + 248.0 + + + + 248.0 + + + + 252.0 + + + + 249.0 + + + + 249.0 + + + + 248.0 + + + + 247.0 + + + + 252.0 + + + + 251.0 + + + + 252.0 + + + + 256.0 + + + + 261.0 + + + + 257.0 + + + + 260.0 + + + + 260.0 + + + + 254.0 + + + + 258.0 + + + + 262.0 + + + + 262.0 + + + + 259.0 + + + + 265.0 + + + + 268.0 + + + + 269.0 + + + + 269.0 + + + + 269.0 + + + + 269.0 + + + + 269.0 + + + + 267.0 + + + + 273.0 + + + + 272.0 + + + + 268.0 + + + + 266.0 + + + + 270.0 + + + + 272.0 + + + + 273.0 + + + + 271.0 + + + + 277.0 + + + + 274.0 + + + + 272.0 + + + + 273.0 + + + + 274.0 + + + + 274.0 + + + + 278.0 + + + + 284.0 + + + + 284.0 + + + + 285.0 + + + + 290.0 + + + + 287.0 + + + + 284.0 + + + + 277.0 + + + + 277.0 + + + + 284.0 + + + + 291.0 + + + + 293.0 + + + + 288.0 + + + + 285.0 + + + + 281.0 + + + + 288.0 + + + + 288.0 + + + + 290.0 + + + + 287.0 + + + + 282.0 + + + + 279.0 + + + + 277.0 + + + + 277.0 + + + + 279.0 + + + + 280.0 + + + + 282.0 + + + + 285.0 + + + + 294.0 + + + + 290.0 + + + + 290.0 + + + + 289.0 + + + + 293.0 + + + + 288.0 + + + + 284.0 + + + + 287.0 + + + + 286.0 + + + + 289.0 + + + + 292.0 + + + + 291.0 + + + + 293.0 + + + + 296.0 + + + + 288.0 + + + + 277.0 + + + + 291.0 + + + + 292.0 + + + + 285.0 + + + + 289.0 + + + + 289.0 + + + + 289.0 + + + + 293.0 + + + + 292.0 + + + + 300.0 + + + + 285.0 + + + + 289.0 + + + + 292.0 + + + + 293.0 + + + + 290.0 + + + + 283.0 + + + + 287.0 + + + + 285.0 + + + + 286.0 + + + + 283.0 + + + + 289.0 + + + + 287.0 + + + + 284.0 + + + + 279.0 + + + + 272.0 + + + + 276.0 + + + + 278.0 + + + + 278.0 + + + + 279.0 + + + + 276.0 + + + + 278.0 + + + + 274.0 + + + + 270.0 + + + + 258.0 + + + + 274.0 + + + + 269.0 + + + + 258.0 + + + + 260.0 + + + + 251.0 + + + + 257.0 + + + + 263.0 + + + + 266.0 + + + + 266.0 + + + + 267.0 + + + + 271.0 + + + + 264.0 + + + + 276.0 + + + + 268.0 + + + + 270.0 + + + + 270.0 + + + + 269.0 + + + + 260.0 + + + + 265.0 + + + + 258.0 + + + + 264.0 + + + + 269.0 + + + + 268.0 + + + + 266.0 + + + + 271.0 + + + + 262.0 + + + + 262.0 + + + + 247.0 + + + + 244.0 + + + + 252.0 + + + + 254.0 + + + + 254.0 + + + + 259.0 + + + + 256.0 + + + + 251.0 + + + + 242.0 + + + + 233.0 + + + + 222.0 + + + + 200.0 + + + + 196.0 + + + + 191.0 + + + + 189.0 + + + + 184.0 + + + + 185.0 + + + + 193.0 + + + + 196.0 + + + + 193.0 + + + + 192.0 + + + + 194.0 + + + + 198.0 + + + + 196.0 + + + + 197.0 + + + + 196.0 + + + + 194.0 + + + + 195.0 + + + + 195.0 + + + + 194.0 + + + + 201.0 + + + + 207.0 + + + + 204.0 + + + + 202.0 + + + + 200.0 + + + + 196.0 + + + + 197.0 + + + + 193.0 + + + + 198.0 + + + + 201.0 + + + + 207.0 + + + + 212.0 + + + + 226.0 + + + + 226.0 + + + + 228.0 + + + + 219.0 + + + + 214.0 + + + + 211.0 + + + + 214.0 + + + + 219.0 + + + + 215.0 + + + + 216.0 + + + + 210.0 + + + + 202.0 + + + + 202.0 + + + + 204.0 + + + + 198.0 + + + + 194.0 + + + + 194.0 + + + + 192.0 + + + + 203.0 + + + + 200.0 + + + + 198.0 + + + + 197.0 + + + + 196.0 + + + + 193.0 + + + + 194.0 + + + + 189.0 + + + + 189.0 + + + + 188.0 + + + + 186.0 + + + + 183.0 + + + + 185.0 + + + + 185.0 + + + + 190.0 + + + + 189.0 + + + + 193.0 + + + + 193.0 + + + + 192.0 + + + + 192.0 + + + + 192.0 + + + + 196.0 + + + + 196.0 + + + + 203.0 + + + + 198.0 + + + + 197.0 + + + + 196.0 + + + + 197.0 + + + + 197.0 + + + + 195.0 + + + + 197.0 + + + + 198.0 + + + + 203.0 + + + + 204.0 + + + + 205.0 + + + + 200.0 + + + + 201.0 + + + + 205.0 + + + + 204.0 + + + + 209.0 + + + + 209.0 + + + + 207.0 + + + + 208.0 + + + + 207.0 + + + + 209.0 + + + + 214.0 + + + + 208.0 + + + + 213.0 + + + + 213.0 + + + + 217.0 + + + + 216.0 + + + + 214.0 + + + + 214.0 + + + + 219.0 + + + + 214.0 + + + + 218.0 + + + + 218.0 + + + + 218.0 + + + + 220.0 + + + + 221.0 + + + + 224.0 + + + + 220.0 + + + + 222.0 + + + + 224.0 + + + + 220.0 + + + + 219.0 + + + + 223.0 + + + + 231.0 + + + + 231.0 + + + + 231.0 + + + + 222.0 + + + + 229.0 + + + + 235.0 + + + + 242.0 + + + + 241.0 + + + + 239.0 + + + + 236.0 + + + + 240.0 + + + + 233.0 + + + + 244.0 + + + + 241.0 + + + + 238.0 + + + + 236.0 + + + + 236.0 + + + + 239.0 + + + + 233.0 + + + + 241.0 + + + + 241.0 + + + + 243.0 + + + + 244.0 + + + + 244.0 + + + + 246.0 + + + + 247.0 + + + + 240.0 + + + + 244.0 + + + + 251.0 + + + + 248.0 + + + + 250.0 + + + + 237.0 + + + + 243.0 + + + + 245.0 + + + + 247.0 + + + + 249.0 + + + + 246.0 + + + + 246.0 + + + + 248.0 + + + + 249.0 + + + + 250.0 + + + + 252.0 + + + + 253.0 + + + + 252.0 + + + + 250.0 + + + + 253.0 + + + + 252.0 + + + + 247.0 + + + + 246.0 + + + + 247.0 + + + + 246.0 + + + + 246.0 + + + + 246.0 + + + + 244.0 + + + + 240.0 + + + + 247.0 + + + + 246.0 + + + + 244.0 + + + + 241.0 + + + + 239.0 + + + + 236.0 + + + + 234.0 + + + + 236.0 + + + + 237.0 + + + + 237.0 + + + + 236.0 + + + + 225.0 + + + + 222.0 + + + + 221.0 + + + + 222.0 + + + + 220.0 + + + + 220.0 + + + + 214.0 + + + + 212.0 + + + + 211.0 + + + + 207.0 + + + + 205.0 + + + + 205.0 + + + + 202.0 + + + + 207.0 + + + + 201.0 + + + + 201.0 + + + + 199.0 + + + + 194.0 + + + + 193.0 + + + + 195.0 + + + + 195.0 + + + + 196.0 + + + + 190.0 + + + + 193.0 + + + + 192.0 + + + + 192.0 + + + + 193.0 + + + + 194.0 + + + + 192.0 + + + + 191.0 + + + + 189.0 + + + + 181.0 + + + + 184.0 + + + + 188.0 + + + + 188.0 + + + + 190.0 + + + + 191.0 + + + + 195.0 + + + + 195.0 + + + + 195.0 + + + + 195.0 + + + + 197.0 + + + + 190.0 + + + + 181.0 + + + + 187.0 + + + + 190.0 + + + + 194.0 + + + + 200.0 + + + + 202.0 + + + + 198.0 + + + + 200.0 + + + + 199.0 + + + + 204.0 + + + + 202.0 + + + + 203.0 + + + + 199.0 + + + + 201.0 + + + + 199.0 + + + + 198.0 + + + + 205.0 + + + + 204.0 + + + + 206.0 + + + + 204.0 + + + + 208.0 + + + + 204.0 + + + + 210.0 + + + + 209.0 + + + + 206.0 + + + + 206.0 + + + + 206.0 + + + + 209.0 + + + + 206.0 + + + + 211.0 + + + + 214.0 + + + + 213.0 + + + + 211.0 + + + + 214.0 + + + + 215.0 + + + + 217.0 + + + + 217.0 + + + + 217.0 + + + + 216.0 + + + + 213.0 + + + + 218.0 + + + + 216.0 + + + + 213.0 + + + + 219.0 + + + + 226.0 + + + + 223.0 + + + + 223.0 + + + + 229.0 + + + + 233.0 + + + + 237.0 + + + + 239.0 + + + + 241.0 + + + + 239.0 + + + + 239.0 + + + + 241.0 + + + + 239.0 + + + + 242.0 + + + + 241.0 + + + + 238.0 + + + + 240.0 + + + + 242.0 + + + + 241.0 + + + + 237.0 + + + + 237.0 + + + + 241.0 + + + + 239.0 + + + + 239.0 + + + + 240.0 + + + + 244.0 + + + + 242.0 + + + + 247.0 + + + + 248.0 + + + + 250.0 + + + + 240.0 + + + + 250.0 + + + + 250.0 + + + + 242.0 + + + + 244.0 + + + + 243.0 + + + + 242.0 + + + + 246.0 + + + + 238.0 + + + + 240.0 + + + + 245.0 + + + + 242.0 + + + + 242.0 + + + + 237.0 + + + + 239.0 + + + + 240.0 + + + + 242.0 + + + + 244.0 + + + + 244.0 + + + + 244.0 + + + + 244.0 + + + + 242.0 + + + + 243.0 + + + + 239.0 + + + + 239.0 + + + + 245.0 + + + + 243.0 + + + + 249.0 + + + + 250.0 + + + + 253.0 + + + + 252.0 + + + + 250.0 + + + + 246.0 + + + + 250.0 + + + + 248.0 + + + + 252.0 + + + + 250.0 + + + + 251.0 + + + + 252.0 + + + + 252.0 + + + + 251.0 + + + + 258.0 + + + + 257.0 + + + + 255.0 + + + + 239.0 + + + + 239.0 + + + + 241.0 + + + + 238.0 + + + + 233.0 + + + + 231.0 + + + + 226.0 + + + + 233.0 + + + + 233.0 + + + + 224.0 + + + + 220.0 + + + + 217.0 + + + + 224.0 + + + + 225.0 + + + + 210.0 + + + + 211.0 + + + + 211.0 + + + + 214.0 + + + + 213.0 + + + + 220.0 + + + + 226.0 + + + + 223.0 + + + + 218.0 + + + + 215.0 + + + + 220.0 + + + + 215.0 + + + + 214.0 + + + + 214.0 + + + + 230.0 + + + + 224.0 + + + + 224.0 + + + + 224.0 + + + + 217.0 + + + + 219.0 + + + + 218.0 + + + + 218.0 + + + + 219.0 + + + + 208.0 + + + + 207.0 + + + + 199.0 + + + + 190.0 + + + + 186.0 + + + + 189.0 + + + + 191.0 + + + + 184.0 + + + + 180.0 + + + + 184.0 + + + + 174.0 + + + + 179.0 + + + + 171.0 + + + + 166.0 + + + + 165.0 + + + + 167.0 + + + + 166.0 + + + + 167.0 + + + + 169.0 + + + + 176.0 + + + + 175.0 + + + + 183.0 + + + + 186.0 + + + + 191.0 + + + + 187.0 + + + + 185.0 + + + + 187.0 + + + + 185.0 + + + + 184.0 + + + + 191.0 + + + + 197.0 + + + + 192.0 + + + + 192.0 + + + + 194.0 + + + + 186.0 + + + + 187.0 + + + + 187.0 + + + + 187.0 + + + + 190.0 + + + + 193.0 + + + + 185.0 + + + + 188.0 + + + + 190.0 + + + + 190.0 + + + + 186.0 + + + + 190.0 + + + + 184.0 + + + + 183.0 + + + + 164.0 + + + + 170.0 + + + + 174.0 + + + + 175.0 + + + + 174.0 + + + + 182.0 + + + + 183.0 + + + + 180.0 + + + + 185.0 + + + + 181.0 + + + + 182.0 + + + + 171.0 + + + + 170.0 + + + + 169.0 + + + + 171.0 + + + + 168.0 + + + + 161.0 + + + + 158.0 + + + + 159.0 + + + + 163.0 + + + + 177.0 + + + + 176.0 + + + + 179.0 + + + + 179.0 + + + + 165.0 + + + + 158.0 + + + + 165.0 + + + + 171.0 + + + + 170.0 + + + + 161.0 + + + + 165.0 + + + + 161.0 + + + + 163.0 + + + + 164.0 + + + + 187.0 + + + + 161.0 + + + + 159.0 + + + + 165.0 + + + + 151.0 + + + + 147.0 + + + + 142.0 + + + + 139.0 + + + + 127.0 + + + + 127.0 + + + + 150.0 + + + + 149.0 + + + + 142.0 + + + + + + + + \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/short.geohash b/vendor/phayes/geophp/tests/input/short.geohash new file mode 100644 index 0000000..ecb20db --- /dev/null +++ b/vendor/phayes/geophp/tests/input/short.geohash @@ -0,0 +1 @@ +xpssc0 diff --git a/vendor/phayes/geophp/tests/input/simple_point.json b/vendor/phayes/geophp/tests/input/simple_point.json new file mode 100644 index 0000000..a782e02 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/simple_point.json @@ -0,0 +1 @@ +{"type": "Feature", "geometry": {"type": "Point", "coordinates": [-80.73029, 35.3936]}} \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/input/track.gpx b/vendor/phayes/geophp/tests/input/track.gpx new file mode 100644 index 0000000..23fe1d7 --- /dev/null +++ b/vendor/phayes/geophp/tests/input/track.gpx @@ -0,0 +1,28 @@ + + + + + + Garmin International + + + + + Example GPX Document + + + 4.46 + + + + 4.94 + + + + 6.87 + + + + + + diff --git a/vendor/phayes/geophp/tests/postgis.php b/vendor/phayes/geophp/tests/postgis.php new file mode 100644 index 0000000..1804da2 --- /dev/null +++ b/vendor/phayes/geophp/tests/postgis.php @@ -0,0 +1,82 @@ +setSRID(4326); + test_postgis($name, $format, $geometry, $connection, 'ewkb'); + } + } + print "Testing Done!"; +} + +function test_postgis($name, $type, $geom, $connection, $format) { + global $table; + + // Let's insert into the database using GeomFromWKB + $insert_string = pg_escape_bytea($geom->out($format)); + pg_query($connection, "INSERT INTO $table (name, type, geom) values ('$name', '$type', GeomFromWKB('$insert_string'))"); + + // SELECT using asBinary PostGIS + $result = pg_fetch_all(pg_query($connection, "SELECT asBinary(geom) as geom FROM $table WHERE name='$name'")); + foreach ($result as $item) { + $wkb = pg_unescape_bytea($item['geom']); // Make sure to unescape the hex blob + $geom = geoPHP::load($wkb, $format); // We now a full geoPHP Geometry object + } + + // SELECT and INSERT directly, with no wrapping functions + $result = pg_fetch_all(pg_query($connection, "SELECT geom as geom FROM $table WHERE name='$name'")); + foreach ($result as $item) { + $wkb = pack('H*',$item['geom']); // Unpacking the hex blob + $geom = geoPHP::load($wkb, $format); // We now have a geoPHP Geometry + + // Let's re-insert directly into postGIS + // We need to unpack the WKB + $unpacked = unpack('H*', $geom->out($format)); + $insert_string = $unpacked[1]; + pg_query($connection, "INSERT INTO $table (name, type, geom) values ('$name', '$type', '$insert_string')"); + } + + // SELECT and INSERT using as EWKT (ST_GeomFromEWKT and ST_AsEWKT) + $result = pg_fetch_all(pg_query($connection, "SELECT ST_AsEWKT(geom) as geom FROM $table WHERE name='$name'")); + foreach ($result as $item) { + $wkt = $item['geom']; // Make sure to unescape the hex blob + $geom = geoPHP::load($wkt, 'ewkt'); // We now a full geoPHP Geometry object + + // Let's re-insert directly into postGIS + $insert_string = $geom->out('ewkt'); + pg_query($connection, "INSERT INTO $table (name, type, geom) values ('$name', '$type', ST_GeomFromEWKT('$insert_string'))"); + } +} + diff --git a/vendor/phayes/geophp/tests/test.php b/vendor/phayes/geophp/tests/test.php new file mode 100644 index 0000000..ae112bd --- /dev/null +++ b/vendor/phayes/geophp/tests/test.php @@ -0,0 +1,258 @@ +area(); + $geometry->boundary(); + $geometry->envelope(); + $geometry->getBBox(); + $geometry->centroid(); + $geometry->length(); + $geometry->greatCircleLength(); + $geometry->haversineLength(); + $geometry->y(); + $geometry->x(); + $geometry->numGeometries(); + $geometry->geometryN(1); + $geometry->startPoint(); + $geometry->endPoint(); + $geometry->isRing(); + $geometry->isClosed(); + $geometry->numPoints(); + $geometry->pointN(1); + $geometry->exteriorRing(); + $geometry->numInteriorRings(); + $geometry->interiorRingN(1); + $geometry->dimension(); + $geometry->geometryType(); + $geometry->SRID(); + $geometry->setSRID(4326); + + // Aliases + $geometry->getCentroid(); + $geometry->getArea(); + $geometry->getX(); + $geometry->getY(); + $geometry->getGeos(); + $geometry->getGeomType(); + $geometry->getSRID(); + $geometry->asText(); + $geometry->asBinary(); + + // GEOS only functions + $geometry->geos(); + $geometry->setGeos($geometry->geos()); + $geometry->pointOnSurface(); + $geometry->equals($geometry); + $geometry->equalsExact($geometry); + $geometry->relate($geometry); + $geometry->checkValidity(); + $geometry->isSimple(); + $geometry->buffer(10); + $geometry->intersection($geometry); + $geometry->convexHull(); + $geometry->difference($geometry); + $geometry->symDifference($geometry); + $geometry->union($geometry); + $geometry->simplify(0);// @@TODO: Adjust this once we can deal with empty geometries + $geometry->disjoint($geometry); + $geometry->touches($geometry); + $geometry->intersects($geometry); + $geometry->crosses($geometry); + $geometry->within($geometry); + $geometry->contains($geometry); + $geometry->overlaps($geometry); + $geometry->covers($geometry); + $geometry->coveredBy($geometry); + $geometry->distance($geometry); + $geometry->hausdorffDistance($geometry); + + + // Place holders + $geometry->hasZ(); + $geometry->is3D(); + $geometry->isMeasured(); + $geometry->isEmpty(); + $geometry->coordinateDimension(); + $geometry->z(); + $geometry->m(); +} + +function test_adapters($geometry, $format, $input) { + // Test adapter output and input. Do a round-trip and re-test + foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) { + if ($adapter_key != 'google_geocode') { //Don't test google geocoder regularily. Uncomment to test + $output = $geometry->out($adapter_key); + if ($output) { + $adapter_loader = new $adapter_class(); + $test_geom_1 = $adapter_loader->read($output); + $test_geom_2 = $adapter_loader->read($test_geom_1->out($adapter_key)); + + if ($test_geom_1->out('wkt') != $test_geom_2->out('wkt')) { + print "Mismatched adapter output in ".$adapter_class."\n"; + } + } + else { + print "Empty output on " . $adapter_key . "\n"; + } + } + } + + // Test to make sure adapter work the same wether GEOS is ON or OFF + // Cannot test methods if GEOS is not intstalled + if (!geoPHP::geosInstalled()) return; + + foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) { + if ($adapter_key != 'google_geocode') { //Don't test google geocoder regularily. Uncomment to test + // Turn GEOS on + geoPHP::geosInstalled(TRUE); + + $output = $geometry->out($adapter_key); + if ($output) { + $adapter_loader = new $adapter_class(); + + $test_geom_1 = $adapter_loader->read($output); + + // Turn GEOS off + geoPHP::geosInstalled(FALSE); + + $test_geom_2 = $adapter_loader->read($output); + + // Turn GEOS back On + geoPHP::geosInstalled(TRUE); + + // Check to make sure a both are the same with geos and without + if ($test_geom_1->out('wkt') != $test_geom_2->out('wkt')) { + print "Mismatched adapter output between GEOS and NORM in ".$adapter_class."\n"; + } + } + } + } +} + + +function test_methods($geometry) { + // Cannot test methods if GEOS is not intstalled + if (!geoPHP::geosInstalled()) return; + + $methods = array( + //'boundary', //@@TODO: Uncomment this and fix errors + 'envelope', //@@TODO: Testing reveales errors in this method -- POINT vs. POLYGON + 'getBBox', + 'x', + 'y', + 'startPoint', + 'endPoint', + 'isRing', + 'isClosed', + 'numPoints', + ); + + foreach ($methods as $method) { + // Turn GEOS on + geoPHP::geosInstalled(TRUE); + $geos_result = $geometry->$method(); + + // Turn GEOS off + geoPHP::geosInstalled(FALSE); + $norm_result = $geometry->$method(); + + // Turn GEOS back On + geoPHP::geosInstalled(TRUE); + + $geos_type = gettype($geos_result); + $norm_type = gettype($norm_result); + + if ($geos_type != $norm_type) { + print 'Type mismatch on '.$method."\n"; + continue; + } + + // Now check base on type + if ($geos_type == 'object') { + $haus_dist = $geos_result->hausdorffDistance(geoPHP::load($norm_result->out('wkt'),'wkt')); + + // Get the length of the diagonal of the bbox - this is used to scale the haustorff distance + // Using Pythagorean theorem + $bb = $geos_result->getBBox(); + $scale = sqrt((($bb['maxy'] - $bb['miny'])^2) + (($bb['maxx'] - $bb['minx'])^2)); + + // The difference in the output of GEOS and native-PHP methods should be less than 0.5 scaled haustorff units + if ($haus_dist / $scale > 0.5) { + print 'Output mismatch on '.$method.":\n"; + print 'GEOS : '.$geos_result->out('wkt')."\n"; + print 'NORM : '.$norm_result->out('wkt')."\n"; + continue; + } + } + + if ($geos_type == 'boolean' || $geos_type == 'string') { + if ($geos_result !== $norm_result) { + print 'Output mismatch on '.$method.":\n"; + print 'GEOS : '.(string) $geos_result."\n"; + print 'NORM : '.(string) $norm_result."\n"; + continue; + } + } + + //@@TODO: Run tests for output of types arrays and float + //@@TODO: centroid function is non-compliant for collections and strings + } +} + +function test_detection($value, $format, $file) { + $detected = geoPHP::detectFormat($value); + if ($detected != $format) { + if ($detected) print 'detected as ' . $detected . "\n"; + else print "format not detected\n"; + } + // Make sure it loads using auto-detect + geoPHP::load($value); +} + +function FailOnError($error_level, $error_message, $error_file, $error_line, $error_context) { + echo "$error_level: $error_message in $error_file on line $error_line\n"; + echo "\e[31m" . "FAIL" . "\e[39m\n"; + exit(1); +} \ No newline at end of file diff --git a/vendor/phayes/geophp/tests/tests/20120702Test.php b/vendor/phayes/geophp/tests/tests/20120702Test.php new file mode 100644 index 0000000..5486e0a --- /dev/null +++ b/vendor/phayes/geophp/tests/tests/20120702Test.php @@ -0,0 +1,287 @@ + 'area'), + array('name' => 'boundary'), + array('name' => 'getBBox'), + array('name' => 'centroid'), + array('name' => 'length'), + array('name' => 'greatCircleLength', 'argument' => 6378137), + array('name' => 'haversineLength'), + array('name' => 'y'), + array('name' => 'x'), + array('name' => 'numGeometries'), + array('name' => 'geometryN', 'argument' => '1'), + array('name' => 'startPoint'), + array('name' => 'endPoint'), + array('name' => 'isRing'), + array('name' => 'isClosed'), + array('name' => 'numPoints'), + array('name' => 'pointN', 'argument' => '1'), + array('name' => 'exteriorRing'), + array('name' => 'numInteriorRings'), + array('name' => 'interiorRingN', 'argument' => '1'), + array('name' => 'dimension'), + array('name' => 'geometryType'), + array('name' => 'SRID'), + array('name' => 'setSRID', 'argument' => '4326'), + ); + + foreach($methods as $method) { + $argument = NULL; + $method_name = $method['name']; + if (isset($method['argument'])) { + $argument = $method['argument']; + } + $this->_methods_tester($geometry, $method_name, $argument); + } + } + + function _methods_tester($geometry, $method_name, $argument) { + + if (!method_exists($geometry, $method_name)) { + $this->fail("Method ".$method_name.'() doesn\'t exists.'); + return; + } + + switch ($method_name) { + case 'y': + case 'x': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'geometryN': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'startPoint': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + //TODO: Add a method startPoint() to MultiLineString. + //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'endPoint': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + //TODO: Add a method endPoint() to MultiLineString. + //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'isRing': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'isClosed': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'pointN': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + //TODO: Add a method pointN() to MultiLineString. + //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'exteriorRing': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'numInteriorRings': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'interiorRingN': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'setSRID': + //TODO: The method setSRID() should return TRUE. + break; + case 'SRID': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'getBBox': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'centroid': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'length': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertEquals($geometry->$method_name($argument), (float) '0.11624637315233', 'Failed on ' . $method_name); + } + break; + case 'numGeometries': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'numPoints': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'dimension': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'boundary': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'greatCircleLength': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotEquals($geometry->$method_name($argument), '9500.9359867418', 'Failed on ' . $method_name); + } + break; + case 'haversineLength': + case 'area': + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + break; + case 'geometryType': + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + break; + default: + $this->assertTrue($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + } +} + diff --git a/vendor/phayes/geophp/tests/tests/adaptersTest.php b/vendor/phayes/geophp/tests/tests/adaptersTest.php new file mode 100644 index 0000000..5952e10 --- /dev/null +++ b/vendor/phayes/geophp/tests/tests/adaptersTest.php @@ -0,0 +1,63 @@ + $adapter_class) { + if ($adapter_key != 'google_geocode') { //Don't test google geocoder regularily. Uncomment to test + $output = $geometry->out($adapter_key); + $this->assertNotNull($output, "Empty output on " . $adapter_key); + if ($output) { + $adapter_loader = new $adapter_class(); + $test_geom_1 = $adapter_loader->read($output); + $test_geom_2 = $adapter_loader->read($test_geom_1->out($adapter_key)); + $this->assertEquals($test_geom_1->out('wkt'), $test_geom_2->out('wkt'), "Mismatched adapter output in ".$adapter_class .' (test file: ' . $file . ')'); + } + } + } + + // Test to make sure adapter work the same wether GEOS is ON or OFF + // Cannot test methods if GEOS is not intstalled + if (!geoPHP::geosInstalled()) return; + + foreach (geoPHP::getAdapterMap() as $adapter_key => $adapter_class) { + if ($adapter_key != 'google_geocode') { //Don't test google geocoder regularily. Uncomment to test + // Turn GEOS on + geoPHP::geosInstalled(TRUE); + + $output = $geometry->out($adapter_key); + if ($output) { + $adapter_loader = new $adapter_class(); + + $test_geom_1 = $adapter_loader->read($output); + + // Turn GEOS off + geoPHP::geosInstalled(FALSE); + + $test_geom_2 = $adapter_loader->read($output); + + // Turn GEOS back On + geoPHP::geosInstalled(TRUE); + + // Check to make sure a both are the same with geos and without + $this->assertEquals($test_geom_1->out('wkt'), $test_geom_2->out('wkt'), "Mismatched adapter output between GEOS and NORM in ".$adapter_class .' (test file: ' . $file . ')'); + } + } + } + } + } + } +} diff --git a/vendor/phayes/geophp/tests/tests/bootstrap.php b/vendor/phayes/geophp/tests/tests/bootstrap.php new file mode 100644 index 0000000..7d01cb0 --- /dev/null +++ b/vendor/phayes/geophp/tests/tests/bootstrap.php @@ -0,0 +1,7 @@ +assertEquals ( 'xne', $geohash->adjacent ( 'xn7', 'top' ), 'Did not find correct top adjacent geohash for xn7' ); + $this->assertEquals ( 'xnk', $geohash->adjacent ( 'xn7', 'right' ), 'Did not find correct right adjacent geohash for xn7' ); + $this->assertEquals ( 'xn5', $geohash->adjacent ( 'xn7', 'bottom' ), 'Did not find correct bottom adjacent geohash for xn7' ); + $this->assertEquals ( 'xn6', $geohash->adjacent ( 'xn7', 'left' ), 'Did not find correct left adjacent geohash for xn7' ); + $this->assertEquals ( 'xnd', $geohash->adjacent ( $geohash->adjacent ( 'xn7', 'left' ), 'top' ), 'Did not find correct top-left adjacent geohash for xn7' ); + } +} diff --git a/vendor/phayes/geophp/tests/tests/geosTest.php b/vendor/phayes/geophp/tests/tests/geosTest.php new file mode 100644 index 0000000..e45e212 --- /dev/null +++ b/vendor/phayes/geophp/tests/tests/geosTest.php @@ -0,0 +1,89 @@ + 'geos'), + array('name' => 'setGeos', 'argument' => $geometry->geos()), + array('name' => 'PointOnSurface'), + array('name' => 'equals', 'argument' => $geometry), + array('name' => 'equalsExact', 'argument' => $geometry), + array('name' => 'relate', 'argument' => $geometry), + array('name' => 'checkValidity'), + array('name' => 'isSimple'), + array('name' => 'buffer', 'argument' => '10'), + array('name' => 'intersection', 'argument' => $geometry), + array('name' => 'convexHull'), + array('name' => 'difference', 'argument' => $geometry), + array('name' => 'symDifference', 'argument' => $geometry), + array('name' => 'union', 'argument' => $geometry), + array('name' => 'simplify', 'argument' => '0'), + array('name' => 'disjoint', 'argument' => $geometry), + array('name' => 'touches', 'argument' => $geometry), + array('name' => 'intersects', 'argument' => $geometry), + array('name' => 'crosses', 'argument' => $geometry), + array('name' => 'within', 'argument' => $geometry), + array('name' => 'contains', 'argument' => $geometry), + array('name' => 'overlaps', 'argument' => $geometry), + array('name' => 'covers', 'argument' => $geometry), + array('name' => 'coveredBy', 'argument' => $geometry), + array('name' => 'distance', 'argument' => $geometry), + array('name' => 'hausdorffDistance', 'argument' => $geometry), + ); + + foreach($geosMethods as $method) { + $argument = NULL; + $method_name = $method['name']; + if (isset($method['argument'])) { + $argument = $method['argument']; + } + + switch ($method_name) { + case 'isSimple': + case 'equals': + case 'geos': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + default: + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + } + } + + } + } + } + +} diff --git a/vendor/phayes/geophp/tests/tests/methodsTest.php b/vendor/phayes/geophp/tests/tests/methodsTest.php new file mode 100644 index 0000000..3129ff3 --- /dev/null +++ b/vendor/phayes/geophp/tests/tests/methodsTest.php @@ -0,0 +1,359 @@ + 'area'), + array('name' => 'boundary'), + array('name' => 'getBBox'), + array('name' => 'centroid'), + array('name' => 'length'), + array('name' => 'greatCircleLength'), + array('name' => 'haversineLength'), + array('name' => 'y'), + array('name' => 'x'), + array('name' => 'numGeometries'), + array('name' => 'geometryN', 'argument' => '1'), + array('name' => 'startPoint'), + array('name' => 'endPoint'), + array('name' => 'isRing'), + array('name' => 'isClosed'), + array('name' => 'numPoints'), + array('name' => 'pointN', 'argument' => '1'), + array('name' => 'exteriorRing'), + array('name' => 'numInteriorRings'), + array('name' => 'interiorRingN', 'argument' => '1'), + array('name' => 'dimension'), + array('name' => 'geometryType'), + array('name' => 'SRID'), + array('name' => 'setSRID', 'argument' => '4326'), + ); + + foreach($methods as $method) { + $argument = NULL; + $method_name = $method['name']; + if (isset($method['argument'])) { + $argument = $method['argument']; + } + + $this->_methods_tester($geometry, $method_name, $argument, $file); + } + + $this->_methods_tester_with_geos($geometry); + } + } + } + + function _methods_tester($geometry, $method_name, $argument, $file) { + + if (!method_exists($geometry, $method_name)) { + $this->fail("Method ".$method_name.'() doesn\'t exists.'); + return; + } + + switch ($method_name) { + case 'y': + case 'x': + if (!$geometry->isEmpty()) { + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + } + break; + case 'geometryN': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'startPoint': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + //TODO: Add a method startPoint() to MultiLineString. + //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'endPoint': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + //TODO: Add a method endPoint() to MultiLineString. + //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name); + } + break; + case 'isRing': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'isClosed': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'pointN': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + //TODO: Add a method pointN() to MultiLineString. + //$this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'exteriorRing': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'numInteriorRings': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'interiorRingN': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'SRID': + break; + case 'getBBox': + if (!$geometry->isEmpty()) { + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + } + break; + case 'centroid': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'length': + if ($geometry->geometryType() == 'Point') { + $this->assertEquals($geometry->$method_name($argument), 0, 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotEquals($geometry->$method_name($argument), 0, 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotEquals($geometry->$method_name($argument), 0, 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'numGeometries': + if ($geometry->geometryType() == 'Point') { + $this->assertNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'numPoints': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'dimension': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'boundary': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'haversineLength': + //TODO: Check if output is a float >= 0. + //TODO: Sometimes haversineLength() returns NAN, needs to check why. + break; + case 'greatCircleLength': + case 'area': + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + break; + case 'geometryType': + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + break; + case 'setSRID': + //TODO: The method setSRID() should return TRUE. + break; + default: + $this->assertTrue($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + + } + + function _methods_tester_with_geos($geometry) { + // Cannot test methods if GEOS is not intstalled + if (!geoPHP::geosInstalled()) return; + + $methods = array( + //'boundary', //@@TODO: Uncomment this and fix errors + 'envelope', //@@TODO: Testing reveales errors in this method -- POINT vs. POLYGON + 'getBBox', + 'x', + 'y', + 'startPoint', + 'endPoint', + 'isRing', + 'isClosed', + 'numPoints', + ); + + foreach ($methods as $method) { + // Turn GEOS on + geoPHP::geosInstalled(TRUE); + $geos_result = $geometry->$method(); + + // Turn GEOS off + geoPHP::geosInstalled(FALSE); + $norm_result = $geometry->$method(); + + // Turn GEOS back On + geoPHP::geosInstalled(TRUE); + + $geos_type = gettype($geos_result); + $norm_type = gettype($norm_result); + + if ($geos_type != $norm_type) { + $this->fail('Type mismatch on '.$method); + $this->dump($geos_type); + $this->dump($norm_type); + continue; + } + + // Now check base on type + if ($geos_type == 'object') { + $haus_dist = $geos_result->hausdorffDistance(geoPHP::load($norm_result->out('wkt'),'wkt')); + + // Get the length of the diagonal of the bbox - this is used to scale the haustorff distance + // Using Pythagorean theorem + $bb = $geos_result->getBBox(); + $scale = sqrt((($bb['maxy'] - $bb['miny'])^2) + (($bb['maxx'] - $bb['minx'])^2)); + + // The difference in the output of GEOS and native-PHP methods should be less than 0.5 scaled haustorff units + if ($haus_dist / $scale > 0.5) { + $this->fail('Output mismatch on '.$method); + $this->dump('GEOS : '); + $this->dump($geos_result->out('wkt')); + $this->dump('NORM : '); + $this->dump($norm_result->out('wkt')); + continue; + } + } + + if ($geos_type == 'boolean' || $geos_type == 'string') { + if ($geos_result !== $norm_result) { + $this->fail('Output mismatch on '.$method); + $this->dump('GEOS : '); + $this->dump((string) $geos_result); + $this->dump('NORM : '); + $this->dump((string) $norm_result); + continue; + } + } + + //@@TODO: Run tests for output of types arrays and float + //@@TODO: centroid function is non-compliant for collections and strings + } + } +} diff --git a/vendor/phayes/geophp/tests/tests/placeholdersTest.php b/vendor/phayes/geophp/tests/tests/placeholdersTest.php new file mode 100644 index 0000000..8f50f4d --- /dev/null +++ b/vendor/phayes/geophp/tests/tests/placeholdersTest.php @@ -0,0 +1,60 @@ + 'hasZ'), + array('name' => 'is3D'), + array('name' => 'isMeasured'), + array('name' => 'isEmpty'), + array('name' => 'coordinateDimension'), + array('name' => 'z'), + array('name' => 'm'), + ); + + foreach($placeholders as $method) { + $argument = NULL; + $method_name = $method['name']; + if (isset($method['argument'])) { + $argument = $method['argument']; + } + + switch ($method_name) { + case 'hasZ': + if ($geometry->geometryType() == 'Point') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'LineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + if ($geometry->geometryType() == 'MultiLineString') { + $this->assertNotNull($geometry->$method_name($argument), 'Failed on ' . $method_name .' (test file: ' . $file . ')'); + } + break; + case 'm': + case 'z': + case 'coordinateDimension': + case 'isEmpty': + case 'isMeasured': + case 'is3D': + } + } + + } + } + + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md new file mode 100644 index 0000000..bb42ee1 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md @@ -0,0 +1,23 @@ +CHANGELOG +========= + +2.5.0 +----- + + * added Debug\TraceableEventDispatcher (originally in HttpKernel) + * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface + * added RegisterListenersPass (originally in HttpKernel) + +2.1.0 +----- + + * added TraceableEventDispatcherInterface + * added ContainerAwareEventDispatcher + * added a reference to the EventDispatcher on the Event + * added a reference to the Event name on the event + * added fluid interface to the dispatch() method which now returns the Event + object + * added GenericEvent event class + * added the possibility for subscribers to subscribe several times for the + same event + * added ImmutableEventDispatcher diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php new file mode 100644 index 0000000..af0b6ce --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php @@ -0,0 +1,202 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Lazily loads listeners and subscribers from the dependency injection + * container. + * + * @author Fabien Potencier + * @author Bernhard Schussek + * @author Jordan Alliot + */ +class ContainerAwareEventDispatcher extends EventDispatcher +{ + /** + * The container from where services are loaded. + * + * @var ContainerInterface + */ + private $container; + + /** + * The service IDs of the event listeners and subscribers. + * + * @var array + */ + private $listenerIds = array(); + + /** + * The services registered as listeners. + * + * @var array + */ + private $listeners = array(); + + /** + * Constructor. + * + * @param ContainerInterface $container A ContainerInterface instance + */ + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + + /** + * Adds a service as event listener. + * + * @param string $eventName Event for which the listener is added + * @param array $callback The service ID of the listener service & the method + * name that has to be called + * @param int $priority The higher this value, the earlier an event listener + * will be triggered in the chain. + * Defaults to 0. + * + * @throws \InvalidArgumentException + */ + public function addListenerService($eventName, $callback, $priority = 0) + { + if (!is_array($callback) || 2 !== count($callback)) { + throw new \InvalidArgumentException('Expected an array("service", "method") argument'); + } + + $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority); + } + + public function removeListener($eventName, $listener) + { + $this->lazyLoad($eventName); + + if (isset($this->listenerIds[$eventName])) { + foreach ($this->listenerIds[$eventName] as $i => $args) { + list($serviceId, $method, $priority) = $args; + $key = $serviceId.'.'.$method; + if (isset($this->listeners[$eventName][$key]) && $listener === array($this->listeners[$eventName][$key], $method)) { + unset($this->listeners[$eventName][$key]); + if (empty($this->listeners[$eventName])) { + unset($this->listeners[$eventName]); + } + unset($this->listenerIds[$eventName][$i]); + if (empty($this->listenerIds[$eventName])) { + unset($this->listenerIds[$eventName]); + } + } + } + } + + parent::removeListener($eventName, $listener); + } + + /** + * @see EventDispatcherInterface::hasListeners() + */ + public function hasListeners($eventName = null) + { + if (null === $eventName) { + return (bool) count($this->listenerIds) || (bool) count($this->listeners); + } + + if (isset($this->listenerIds[$eventName])) { + return true; + } + + return parent::hasListeners($eventName); + } + + /** + * @see EventDispatcherInterface::getListeners() + */ + public function getListeners($eventName = null) + { + if (null === $eventName) { + foreach (array_keys($this->listenerIds) as $serviceEventName) { + $this->lazyLoad($serviceEventName); + } + } else { + $this->lazyLoad($eventName); + } + + return parent::getListeners($eventName); + } + + /** + * Adds a service as event subscriber. + * + * @param string $serviceId The service ID of the subscriber service + * @param string $class The service's class name (which must implement EventSubscriberInterface) + */ + public function addSubscriberService($serviceId, $class) + { + foreach ($class::getSubscribedEvents() as $eventName => $params) { + if (is_string($params)) { + $this->listenerIds[$eventName][] = array($serviceId, $params, 0); + } elseif (is_string($params[0])) { + $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0); + } else { + foreach ($params as $listener) { + $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0); + } + } + } + } + + /** + * {@inheritdoc} + * + * Lazily loads listeners for this event from the dependency injection + * container. + * + * @throws \InvalidArgumentException if the service is not defined + */ + public function dispatch($eventName, Event $event = null) + { + $this->lazyLoad($eventName); + + return parent::dispatch($eventName, $event); + } + + public function getContainer() + { + return $this->container; + } + + /** + * Lazily loads listeners for this event from the dependency injection + * container. + * + * @param string $eventName The name of the event to dispatch. The name of + * the event is the name of the method that is + * invoked on listeners. + */ + protected function lazyLoad($eventName) + { + if (isset($this->listenerIds[$eventName])) { + foreach ($this->listenerIds[$eventName] as $args) { + list($serviceId, $method, $priority) = $args; + $listener = $this->container->get($serviceId); + + $key = $serviceId.'.'.$method; + if (!isset($this->listeners[$eventName][$key])) { + $this->addListener($eventName, array($listener, $method), $priority); + } elseif ($listener !== $this->listeners[$eventName][$key]) { + parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method)); + $this->addListener($eventName, array($listener, $method), $priority); + } + + $this->listeners[$eventName][$key] = $listener; + } + } + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php new file mode 100644 index 0000000..2119b81 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php @@ -0,0 +1,320 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Debug; + +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\Stopwatch\Stopwatch; +use Psr\Log\LoggerInterface; + +/** + * Collects some data about event listeners. + * + * This event dispatcher delegates the dispatching to another one. + * + * @author Fabien Potencier + */ +class TraceableEventDispatcher implements TraceableEventDispatcherInterface +{ + protected $logger; + protected $stopwatch; + + private $called; + private $dispatcher; + + /** + * Constructor. + * + * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance + * @param Stopwatch $stopwatch A Stopwatch instance + * @param LoggerInterface $logger A LoggerInterface instance + */ + public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null) + { + $this->dispatcher = $dispatcher; + $this->stopwatch = $stopwatch; + $this->logger = $logger; + $this->called = array(); + } + + /** + * {@inheritdoc} + */ + public function addListener($eventName, $listener, $priority = 0) + { + $this->dispatcher->addListener($eventName, $listener, $priority); + } + + /** + * {@inheritdoc} + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + $this->dispatcher->addSubscriber($subscriber); + } + + /** + * {@inheritdoc} + */ + public function removeListener($eventName, $listener) + { + return $this->dispatcher->removeListener($eventName, $listener); + } + + /** + * {@inheritdoc} + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) + { + return $this->dispatcher->removeSubscriber($subscriber); + } + + /** + * {@inheritdoc} + */ + public function getListeners($eventName = null) + { + return $this->dispatcher->getListeners($eventName); + } + + /** + * {@inheritdoc} + */ + public function hasListeners($eventName = null) + { + return $this->dispatcher->hasListeners($eventName); + } + + /** + * {@inheritdoc} + */ + public function dispatch($eventName, Event $event = null) + { + if (null === $event) { + $event = new Event(); + } + + $this->preProcess($eventName); + $this->preDispatch($eventName, $event); + + $e = $this->stopwatch->start($eventName, 'section'); + + $this->dispatcher->dispatch($eventName, $event); + + if ($e->isStarted()) { + $e->stop(); + } + + $this->postDispatch($eventName, $event); + $this->postProcess($eventName); + + return $event; + } + + /** + * {@inheritdoc} + */ + public function getCalledListeners() + { + $called = array(); + foreach ($this->called as $eventName => $listeners) { + foreach ($listeners as $listener) { + $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName); + $called[$eventName.'.'.$info['pretty']] = $info; + } + } + + return $called; + } + + /** + * {@inheritdoc} + */ + public function getNotCalledListeners() + { + try { + $allListeners = $this->getListeners(); + } catch (\Exception $e) { + if (null !== $this->logger) { + $this->logger->info(sprintf('An exception was thrown while getting the uncalled listeners (%s)', $e->getMessage()), array('exception' => $e)); + } + + // unable to retrieve the uncalled listeners + return array(); + } + + $notCalled = array(); + foreach ($allListeners as $eventName => $listeners) { + foreach ($listeners as $listener) { + $called = false; + if (isset($this->called[$eventName])) { + foreach ($this->called[$eventName] as $l) { + if ($l->getWrappedListener() === $listener) { + $called = true; + + break; + } + } + } + + if (!$called) { + $info = $this->getListenerInfo($listener, $eventName); + $notCalled[$eventName.'.'.$info['pretty']] = $info; + } + } + } + + return $notCalled; + } + + /** + * Proxies all method calls to the original event dispatcher. + * + * @param string $method The method name + * @param array $arguments The method arguments + * + * @return mixed + */ + public function __call($method, $arguments) + { + return call_user_func_array(array($this->dispatcher, $method), $arguments); + } + + /** + * Called before dispatching the event. + * + * @param string $eventName The event name + * @param Event $event The event + */ + protected function preDispatch($eventName, Event $event) + { + } + + /** + * Called after dispatching the event. + * + * @param string $eventName The event name + * @param Event $event The event + */ + protected function postDispatch($eventName, Event $event) + { + } + + private function preProcess($eventName) + { + foreach ($this->dispatcher->getListeners($eventName) as $listener) { + $this->dispatcher->removeListener($eventName, $listener); + $info = $this->getListenerInfo($listener, $eventName); + $name = isset($info['class']) ? $info['class'] : $info['type']; + $this->dispatcher->addListener($eventName, new WrappedListener($listener, $name, $this->stopwatch, $this)); + } + } + + private function postProcess($eventName) + { + $skipped = false; + foreach ($this->dispatcher->getListeners($eventName) as $listener) { + if (!$listener instanceof WrappedListener) { // #12845: a new listener was added during dispatch. + continue; + } + // Unwrap listener + $this->dispatcher->removeListener($eventName, $listener); + $this->dispatcher->addListener($eventName, $listener->getWrappedListener()); + + $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName); + if ($listener->wasCalled()) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Notified event "%s" to listener "%s".', $eventName, $info['pretty'])); + } + + if (!isset($this->called[$eventName])) { + $this->called[$eventName] = new \SplObjectStorage(); + } + + $this->called[$eventName]->attach($listener); + } + + if (null !== $this->logger && $skipped) { + $this->logger->debug(sprintf('Listener "%s" was not called for event "%s".', $info['pretty'], $eventName)); + } + + if ($listener->stoppedPropagation()) { + if (null !== $this->logger) { + $this->logger->debug(sprintf('Listener "%s" stopped propagation of the event "%s".', $info['pretty'], $eventName)); + } + + $skipped = true; + } + } + } + + /** + * Returns information about the listener + * + * @param object $listener The listener + * @param string $eventName The event name + * + * @return array Information about the listener + */ + private function getListenerInfo($listener, $eventName) + { + $info = array( + 'event' => $eventName, + ); + if ($listener instanceof \Closure) { + $info += array( + 'type' => 'Closure', + 'pretty' => 'closure', + ); + } elseif (is_string($listener)) { + try { + $r = new \ReflectionFunction($listener); + $file = $r->getFileName(); + $line = $r->getStartLine(); + } catch (\ReflectionException $e) { + $file = null; + $line = null; + } + $info += array( + 'type' => 'Function', + 'function' => $listener, + 'file' => $file, + 'line' => $line, + 'pretty' => $listener, + ); + } elseif (is_array($listener) || (is_object($listener) && is_callable($listener))) { + if (!is_array($listener)) { + $listener = array($listener, '__invoke'); + } + $class = is_object($listener[0]) ? get_class($listener[0]) : $listener[0]; + try { + $r = new \ReflectionMethod($class, $listener[1]); + $file = $r->getFileName(); + $line = $r->getStartLine(); + } catch (\ReflectionException $e) { + $file = null; + $line = null; + } + $info += array( + 'type' => 'Method', + 'class' => $class, + 'method' => $listener[1], + 'file' => $file, + 'line' => $line, + 'pretty' => $class.'::'.$listener[1], + ); + } + + return $info; + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php new file mode 100644 index 0000000..5483e81 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Debug; + +use Symfony\Component\EventDispatcher\EventDispatcherInterface; + +/** + * @author Fabien Potencier + */ +interface TraceableEventDispatcherInterface extends EventDispatcherInterface +{ + /** + * Gets the called listeners. + * + * @return array An array of called listeners + */ + public function getCalledListeners(); + + /** + * Gets the not called listeners. + * + * @return array An array of not called listeners + */ + public function getNotCalledListeners(); +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php new file mode 100644 index 0000000..e16627d --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Debug; + +use Symfony\Component\Stopwatch\Stopwatch; +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; + +/** + * @author Fabien Potencier + */ +class WrappedListener +{ + private $listener; + private $name; + private $called; + private $stoppedPropagation; + private $stopwatch; + private $dispatcher; + + public function __construct($listener, $name, Stopwatch $stopwatch, EventDispatcherInterface $dispatcher = null) + { + $this->listener = $listener; + $this->name = $name; + $this->stopwatch = $stopwatch; + $this->dispatcher = $dispatcher; + $this->called = false; + $this->stoppedPropagation = false; + } + + public function getWrappedListener() + { + return $this->listener; + } + + public function wasCalled() + { + return $this->called; + } + + public function stoppedPropagation() + { + return $this->stoppedPropagation; + } + + public function __invoke(Event $event, $eventName, EventDispatcherInterface $dispatcher) + { + $this->called = true; + + $e = $this->stopwatch->start($this->name, 'event_listener'); + + call_user_func($this->listener, $event, $eventName, $this->dispatcher ?: $dispatcher); + + if ($e->isStarted()) { + $e->stop(); + } + + if ($event->isPropagationStopped()) { + $this->stoppedPropagation = true; + } + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php new file mode 100644 index 0000000..7e74a37 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\DependencyInjection; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; + +/** + * Compiler pass to register tagged services for an event dispatcher. + */ +class RegisterListenersPass implements CompilerPassInterface +{ + /** + * @var string + */ + protected $dispatcherService; + + /** + * @var string + */ + protected $listenerTag; + + /** + * @var string + */ + protected $subscriberTag; + + /** + * Constructor. + * + * @param string $dispatcherService Service name of the event dispatcher in processed container + * @param string $listenerTag Tag name used for listener + * @param string $subscriberTag Tag name used for subscribers + */ + public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber') + { + $this->dispatcherService = $dispatcherService; + $this->listenerTag = $listenerTag; + $this->subscriberTag = $subscriberTag; + } + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { + return; + } + + $definition = $container->findDefinition($this->dispatcherService); + + foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) { + $def = $container->getDefinition($id); + if (!$def->isPublic()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id)); + } + + if ($def->isAbstract()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id)); + } + + foreach ($events as $event) { + $priority = isset($event['priority']) ? $event['priority'] : 0; + + if (!isset($event['event'])) { + throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); + } + + if (!isset($event['method'])) { + $event['method'] = 'on'.preg_replace_callback(array( + '/(?<=\b)[a-z]/i', + '/[^a-z0-9]/i', + ), function ($matches) { return strtoupper($matches[0]); }, $event['event']); + $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); + } + + $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority)); + } + } + + foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) { + $def = $container->getDefinition($id); + if (!$def->isPublic()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id)); + } + + if ($def->isAbstract()) { + throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id)); + } + + // We must assume that the class value has been correctly filled, even if the service is created by a factory + $class = $container->getParameterBag()->resolveValue($def->getClass()); + + $refClass = new \ReflectionClass($class); + $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface'; + if (!$refClass->implementsInterface($interface)) { + throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface)); + } + + $definition->addMethodCall('addSubscriberService', array($id, $class)); + } + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php new file mode 100644 index 0000000..dc39b05 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * Event is the base class for classes containing event data. + * + * This class contains no event data. It is used by events that do not pass + * state information to an event handler when an event is raised. + * + * You can call the method stopPropagation() to abort the execution of + * further listeners in your event listener. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + * + * @api + */ +class Event +{ + /** + * @var bool Whether no further event listeners should be triggered + */ + private $propagationStopped = false; + + /** + * @var EventDispatcher Dispatcher that dispatched this event + */ + private $dispatcher; + + /** + * @var string This event's name + */ + private $name; + + /** + * Returns whether further event listeners should be triggered. + * + * @see Event::stopPropagation() + * + * @return bool Whether propagation was already stopped for this event. + * + * @api + */ + public function isPropagationStopped() + { + return $this->propagationStopped; + } + + /** + * Stops the propagation of the event to further event listeners. + * + * If multiple event listeners are connected to the same event, no + * further event listener will be triggered once any trigger calls + * stopPropagation(). + * + * @api + */ + public function stopPropagation() + { + $this->propagationStopped = true; + } + + /** + * Stores the EventDispatcher that dispatches this Event. + * + * @param EventDispatcherInterface $dispatcher + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call. + * + * @api + */ + public function setDispatcher(EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + + /** + * Returns the EventDispatcher that dispatches this Event. + * + * @return EventDispatcherInterface + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call. + * + * @api + */ + public function getDispatcher() + { + return $this->dispatcher; + } + + /** + * Gets the event's name. + * + * @return string + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. The event name is passed to the listener call. + * + * @api + */ + public function getName() + { + return $this->name; + } + + /** + * Sets the event's name property. + * + * @param string $name The event name. + * + * @deprecated Deprecated in 2.4, to be removed in 3.0. The event name is passed to the listener call. + * + * @api + */ + public function setName($name) + { + $this->name = $name; + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php new file mode 100644 index 0000000..3b032fb --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * The EventDispatcherInterface is the central point of Symfony's event listener system. + * + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + * @author Fabien Potencier + * @author Jordi Boggiano + * @author Jordan Alliot + * + * @api + */ +class EventDispatcher implements EventDispatcherInterface +{ + private $listeners = array(); + private $sorted = array(); + + /** + * @see EventDispatcherInterface::dispatch() + * + * @api + */ + public function dispatch($eventName, Event $event = null) + { + if (null === $event) { + $event = new Event(); + } + + $event->setDispatcher($this); + $event->setName($eventName); + + if (!isset($this->listeners[$eventName])) { + return $event; + } + + $this->doDispatch($this->getListeners($eventName), $eventName, $event); + + return $event; + } + + /** + * @see EventDispatcherInterface::getListeners() + */ + public function getListeners($eventName = null) + { + if (null !== $eventName) { + if (!isset($this->sorted[$eventName])) { + $this->sortListeners($eventName); + } + + return $this->sorted[$eventName]; + } + + foreach (array_keys($this->listeners) as $eventName) { + if (!isset($this->sorted[$eventName])) { + $this->sortListeners($eventName); + } + } + + return array_filter($this->sorted); + } + + /** + * @see EventDispatcherInterface::hasListeners() + */ + public function hasListeners($eventName = null) + { + return (bool) count($this->getListeners($eventName)); + } + + /** + * @see EventDispatcherInterface::addListener() + * + * @api + */ + public function addListener($eventName, $listener, $priority = 0) + { + $this->listeners[$eventName][$priority][] = $listener; + unset($this->sorted[$eventName]); + } + + /** + * @see EventDispatcherInterface::removeListener() + */ + public function removeListener($eventName, $listener) + { + if (!isset($this->listeners[$eventName])) { + return; + } + + foreach ($this->listeners[$eventName] as $priority => $listeners) { + if (false !== ($key = array_search($listener, $listeners, true))) { + unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]); + } + } + } + + /** + * @see EventDispatcherInterface::addSubscriber() + * + * @api + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { + if (is_string($params)) { + $this->addListener($eventName, array($subscriber, $params)); + } elseif (is_string($params[0])) { + $this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0); + } else { + foreach ($params as $listener) { + $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0); + } + } + } + } + + /** + * @see EventDispatcherInterface::removeSubscriber() + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) + { + foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { + if (is_array($params) && is_array($params[0])) { + foreach ($params as $listener) { + $this->removeListener($eventName, array($subscriber, $listener[0])); + } + } else { + $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0])); + } + } + } + + /** + * Triggers the listeners of an event. + * + * This method can be overridden to add functionality that is executed + * for each listener. + * + * @param callable[] $listeners The event listeners. + * @param string $eventName The name of the event to dispatch. + * @param Event $event The event object to pass to the event handlers/listeners. + */ + protected function doDispatch($listeners, $eventName, Event $event) + { + foreach ($listeners as $listener) { + call_user_func($listener, $event, $eventName, $this); + if ($event->isPropagationStopped()) { + break; + } + } + } + + /** + * Sorts the internal list of listeners for the given event by priority. + * + * @param string $eventName The name of the event. + */ + private function sortListeners($eventName) + { + $this->sorted[$eventName] = array(); + + if (isset($this->listeners[$eventName])) { + krsort($this->listeners[$eventName]); + $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]); + } + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php new file mode 100644 index 0000000..efb7c5b --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * The EventDispatcherInterface is the central point of Symfony's event listener system. + * Listeners are registered on the manager and events are dispatched through the + * manager. + * + * @author Bernhard Schussek + * + * @api + */ +interface EventDispatcherInterface +{ + /** + * Dispatches an event to all registered listeners. + * + * @param string $eventName The name of the event to dispatch. The name of + * the event is the name of the method that is + * invoked on listeners. + * @param Event $event The event to pass to the event handlers/listeners. + * If not supplied, an empty Event instance is created. + * + * @return Event + * + * @api + */ + public function dispatch($eventName, Event $event = null); + + /** + * Adds an event listener that listens on the specified events. + * + * @param string $eventName The event to listen on + * @param callable $listener The listener + * @param int $priority The higher this value, the earlier an event + * listener will be triggered in the chain (defaults to 0) + * + * @api + */ + public function addListener($eventName, $listener, $priority = 0); + + /** + * Adds an event subscriber. + * + * The subscriber is asked for all the events he is + * interested in and added as a listener for these events. + * + * @param EventSubscriberInterface $subscriber The subscriber. + * + * @api + */ + public function addSubscriber(EventSubscriberInterface $subscriber); + + /** + * Removes an event listener from the specified events. + * + * @param string $eventName The event to remove a listener from + * @param callable $listener The listener to remove + */ + public function removeListener($eventName, $listener); + + /** + * Removes an event subscriber. + * + * @param EventSubscriberInterface $subscriber The subscriber + */ + public function removeSubscriber(EventSubscriberInterface $subscriber); + + /** + * Gets the listeners of a specific event or all listeners. + * + * @param string $eventName The name of the event + * + * @return array The event listeners for the specified event, or all event listeners by event name + */ + public function getListeners($eventName = null); + + /** + * Checks whether an event has any registered listeners. + * + * @param string $eventName The name of the event + * + * @return bool true if the specified event has any listeners, false otherwise + */ + public function hasListeners($eventName = null); +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php new file mode 100644 index 0000000..ff7e305 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * An EventSubscriber knows himself what events he is interested in. + * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes + * {@link getSubscribedEvents} and registers the subscriber as a listener for all + * returned events. + * + * @author Guilherme Blanco + * @author Jonathan Wage + * @author Roman Borschel + * @author Bernhard Schussek + * + * @api + */ +interface EventSubscriberInterface +{ + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents(); +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php new file mode 100644 index 0000000..a8955ca --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php @@ -0,0 +1,186 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * Event encapsulation class. + * + * Encapsulates events thus decoupling the observer from the subject they encapsulate. + * + * @author Drak + */ +class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate +{ + /** + * Event subject. + * + * @var mixed usually object or callable + */ + protected $subject; + + /** + * Array of arguments. + * + * @var array + */ + protected $arguments; + + /** + * Encapsulate an event with $subject and $args. + * + * @param mixed $subject The subject of the event, usually an object. + * @param array $arguments Arguments to store in the event. + */ + public function __construct($subject = null, array $arguments = array()) + { + $this->subject = $subject; + $this->arguments = $arguments; + } + + /** + * Getter for subject property. + * + * @return mixed $subject The observer subject. + */ + public function getSubject() + { + return $this->subject; + } + + /** + * Get argument by key. + * + * @param string $key Key. + * + * @throws \InvalidArgumentException If key is not found. + * + * @return mixed Contents of array key. + */ + public function getArgument($key) + { + if ($this->hasArgument($key)) { + return $this->arguments[$key]; + } + + throw new \InvalidArgumentException(sprintf('%s not found in %s', $key, $this->getName())); + } + + /** + * Add argument to event. + * + * @param string $key Argument name. + * @param mixed $value Value. + * + * @return GenericEvent + */ + public function setArgument($key, $value) + { + $this->arguments[$key] = $value; + + return $this; + } + + /** + * Getter for all arguments. + * + * @return array + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * Set args property. + * + * @param array $args Arguments. + * + * @return GenericEvent + */ + public function setArguments(array $args = array()) + { + $this->arguments = $args; + + return $this; + } + + /** + * Has argument. + * + * @param string $key Key of arguments array. + * + * @return bool + */ + public function hasArgument($key) + { + return array_key_exists($key, $this->arguments); + } + + /** + * ArrayAccess for argument getter. + * + * @param string $key Array key. + * + * @throws \InvalidArgumentException If key does not exist in $this->args. + * + * @return mixed + */ + public function offsetGet($key) + { + return $this->getArgument($key); + } + + /** + * ArrayAccess for argument setter. + * + * @param string $key Array key to set. + * @param mixed $value Value. + */ + public function offsetSet($key, $value) + { + $this->setArgument($key, $value); + } + + /** + * ArrayAccess for unset argument. + * + * @param string $key Array key. + */ + public function offsetUnset($key) + { + if ($this->hasArgument($key)) { + unset($this->arguments[$key]); + } + } + + /** + * ArrayAccess has argument. + * + * @param string $key Array key. + * + * @return bool + */ + public function offsetExists($key) + { + return $this->hasArgument($key); + } + + /** + * IteratorAggregate for iterating over the object like an array. + * + * @return \ArrayIterator + */ + public function getIterator() + { + return new \ArrayIterator($this->arguments); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php new file mode 100644 index 0000000..7ef9ece --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher; + +/** + * A read-only proxy for an event dispatcher. + * + * @author Bernhard Schussek + */ +class ImmutableEventDispatcher implements EventDispatcherInterface +{ + /** + * The proxied dispatcher. + * + * @var EventDispatcherInterface + */ + private $dispatcher; + + /** + * Creates an unmodifiable proxy for an event dispatcher. + * + * @param EventDispatcherInterface $dispatcher The proxied event dispatcher. + */ + public function __construct(EventDispatcherInterface $dispatcher) + { + $this->dispatcher = $dispatcher; + } + + /** + * {@inheritdoc} + */ + public function dispatch($eventName, Event $event = null) + { + return $this->dispatcher->dispatch($eventName, $event); + } + + /** + * {@inheritdoc} + */ + public function addListener($eventName, $listener, $priority = 0) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function addSubscriber(EventSubscriberInterface $subscriber) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function removeListener($eventName, $listener) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function removeSubscriber(EventSubscriberInterface $subscriber) + { + throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); + } + + /** + * {@inheritdoc} + */ + public function getListeners($eventName = null) + { + return $this->dispatcher->getListeners($eventName); + } + + /** + * {@inheritdoc} + */ + public function hasListeners($eventName = null) + { + return $this->dispatcher->hasListeners($eventName); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE new file mode 100644 index 0000000..43028bc --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2015 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md new file mode 100644 index 0000000..0fbc35e --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md @@ -0,0 +1,27 @@ +EventDispatcher Component +========================= + +The Symfony EventDispatcher component implements the Mediator pattern in a +simple and effective way to make your projects truly extensible. + +```php +use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\EventDispatcher\Event; + +$dispatcher = new EventDispatcher(); + +$dispatcher->addListener('event_name', function (Event $event) { + // ... +}); + +$dispatcher->dispatch('event_name'); +``` + +Resources +--------- + +You can run the unit tests with the following command: + + $ cd path/to/Symfony/Component/EventDispatcher/ + $ composer.phar install + $ phpunit diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/AbstractEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/AbstractEventDispatcherTest.php new file mode 100644 index 0000000..b9e4194 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/AbstractEventDispatcherTest.php @@ -0,0 +1,369 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests; + +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +abstract class AbstractEventDispatcherTest extends \PHPUnit_Framework_TestCase +{ + /* Some pseudo events */ + const preFoo = 'pre.foo'; + const postFoo = 'post.foo'; + const preBar = 'pre.bar'; + const postBar = 'post.bar'; + + /** + * @var EventDispatcher + */ + private $dispatcher; + + private $listener; + + protected function setUp() + { + $this->dispatcher = $this->createEventDispatcher(); + $this->listener = new TestEventListener(); + } + + protected function tearDown() + { + $this->dispatcher = null; + $this->listener = null; + } + + abstract protected function createEventDispatcher(); + + public function testInitialState() + { + $this->assertEquals(array(), $this->dispatcher->getListeners()); + $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); + $this->assertFalse($this->dispatcher->hasListeners(self::postFoo)); + } + + public function testAddListener() + { + $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo')); + $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo')); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); + $this->assertCount(1, $this->dispatcher->getListeners(self::preFoo)); + $this->assertCount(1, $this->dispatcher->getListeners(self::postFoo)); + $this->assertCount(2, $this->dispatcher->getListeners()); + } + + public function testGetListenersSortsByPriority() + { + $listener1 = new TestEventListener(); + $listener2 = new TestEventListener(); + $listener3 = new TestEventListener(); + $listener1->name = '1'; + $listener2->name = '2'; + $listener3->name = '3'; + + $this->dispatcher->addListener('pre.foo', array($listener1, 'preFoo'), -10); + $this->dispatcher->addListener('pre.foo', array($listener2, 'preFoo'), 10); + $this->dispatcher->addListener('pre.foo', array($listener3, 'preFoo')); + + $expected = array( + array($listener2, 'preFoo'), + array($listener3, 'preFoo'), + array($listener1, 'preFoo'), + ); + + $this->assertSame($expected, $this->dispatcher->getListeners('pre.foo')); + } + + public function testGetAllListenersSortsByPriority() + { + $listener1 = new TestEventListener(); + $listener2 = new TestEventListener(); + $listener3 = new TestEventListener(); + $listener4 = new TestEventListener(); + $listener5 = new TestEventListener(); + $listener6 = new TestEventListener(); + + $this->dispatcher->addListener('pre.foo', $listener1, -10); + $this->dispatcher->addListener('pre.foo', $listener2); + $this->dispatcher->addListener('pre.foo', $listener3, 10); + $this->dispatcher->addListener('post.foo', $listener4, -10); + $this->dispatcher->addListener('post.foo', $listener5); + $this->dispatcher->addListener('post.foo', $listener6, 10); + + $expected = array( + 'pre.foo' => array($listener3, $listener2, $listener1), + 'post.foo' => array($listener6, $listener5, $listener4), + ); + + $this->assertSame($expected, $this->dispatcher->getListeners()); + } + + public function testDispatch() + { + $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo')); + $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo')); + $this->dispatcher->dispatch(self::preFoo); + $this->assertTrue($this->listener->preFooInvoked); + $this->assertFalse($this->listener->postFooInvoked); + $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch('noevent')); + $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch(self::preFoo)); + $event = new Event(); + $return = $this->dispatcher->dispatch(self::preFoo, $event); + $this->assertEquals('pre.foo', $event->getName()); + $this->assertSame($event, $return); + } + + public function testDispatchForClosure() + { + $invoked = 0; + $listener = function () use (&$invoked) { + $invoked++; + }; + $this->dispatcher->addListener('pre.foo', $listener); + $this->dispatcher->addListener('post.foo', $listener); + $this->dispatcher->dispatch(self::preFoo); + $this->assertEquals(1, $invoked); + } + + public function testStopEventPropagation() + { + $otherListener = new TestEventListener(); + + // postFoo() stops the propagation, so only one listener should + // be executed + // Manually set priority to enforce $this->listener to be called first + $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'), 10); + $this->dispatcher->addListener('post.foo', array($otherListener, 'preFoo')); + $this->dispatcher->dispatch(self::postFoo); + $this->assertTrue($this->listener->postFooInvoked); + $this->assertFalse($otherListener->postFooInvoked); + } + + public function testDispatchByPriority() + { + $invoked = array(); + $listener1 = function () use (&$invoked) { + $invoked[] = '1'; + }; + $listener2 = function () use (&$invoked) { + $invoked[] = '2'; + }; + $listener3 = function () use (&$invoked) { + $invoked[] = '3'; + }; + $this->dispatcher->addListener('pre.foo', $listener1, -10); + $this->dispatcher->addListener('pre.foo', $listener2); + $this->dispatcher->addListener('pre.foo', $listener3, 10); + $this->dispatcher->dispatch(self::preFoo); + $this->assertEquals(array('3', '2', '1'), $invoked); + } + + public function testRemoveListener() + { + $this->dispatcher->addListener('pre.bar', $this->listener); + $this->assertTrue($this->dispatcher->hasListeners(self::preBar)); + $this->dispatcher->removeListener('pre.bar', $this->listener); + $this->assertFalse($this->dispatcher->hasListeners(self::preBar)); + $this->dispatcher->removeListener('notExists', $this->listener); + } + + public function testAddSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->dispatcher->addSubscriber($eventSubscriber); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); + } + + public function testAddSubscriberWithPriorities() + { + $eventSubscriber = new TestEventSubscriber(); + $this->dispatcher->addSubscriber($eventSubscriber); + + $eventSubscriber = new TestEventSubscriberWithPriorities(); + $this->dispatcher->addSubscriber($eventSubscriber); + + $listeners = $this->dispatcher->getListeners('pre.foo'); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->assertCount(2, $listeners); + $this->assertInstanceOf('Symfony\Component\EventDispatcher\Tests\TestEventSubscriberWithPriorities', $listeners[0][0]); + } + + public function testAddSubscriberWithMultipleListeners() + { + $eventSubscriber = new TestEventSubscriberWithMultipleListeners(); + $this->dispatcher->addSubscriber($eventSubscriber); + + $listeners = $this->dispatcher->getListeners('pre.foo'); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->assertCount(2, $listeners); + $this->assertEquals('preFoo2', $listeners[0][1]); + } + + public function testRemoveSubscriber() + { + $eventSubscriber = new TestEventSubscriber(); + $this->dispatcher->addSubscriber($eventSubscriber); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->assertTrue($this->dispatcher->hasListeners(self::postFoo)); + $this->dispatcher->removeSubscriber($eventSubscriber); + $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); + $this->assertFalse($this->dispatcher->hasListeners(self::postFoo)); + } + + public function testRemoveSubscriberWithPriorities() + { + $eventSubscriber = new TestEventSubscriberWithPriorities(); + $this->dispatcher->addSubscriber($eventSubscriber); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->dispatcher->removeSubscriber($eventSubscriber); + $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); + } + + public function testRemoveSubscriberWithMultipleListeners() + { + $eventSubscriber = new TestEventSubscriberWithMultipleListeners(); + $this->dispatcher->addSubscriber($eventSubscriber); + $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); + $this->assertCount(2, $this->dispatcher->getListeners(self::preFoo)); + $this->dispatcher->removeSubscriber($eventSubscriber); + $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); + } + + public function testEventReceivesTheDispatcherInstance() + { + $dispatcher = null; + $this->dispatcher->addListener('test', function ($event) use (&$dispatcher) { + $dispatcher = $event->getDispatcher(); + }); + $this->dispatcher->dispatch('test'); + $this->assertSame($this->dispatcher, $dispatcher); + } + + public function testEventReceivesTheDispatcherInstanceAsArgument() + { + $listener = new TestWithDispatcher(); + $this->dispatcher->addListener('test', array($listener, 'foo')); + $this->assertNull($listener->name); + $this->assertNull($listener->dispatcher); + $this->dispatcher->dispatch('test'); + $this->assertEquals('test', $listener->name); + $this->assertSame($this->dispatcher, $listener->dispatcher); + } + + /** + * @see https://bugs.php.net/bug.php?id=62976 + * + * This bug affects: + * - The PHP 5.3 branch for versions < 5.3.18 + * - The PHP 5.4 branch for versions < 5.4.8 + * - The PHP 5.5 branch is not affected + */ + public function testWorkaroundForPhpBug62976() + { + $dispatcher = $this->createEventDispatcher(); + $dispatcher->addListener('bug.62976', new CallableClass()); + $dispatcher->removeListener('bug.62976', function () {}); + $this->assertTrue($dispatcher->hasListeners('bug.62976')); + } + + public function testHasListenersWhenAddedCallbackListenerIsRemoved() + { + $listener = function () {}; + $this->dispatcher->addListener('foo', $listener); + $this->dispatcher->removeListener('foo', $listener); + $this->assertFalse($this->dispatcher->hasListeners()); + } + + public function testGetListenersWhenAddedCallbackListenerIsRemoved() + { + $listener = function () {}; + $this->dispatcher->addListener('foo', $listener); + $this->dispatcher->removeListener('foo', $listener); + $this->assertSame(array(), $this->dispatcher->getListeners()); + } + + public function testHasListenersWithoutEventsReturnsFalseAfterHasListenersWithEventHasBeenCalled() + { + $this->assertFalse($this->dispatcher->hasListeners('foo')); + $this->assertFalse($this->dispatcher->hasListeners()); + } +} + +class CallableClass +{ + public function __invoke() + { + } +} + +class TestEventListener +{ + public $preFooInvoked = false; + public $postFooInvoked = false; + + /* Listener methods */ + + public function preFoo(Event $e) + { + $this->preFooInvoked = true; + } + + public function postFoo(Event $e) + { + $this->postFooInvoked = true; + + $e->stopPropagation(); + } +} + +class TestWithDispatcher +{ + public $name; + public $dispatcher; + + public function foo(Event $e, $name, $dispatcher) + { + $this->name = $name; + $this->dispatcher = $dispatcher; + } +} + +class TestEventSubscriber implements EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + return array('pre.foo' => 'preFoo', 'post.foo' => 'postFoo'); + } +} + +class TestEventSubscriberWithPriorities implements EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + return array( + 'pre.foo' => array('preFoo', 10), + 'post.foo' => array('postFoo'), + ); + } +} + +class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + return array('pre.foo' => array( + array('preFoo1'), + array('preFoo2', 10), + )); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php new file mode 100644 index 0000000..6f2fbcb --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php @@ -0,0 +1,249 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests; + +use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\DependencyInjection\Scope; +use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher; +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; + +class ContainerAwareEventDispatcherTest extends AbstractEventDispatcherTest +{ + protected function createEventDispatcher() + { + $container = new Container(); + + return new ContainerAwareEventDispatcher($container); + } + + public function testAddAListenerService() + { + $event = new Event(); + + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $service + ->expects($this->once()) + ->method('onEvent') + ->with($event) + ; + + $container = new Container(); + $container->set('service.listener', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + + $dispatcher->dispatch('onEvent', $event); + } + + public function testAddASubscriberService() + { + $event = new Event(); + + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\SubscriberService'); + + $service + ->expects($this->once()) + ->method('onEvent') + ->with($event) + ; + + $container = new Container(); + $container->set('service.subscriber', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addSubscriberService('service.subscriber', 'Symfony\Component\EventDispatcher\Tests\SubscriberService'); + + $dispatcher->dispatch('onEvent', $event); + } + + public function testPreventDuplicateListenerService() + { + $event = new Event(); + + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $service + ->expects($this->once()) + ->method('onEvent') + ->with($event) + ; + + $container = new Container(); + $container->set('service.listener', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 5); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 10); + + $dispatcher->dispatch('onEvent', $event); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testTriggerAListenerServiceOutOfScope() + { + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $scope = new Scope('scope'); + $container = new Container(); + $container->addScope($scope); + $container->enterScope('scope'); + + $container->set('service.listener', $service, 'scope'); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + + $container->leaveScope('scope'); + $dispatcher->dispatch('onEvent'); + } + + public function testReEnteringAScope() + { + $event = new Event(); + + $service1 = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $service1 + ->expects($this->exactly(2)) + ->method('onEvent') + ->with($event) + ; + + $scope = new Scope('scope'); + $container = new Container(); + $container->addScope($scope); + $container->enterScope('scope'); + + $container->set('service.listener', $service1, 'scope'); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + $dispatcher->dispatch('onEvent', $event); + + $service2 = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $service2 + ->expects($this->once()) + ->method('onEvent') + ->with($event) + ; + + $container->enterScope('scope'); + $container->set('service.listener', $service2, 'scope'); + + $dispatcher->dispatch('onEvent', $event); + + $container->leaveScope('scope'); + + $dispatcher->dispatch('onEvent'); + } + + public function testHasListenersOnLazyLoad() + { + $event = new Event(); + + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $container = new Container(); + $container->set('service.listener', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + + $event->setDispatcher($dispatcher); + $event->setName('onEvent'); + + $service + ->expects($this->once()) + ->method('onEvent') + ->with($event) + ; + + $this->assertTrue($dispatcher->hasListeners()); + + if ($dispatcher->hasListeners('onEvent')) { + $dispatcher->dispatch('onEvent'); + } + } + + public function testGetListenersOnLazyLoad() + { + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $container = new Container(); + $container->set('service.listener', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + + $listeners = $dispatcher->getListeners(); + + $this->assertTrue(isset($listeners['onEvent'])); + + $this->assertCount(1, $dispatcher->getListeners('onEvent')); + } + + public function testRemoveAfterDispatch() + { + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $container = new Container(); + $container->set('service.listener', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + + $dispatcher->dispatch('onEvent', new Event()); + $dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent')); + $this->assertFalse($dispatcher->hasListeners('onEvent')); + } + + public function testRemoveBeforeDispatch() + { + $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service'); + + $container = new Container(); + $container->set('service.listener', $service); + + $dispatcher = new ContainerAwareEventDispatcher($container); + $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent')); + + $dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent')); + $this->assertFalse($dispatcher->hasListeners('onEvent')); + } +} + +class Service +{ + public function onEvent(Event $e) + { + } +} + +class SubscriberService implements EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + return array( + 'onEvent' => array('onEvent'), + ); + } + + public function onEvent(Event $e) + { + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php new file mode 100644 index 0000000..68b9523 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php @@ -0,0 +1,185 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests\Debug; + +use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\Stopwatch\Stopwatch; + +class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase +{ + public function testAddRemoveListener() + { + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); + + $tdispatcher->addListener('foo', $listener = function () {; }); + $listeners = $dispatcher->getListeners('foo'); + $this->assertCount(1, $listeners); + $this->assertSame($listener, $listeners[0]); + + $tdispatcher->removeListener('foo', $listener); + $this->assertCount(0, $dispatcher->getListeners('foo')); + } + + public function testGetListeners() + { + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); + + $tdispatcher->addListener('foo', $listener = function () {; }); + $this->assertSame($dispatcher->getListeners('foo'), $tdispatcher->getListeners('foo')); + } + + public function testHasListeners() + { + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); + + $this->assertFalse($dispatcher->hasListeners('foo')); + $this->assertFalse($tdispatcher->hasListeners('foo')); + + $tdispatcher->addListener('foo', $listener = function () {; }); + $this->assertTrue($dispatcher->hasListeners('foo')); + $this->assertTrue($tdispatcher->hasListeners('foo')); + } + + public function testAddRemoveSubscriber() + { + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); + + $subscriber = new EventSubscriber(); + + $tdispatcher->addSubscriber($subscriber); + $listeners = $dispatcher->getListeners('foo'); + $this->assertCount(1, $listeners); + $this->assertSame(array($subscriber, 'call'), $listeners[0]); + + $tdispatcher->removeSubscriber($subscriber); + $this->assertCount(0, $dispatcher->getListeners('foo')); + } + + public function testGetCalledListeners() + { + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); + $tdispatcher->addListener('foo', $listener = function () {; }); + + $this->assertEquals(array(), $tdispatcher->getCalledListeners()); + $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getNotCalledListeners()); + + $tdispatcher->dispatch('foo'); + + $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getCalledListeners()); + $this->assertEquals(array(), $tdispatcher->getNotCalledListeners()); + } + + public function testGetCalledListenersNested() + { + $tdispatcher = null; + $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch()); + $dispatcher->addListener('foo', function (Event $event, $eventName, $dispatcher) use (&$tdispatcher) { + $tdispatcher = $dispatcher; + $dispatcher->dispatch('bar'); + }); + $dispatcher->addListener('bar', function (Event $event) {}); + $dispatcher->dispatch('foo'); + $this->assertSame($dispatcher, $tdispatcher); + $this->assertCount(2, $dispatcher->getCalledListeners()); + } + + public function testLogger() + { + $logger = $this->getMock('Psr\Log\LoggerInterface'); + + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger); + $tdispatcher->addListener('foo', $listener1 = function () {; }); + $tdispatcher->addListener('foo', $listener2 = function () {; }); + + $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\"."); + $logger->expects($this->at(1))->method('debug')->with("Notified event \"foo\" to listener \"closure\"."); + + $tdispatcher->dispatch('foo'); + } + + public function testLoggerWithStoppedEvent() + { + $logger = $this->getMock('Psr\Log\LoggerInterface'); + + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger); + $tdispatcher->addListener('foo', $listener1 = function (Event $event) { $event->stopPropagation(); }); + $tdispatcher->addListener('foo', $listener2 = function () {; }); + + $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\"."); + $logger->expects($this->at(1))->method('debug')->with("Listener \"closure\" stopped propagation of the event \"foo\"."); + $logger->expects($this->at(2))->method('debug')->with("Listener \"closure\" was not called for event \"foo\"."); + + $tdispatcher->dispatch('foo'); + } + + public function testDispatchCallListeners() + { + $called = array(); + + $dispatcher = new EventDispatcher(); + $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); + $tdispatcher->addListener('foo', $listener1 = function () use (&$called) { $called[] = 'foo1'; }); + $tdispatcher->addListener('foo', $listener2 = function () use (&$called) { $called[] = 'foo2'; }); + + $tdispatcher->dispatch('foo'); + + $this->assertEquals(array('foo1', 'foo2'), $called); + } + + public function testDispatchNested() + { + $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch()); + $loop = 1; + $dispatcher->addListener('foo', $listener1 = function () use ($dispatcher, &$loop) { + ++$loop; + if (2 == $loop) { + $dispatcher->dispatch('foo'); + } + }); + + $dispatcher->dispatch('foo'); + } + + public function testDispatchReusedEventNested() + { + $nestedCall = false; + $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch()); + $dispatcher->addListener('foo', function (Event $e) use ($dispatcher) { + $dispatcher->dispatch('bar', $e); + }); + $dispatcher->addListener('bar', function (Event $e) use (&$nestedCall) { + $nestedCall = true; + }); + + $this->assertFalse($nestedCall); + $dispatcher->dispatch('foo'); + $this->assertTrue($nestedCall); + } +} + +class EventSubscriber implements EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + return array('foo' => 'call'); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php new file mode 100644 index 0000000..0fdd637 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php @@ -0,0 +1,200 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests\DependencyInjection; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass; + +class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase +{ + /** + * Tests that event subscribers not implementing EventSubscriberInterface + * trigger an exception. + * + * @expectedException \InvalidArgumentException + */ + public function testEventSubscriberWithoutInterface() + { + // one service, not implementing any interface + $services = array( + 'my_event_subscriber' => array(0 => array()), + ); + + $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition'); + $definition->expects($this->atLeastOnce()) + ->method('isPublic') + ->will($this->returnValue(true)); + $definition->expects($this->atLeastOnce()) + ->method('getClass') + ->will($this->returnValue('stdClass')); + + $builder = $this->getMock( + 'Symfony\Component\DependencyInjection\ContainerBuilder', + array('hasDefinition', 'findTaggedServiceIds', 'getDefinition') + ); + $builder->expects($this->any()) + ->method('hasDefinition') + ->will($this->returnValue(true)); + + // We don't test kernel.event_listener here + $builder->expects($this->atLeastOnce()) + ->method('findTaggedServiceIds') + ->will($this->onConsecutiveCalls(array(), $services)); + + $builder->expects($this->atLeastOnce()) + ->method('getDefinition') + ->will($this->returnValue($definition)); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($builder); + } + + public function testValidEventSubscriber() + { + $services = array( + 'my_event_subscriber' => array(0 => array()), + ); + + $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition'); + $definition->expects($this->atLeastOnce()) + ->method('isPublic') + ->will($this->returnValue(true)); + $definition->expects($this->atLeastOnce()) + ->method('getClass') + ->will($this->returnValue('Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService')); + + $builder = $this->getMock( + 'Symfony\Component\DependencyInjection\ContainerBuilder', + array('hasDefinition', 'findTaggedServiceIds', 'getDefinition', 'findDefinition') + ); + $builder->expects($this->any()) + ->method('hasDefinition') + ->will($this->returnValue(true)); + + // We don't test kernel.event_listener here + $builder->expects($this->atLeastOnce()) + ->method('findTaggedServiceIds') + ->will($this->onConsecutiveCalls(array(), $services)); + + $builder->expects($this->atLeastOnce()) + ->method('getDefinition') + ->will($this->returnValue($definition)); + + $builder->expects($this->atLeastOnce()) + ->method('findDefinition') + ->will($this->returnValue($definition)); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($builder); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The service "foo" must be public as event listeners are lazy-loaded. + */ + public function testPrivateEventListener() + { + $container = new ContainerBuilder(); + $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_listener', array()); + $container->register('event_dispatcher', 'stdClass'); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($container); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The service "foo" must be public as event subscribers are lazy-loaded. + */ + public function testPrivateEventSubscriber() + { + $container = new ContainerBuilder(); + $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_subscriber', array()); + $container->register('event_dispatcher', 'stdClass'); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($container); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The service "foo" must not be abstract as event listeners are lazy-loaded. + */ + public function testAbstractEventListener() + { + $container = new ContainerBuilder(); + $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_listener', array()); + $container->register('event_dispatcher', 'stdClass'); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($container); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The service "foo" must not be abstract as event subscribers are lazy-loaded. + */ + public function testAbstractEventSubscriber() + { + $container = new ContainerBuilder(); + $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array()); + $container->register('event_dispatcher', 'stdClass'); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($container); + } + + public function testEventSubscriberResolvableClassName() + { + $container = new ContainerBuilder(); + + $container->setParameter('subscriber.class', 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService'); + $container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array()); + $container->register('event_dispatcher', 'stdClass'); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($container); + + $definition = $container->getDefinition('event_dispatcher'); + $expected_calls = array( + array( + 'addSubscriberService', + array( + 'foo', + 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService', + ), + ), + ); + $this->assertSame($expected_calls, $definition->getMethodCalls()); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage You have requested a non-existent parameter "subscriber.class" + */ + public function testEventSubscriberUnresolvableClassName() + { + $container = new ContainerBuilder(); + $container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array()); + $container->register('event_dispatcher', 'stdClass'); + + $registerListenersPass = new RegisterListenersPass(); + $registerListenersPass->process($container); + } +} + +class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface +{ + public static function getSubscribedEvents() + { + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php new file mode 100644 index 0000000..5faa5c8 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests; + +use Symfony\Component\EventDispatcher\EventDispatcher; + +class EventDispatcherTest extends AbstractEventDispatcherTest +{ + protected function createEventDispatcher() + { + return new EventDispatcher(); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php new file mode 100644 index 0000000..8f2fb73 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests; + +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\EventDispatcher; + +/** + * Test class for Event. + */ +class EventTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Symfony\Component\EventDispatcher\Event + */ + protected $event; + + /** + * @var \Symfony\Component\EventDispatcher\EventDispatcher + */ + protected $dispatcher; + + /** + * Sets up the fixture, for example, opens a network connection. + * This method is called before a test is executed. + */ + protected function setUp() + { + $this->event = new Event(); + $this->dispatcher = new EventDispatcher(); + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + */ + protected function tearDown() + { + $this->event = null; + $this->dispatcher = null; + } + + public function testIsPropagationStopped() + { + $this->assertFalse($this->event->isPropagationStopped()); + } + + public function testStopPropagationAndIsPropagationStopped() + { + $this->event->stopPropagation(); + $this->assertTrue($this->event->isPropagationStopped()); + } + + public function testLegacySetDispatcher() + { + $this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED); + $this->event->setDispatcher($this->dispatcher); + $this->assertSame($this->dispatcher, $this->event->getDispatcher()); + } + + public function testLegacyGetDispatcher() + { + $this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED); + $this->assertNull($this->event->getDispatcher()); + } + + public function testLegacyGetName() + { + $this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED); + $this->assertNull($this->event->getName()); + } + + public function testLegacySetName() + { + $this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED); + $this->event->setName('foo'); + $this->assertEquals('foo', $this->event->getName()); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php new file mode 100644 index 0000000..aebd82d --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php @@ -0,0 +1,139 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests; + +use Symfony\Component\EventDispatcher\GenericEvent; + +/** + * Test class for Event. + */ +class GenericEventTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var GenericEvent + */ + private $event; + + private $subject; + + /** + * Prepares the environment before running a test. + */ + protected function setUp() + { + parent::setUp(); + + $this->subject = new \stdClass(); + $this->event = new GenericEvent($this->subject, array('name' => 'Event')); + } + + /** + * Cleans up the environment after running a test. + */ + protected function tearDown() + { + $this->subject = null; + $this->event = null; + + parent::tearDown(); + } + + public function testConstruct() + { + $this->assertEquals($this->event, new GenericEvent($this->subject, array('name' => 'Event'))); + } + + /** + * Tests Event->getArgs(). + */ + public function testGetArguments() + { + // test getting all + $this->assertSame(array('name' => 'Event'), $this->event->getArguments()); + } + + public function testSetArguments() + { + $result = $this->event->setArguments(array('foo' => 'bar')); + $this->assertAttributeSame(array('foo' => 'bar'), 'arguments', $this->event); + $this->assertSame($this->event, $result); + } + + public function testSetArgument() + { + $result = $this->event->setArgument('foo2', 'bar2'); + $this->assertAttributeSame(array('name' => 'Event', 'foo2' => 'bar2'), 'arguments', $this->event); + $this->assertEquals($this->event, $result); + } + + public function testGetArgument() + { + // test getting key + $this->assertEquals('Event', $this->event->getArgument('name')); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testGetArgException() + { + $this->event->getArgument('nameNotExist'); + } + + public function testOffsetGet() + { + // test getting key + $this->assertEquals('Event', $this->event['name']); + + // test getting invalid arg + $this->setExpectedException('InvalidArgumentException'); + $this->assertFalse($this->event['nameNotExist']); + } + + public function testOffsetSet() + { + $this->event['foo2'] = 'bar2'; + $this->assertAttributeSame(array('name' => 'Event', 'foo2' => 'bar2'), 'arguments', $this->event); + } + + public function testOffsetUnset() + { + unset($this->event['name']); + $this->assertAttributeSame(array(), 'arguments', $this->event); + } + + public function testOffsetIsset() + { + $this->assertTrue(isset($this->event['name'])); + $this->assertFalse(isset($this->event['nameNotExist'])); + } + + public function testHasArgument() + { + $this->assertTrue($this->event->hasArgument('name')); + $this->assertFalse($this->event->hasArgument('nameNotExist')); + } + + public function testGetSubject() + { + $this->assertSame($this->subject, $this->event->getSubject()); + } + + public function testHasIterator() + { + $data = array(); + foreach ($this->event as $key => $value) { + $data[$key] = $value; + } + $this->assertEquals(array('name' => 'Event'), $data); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php new file mode 100644 index 0000000..80a7e43 --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\EventDispatcher\Tests; + +use Symfony\Component\EventDispatcher\Event; +use Symfony\Component\EventDispatcher\ImmutableEventDispatcher; + +/** + * @author Bernhard Schussek + */ +class ImmutableEventDispatcherTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $innerDispatcher; + + /** + * @var ImmutableEventDispatcher + */ + private $dispatcher; + + protected function setUp() + { + $this->innerDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'); + $this->dispatcher = new ImmutableEventDispatcher($this->innerDispatcher); + } + + public function testDispatchDelegates() + { + $event = new Event(); + + $this->innerDispatcher->expects($this->once()) + ->method('dispatch') + ->with('event', $event) + ->will($this->returnValue('result')); + + $this->assertSame('result', $this->dispatcher->dispatch('event', $event)); + } + + public function testGetListenersDelegates() + { + $this->innerDispatcher->expects($this->once()) + ->method('getListeners') + ->with('event') + ->will($this->returnValue('result')); + + $this->assertSame('result', $this->dispatcher->getListeners('event')); + } + + public function testHasListenersDelegates() + { + $this->innerDispatcher->expects($this->once()) + ->method('hasListeners') + ->with('event') + ->will($this->returnValue('result')); + + $this->assertSame('result', $this->dispatcher->hasListeners('event')); + } + + /** + * @expectedException \BadMethodCallException + */ + public function testAddListenerDisallowed() + { + $this->dispatcher->addListener('event', function () { return 'foo'; }); + } + + /** + * @expectedException \BadMethodCallException + */ + public function testAddSubscriberDisallowed() + { + $subscriber = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface'); + + $this->dispatcher->addSubscriber($subscriber); + } + + /** + * @expectedException \BadMethodCallException + */ + public function testRemoveListenerDisallowed() + { + $this->dispatcher->removeListener('event', function () { return 'foo'; }); + } + + /** + * @expectedException \BadMethodCallException + */ + public function testRemoveSubscriberDisallowed() + { + $subscriber = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface'); + + $this->dispatcher->removeSubscriber($subscriber); + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json new file mode 100644 index 0000000..6c58d4e --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json @@ -0,0 +1,42 @@ +{ + "name": "symfony/event-dispatcher", + "type": "library", + "description": "Symfony EventDispatcher Component", + "keywords": [], + "homepage": "http://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/config": "~2.0,>=2.0.5", + "symfony/stopwatch": "~2.3", + "psr/log": "~1.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "autoload": { + "psr-0": { "Symfony\\Component\\EventDispatcher\\": "" } + }, + "target-dir": "Symfony/Component/EventDispatcher", + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + } +} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist new file mode 100644 index 0000000..9a7728e --- /dev/null +++ b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist @@ -0,0 +1,29 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Resources + ./Tests + ./vendor + + + +