From 93acbe91f19bcc4ea56fcd7e107d882537569e12 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 18 Jun 2021 23:39:22 +0200 Subject: [PATCH 01/29] AssimpImporter: import animations --- .../AssimpImporter/AssimpImporter.conf | 16 ++ .../AssimpImporter/AssimpImporter.cpp | 248 +++++++++++++++++- .../AssimpImporter/AssimpImporter.h | 5 + 3 files changed, 268 insertions(+), 1 deletion(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf b/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf index b339675e7..fbd409a2f 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf @@ -29,6 +29,22 @@ provides=XglImporter # Controls the workaround for an Assimp 4.1 "white ambient" bug forceWhiteAmbientToBlack=true +# Optimize imported linearly-interpolated quaternion animation tracks to +# ensure shortest path is always chosen. This can be controlled separately for +# each animation import. +optimizeQuaternionShortestPath=true + +# Normalize quaternion animation tracks, if they are not already. +# This can be controlled separately for each object/animation import. +normalizeQuaternions=true + +# Merge all animations into a single clip. Useful for preserving cinematic +# animations when using the Blender glTF exporter, as it exports animation of +# every object as a separate clip. See https://blender.stackexchange.com/q/5689 +# and https://github.com/KhronosGroup/glTF-Blender-Exporter/pull/166 for more +# information. +mergeAnimationClips=false + # AI_CONFIG_* values, can be changed only before the first file is opened ImportColladaIgnoreUpDirection=false diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index f22f12b37..4da535b68 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -54,12 +55,13 @@ #include #include -#include #include #include +#include #include #include #include +#include #include namespace Magnum { namespace Math { namespace Implementation { @@ -82,6 +84,7 @@ namespace Magnum { namespace Trade { struct AssimpImporter::File { Containers::Optional filePath; + const char* importerName = nullptr; const aiScene* scene = nullptr; std::vector nodes; /* (materialPointer, propertyIndexInsideMaterial, imageIndex) tuple, @@ -96,6 +99,8 @@ struct AssimpImporter::File { std::unordered_map materialIndicesForName; std::unordered_map textureIndices; + Containers::Optional> animationIndicesForName; + /* Mapping for multi-mesh nodes: (in the following, "node" is an aiNode, "object" is Magnum::Trade::ObjectData3D) @@ -128,6 +133,10 @@ void fillDefaultConfiguration(Utility::ConfigurationGroup& conf) { conf.setValue("forceWhiteAmbientToBlack", true); + conf.setValue("optimizeQuaternionShortestPath", true); + conf.setValue("normalizeQuaternions", true); + conf.setValue("mergeAnimationClips", false); + conf.setValue("ImportColladaIgnoreUpDirection", false); Utility::ConfigurationGroup& postprocess = *conf.addGroup("postprocess"); @@ -341,6 +350,14 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { CORRADE_INTERNAL_ASSERT(_f->scene); + /* Get name of importer. Useful for workarounds based on importer/file type. */ + _f->importerName = "unknown"; + const int importerIndex = _importer->GetPropertyInteger("importerIndex", -1); + if (importerIndex != -1) { + const aiImporterDesc* info = _importer->GetImporterInfo(importerIndex); + if (info) _f->importerName = info->mName; + } + /* Fill hashmaps for index lookup for materials/textures/meshes/nodes */ _f->materialIndicesForName.reserve(_f->scene->mNumMaterials); @@ -1118,6 +1135,235 @@ Containers::Optional AssimpImporter::doImage2D(const UnsignedInt id return importer->image2D(0, level); } +UnsignedInt AssimpImporter::doAnimationCount() const { + /* If the animations are merged, there's at most one */ + if(configuration().value("mergeAnimationClips")) + return _f->scene->mNumAnimations ? 1 : 0; + + return _f->scene->mNumAnimations; +} + +Int AssimpImporter::doAnimationForName(const std::string& name) { + /* If the animations are merged, don't report any names */ + if(configuration().value("mergeAnimationClips")) return -1; + + if(!_f->animationIndicesForName) { + _f->animationIndicesForName.emplace(); + _f->animationIndicesForName->reserve(_f->scene->mNumAnimations); + for(std::size_t i = 0; i != _f->scene->mNumAnimations; ++i) + _f->animationIndicesForName->emplace(std::string(_f->scene->mAnimations[i]->mName.C_Str()), i); + } + + const auto found = _f->animationIndicesForName->find(name); + return found == _f->animationIndicesForName->end() ? -1 : found->second; +} + +std::string AssimpImporter::doAnimationName(UnsignedInt id) { + /* If the animations are merged, don't report any names */ + if(configuration().value("mergeAnimationClips")) return {}; + return _f->scene->mAnimations[id]->mName.C_Str(); +} + +namespace { + +Animation::Extrapolation extrapolationFor(aiAnimBehaviour behaviour) { + switch (behaviour) { + case aiAnimBehaviour_DEFAULT: + /** @todo emulate this correctly by inserting keyframes + with the default node transformation */ + return Animation::Extrapolation::Constant; + case aiAnimBehaviour_CONSTANT: + return Animation::Extrapolation::Constant; + case aiAnimBehaviour_LINEAR: + return Animation::Extrapolation::Extrapolated; + case aiAnimBehaviour_REPEAT: + return Animation::Extrapolation::Constant; + default: CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ + } +} + +} + +Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) { + /* Import either a single animation or all of them together. At the moment, + Blender doesn't really support cinematic animations (affecting multiple + objects): https://blender.stackexchange.com/q/5689. And since + https://github.com/KhronosGroup/glTF-Blender-Exporter/pull/166, these + are exported as a set of object-specific clips, which may not be wanted, + so we give the users an option to merge them all together. */ + const std::size_t animationBegin = + configuration().value("mergeAnimationClips") ? 0 : id; + const std::size_t animationEnd = + configuration().value("mergeAnimationClips") ? _f->scene->mNumAnimations : id + 1; + + /* Calculate total data size and track count. If merging all animations together, + this is the sum of all clip track counts. */ + std::size_t dataSize = 0; + std::size_t trackCount = 0; + for (std::size_t a = animationBegin; a != animationEnd; ++a) { + const aiAnimation* animation = _f->scene->mAnimations[a]; + for (std::size_t c = 0; c != animation->mNumChannels; ++c) { + const aiNodeAnim* channel = animation->mChannels[c]; + + /** @todo handle alignment once we do more than just four-byte types */ + dataSize += channel->mNumPositionKeys*(sizeof(Float) + sizeof(Vector3)) + + channel->mNumRotationKeys*(sizeof(Float) + sizeof(Quaternion)) + + channel->mNumScalingKeys*(sizeof(Float) + sizeof(Vector3)); + + trackCount += (channel->mNumPositionKeys > 0 ? 1 : 0) + + (channel->mNumRotationKeys > 0 ? 1 : 0) + + (channel->mNumScalingKeys > 0 ? 1 : 0); + } + } + + /* Populate the data array */ + Containers::Array data{dataSize}; + + /* Import all tracks */ + bool hadToRenormalize = false; + std::size_t dataOffset = 0; + std::size_t trackId = 0; + Containers::Array tracks{trackCount}; + for(std::size_t a = animationBegin; a != animationEnd; ++a) { + const aiAnimation* animation = _f->scene->mAnimations[a]; + for(std::size_t c = 0; c != animation->mNumChannels; ++c) { + const aiNodeAnim* channel = animation->mChannels[c]; + const UnsignedInt target = doObject3DForName(channel->mNodeName.C_Str()); + if(target == -1) { + Error{} << "Trade::AssimpImporter::animation(): unknown target node " << channel->mNodeName.C_Str(); + return Containers::NullOpt; + } + + /* Assimp only supports linear interpolation. For glTF splines + it simply uses the spline control points. */ + /** @todo Before https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4 + * Assimp incorrectly read the spline tangents as values. + * Is there a way to detect this so we can work around it, + * or at least emit a warning? + */ + constexpr Animation::Interpolation interpolation = Animation::Interpolation::Linear; + + /* Extrapolation modes */ + const Animation::Extrapolation extrapolationBefore = extrapolationFor(channel->mPreState); + const Animation::Extrapolation extrapolationAfter = extrapolationFor(channel->mPostState); + + /* Key times are given as ticks, convert to milliseconds. Default value of 25 is + taken from the assimp_view tool. */ + double ticksPerSecond = animation->mTicksPerSecond != 0.0 ? animation->mTicksPerSecond : 25.0; + + /* For glTF files mTicksPerSecond is completely useless before + https://github.com/assimp/assimp/commit/7a8b7ba88d6d84dde7fd43419ac2b022c9887856 + but can be assumed to always be 1000. */ + /** @todo Check if this is broken in other importers, too */ + const bool isGltf = std::strcmp(_f->importerName, "glTF2 Importer") == 0; + if(isGltf) ticksPerSecond = 1000.0; + + /* Translation */ + if(channel->mNumPositionKeys > 0) { + const size_t keyCount = channel->mNumPositionKeys; + const auto keys = Containers::arrayCast( + data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); + dataOffset += keys.size()*sizeof(keys[0]); + const auto values = Containers::arrayCast( + data.suffix(dataOffset).prefix(keyCount*sizeof(Vector3))); + dataOffset += values.size()*sizeof(values[0]); + + for(size_t k = 0; k < channel->mNumPositionKeys; ++k) { + /* Convert double to float keys */ + keys[k] = channel->mPositionKeys[k].mTime / ticksPerSecond; + values[k] = Vector3::from(&channel->mPositionKeys[k].mValue[0]); + } + + const auto track = Animation::TrackView{ + keys, values, interpolation, + animationInterpolatorFor(interpolation), + extrapolationBefore, extrapolationAfter}; + + tracks[trackId++] = AnimationTrackData{AnimationTrackType::Vector3, + AnimationTrackType::Vector3, AnimationTrackTargetType::Translation3D, + target, track}; + } + + /* Rotation */ + if(channel->mNumRotationKeys > 0) { + const size_t keyCount = channel->mNumRotationKeys; + const auto keys = Containers::arrayCast( + data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); + dataOffset += keys.size()*sizeof(keys[0]); + const auto values = Containers::arrayCast( + data.suffix(dataOffset).prefix(keyCount*sizeof(Quaternion))); + dataOffset += values.size()*sizeof(values[0]); + + for(size_t k = 0; k < channel->mNumRotationKeys; ++k) { + keys[k] = channel->mRotationKeys[k].mTime / ticksPerSecond; + const aiQuaternion& quat = channel->mRotationKeys[k].mValue; + values[k] = Quaternion({ quat.x, quat.y, quat.z }, quat.w); + } + + /* Ensure shortest path is always chosen. */ + if(configuration().value("optimizeQuaternionShortestPath")) { + Float flip = 1.0f; + for(std::size_t i = 0; i != values.size() - 1; ++i) { + if(Math::dot(values[i], values[i + 1]*flip) < 0) flip = -flip; + values[i + 1] *= flip; + } + } + + /* Normalize the quaternions if not already. Don't attempt + to normalize every time to avoid tiny differences, only + when the quaternion looks to be off. */ + if(configuration().value("normalizeQuaternions")) { + for(auto& i: values) if(!i.isNormalized()) { + i = i.normalized(); + hadToRenormalize = true; + } + } + + const auto track = Animation::TrackView{ + keys, values, interpolation, + animationInterpolatorFor(interpolation), + extrapolationBefore, extrapolationAfter}; + + tracks[trackId++] = AnimationTrackData{AnimationTrackType::Quaternion, + AnimationTrackType::Quaternion, AnimationTrackTargetType::Rotation3D, + target, track}; + } + + /* Scale */ + if (channel->mNumScalingKeys > 0) { + const size_t keyCount = channel->mNumScalingKeys; + const auto keys = Containers::arrayCast( + data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); + dataOffset += keys.size()*sizeof(keys[0]); + const auto values = Containers::arrayCast( + data.suffix(dataOffset).prefix(keyCount*sizeof(Vector3))); + dataOffset += values.size()*sizeof(values[0]); + + for(size_t k = 0; k < channel->mNumScalingKeys; ++k) { + keys[k] = channel->mScalingKeys[k].mTime / ticksPerSecond; + values[k] = Vector3::from(&channel->mScalingKeys[k].mValue[0]); + } + + const auto track = Animation::TrackView{ + keys, values, interpolation, + animationInterpolatorFor(interpolation), + extrapolationBefore, + extrapolationAfter}; + tracks[trackId++] = AnimationTrackData{AnimationTrackType::Vector3, + AnimationTrackType::Vector3, AnimationTrackTargetType::Scaling3D, + target, track}; + } + } + } + + if(hadToRenormalize) + Warning{} << "Trade::AssimpImporter::animation(): quaternions in some rotation tracks were renormalized"; + + return AnimationData{std::move(data), std::move(tracks), + configuration().value("mergeAnimationClips") ? nullptr : + &_f->scene->mAnimations[id]}; +} + const void* AssimpImporter::doImporterState() const { return _f->scene; } diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h index 0e071a399..e2fcb5b38 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h @@ -401,6 +401,11 @@ class MAGNUM_ASSIMPIMPORTER_EXPORT AssimpImporter: public AbstractImporter { MAGNUM_ASSIMPIMPORTER_LOCAL UnsignedInt doImage2DLevelCount(UnsignedInt id) override; MAGNUM_ASSIMPIMPORTER_LOCAL Containers::Optional doImage2D(UnsignedInt id, UnsignedInt level) override; + MAGNUM_ASSIMPIMPORTER_LOCAL UnsignedInt doAnimationCount() const override; + MAGNUM_ASSIMPIMPORTER_LOCAL std::string doAnimationName(UnsignedInt id) override; + MAGNUM_ASSIMPIMPORTER_LOCAL Int doAnimationForName(const std::string& name) override; + MAGNUM_ASSIMPIMPORTER_LOCAL Containers::Optional doAnimation(UnsignedInt id) override; + MAGNUM_ASSIMPIMPORTER_LOCAL const void* doImporterState() const override; Containers::Pointer _importer; From 2b2f7d78432e1b1a6c0641c01a1377acc3dc746e Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 20 Jun 2021 03:36:13 +0200 Subject: [PATCH 02/29] AssimpImporter: animation import docs --- .../AssimpImporter/AssimpImporter.conf | 2 +- .../AssimpImporter/AssimpImporter.h | 43 +++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf b/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf index fbd409a2f..44a546399 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf @@ -35,7 +35,7 @@ forceWhiteAmbientToBlack=true optimizeQuaternionShortestPath=true # Normalize quaternion animation tracks, if they are not already. -# This can be controlled separately for each object/animation import. +# This can be controlled separately for each animation import. normalizeQuaternions=true # Merge all animations into a single clip. Useful for preserving cinematic diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h index e2fcb5b38..ae1037254 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h @@ -185,8 +185,8 @@ See @ref building-plugins, @ref cmake-plugins, @ref plugins and @section Trade-AssimpImporter-behavior Behavior and limitations -The plugin supports @ref ImporterFeature::OpenData and -@ref ImporterFeature::FileCallback features. The Assimp library loads +The plugin supports @ref ImporterFeature::OpenData, @ref ImporterFeature::OpenState +and @ref ImporterFeature::FileCallback features. The Assimp library loads everything during initial import, meaning all external file loading callbacks are called with @ref InputFileCallbackPolicy::LoadTemporary and the resources can be safely freed right after the @ref openData() / @ref openFile() function @@ -197,13 +197,46 @@ with @ref InputFileCallbackPolicy::LoadTemporary and @ref InputFileCallbackPolicy::Close is emitted right after the file is fully read. -Import of animation data is not supported at the moment. +Import of skeleton, skin and morph data is not supported at the moment. The importer recognizes @ref ImporterFlag::Verbose, enabling verbose logging in Assimp when the flag is enabled. However please note that since Assimp handles logging through a global singleton, it's not possible to have different verbosity levels in each instance. +@subsection Trade-AssimpImporter-behavior-animation Animation import + +- Quaternion rotation tracks are postprocessed in order to make it + possible to use the faster + @ref Math::lerp(const Quaternion&, const Quaternion&, T) "Math::lerp()" / + @ref Math::slerp(const Quaternion&, const Quaternion&, T) "Math::slerp()" + functions instead of + @ref Math::lerpShortestPath(const Quaternion&, const Quaternion&, T) "Math::lerpShortestPath()" / + @ref Math::slerpShortestPath(const Quaternion&, const Quaternion&, T) "Math::slerpShortestPath()". Can be disabled per-animation with the + @cb{.ini} optimizeQuaternionShortestPath @ce option, see + @ref Trade-AssimpImporter-configuration "below". +- If quaternion rotation tracks are not normalized, the importer + prints a warning and normalizes them. Can be disabled per-animation with + the @cb{.ini} normalizeQuaternions @ce option, see + @ref Trade-AssimpImporter-configuration "below". +- Skeletons and skins are not supported +- Morph targets are not supported +- Animation tracks are always imported with + @ref Animation::Interpolation::Linear, because Assimp doesn't expose + any interpolation modes +- Animation tracks using `aiAnimBehaviour_DEFAULT` or `aiAnimBehaviour_REPEAT` + fall back to using @ref Animation::Extrapolation::Constant +- It's possible to request all animation clips to be merged into one using + the @cb{.ini} mergeAnimationClips @ce option in order to for example + preserve cinematic animations when using the Blender glTF exporter (as it + otherwise outputs a separate clip for each object). When this option is + enabled, @ref animationCount() always report either @cpp 0 @ce or + @cpp 1 @ce and the merged animation has no name. With this option enabled, + however, it can happen that multiple conflicting tracks affecting the same + node are merged in the same clip, causing the animation to misbehave. +- Assimp versions before commit [e3083c21f0a7beae6c37a2265b7919a02cbf83c4](https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4) + read spline-interpolated glTF animation tracks incorrectly and produce broken animations + @subsection Trade-AssimpImporter-behavior-materials Material import - Only materials with shading mode `aiShadingMode_Phong` are supported @@ -307,6 +340,9 @@ enum. Some of them are enabled by default, some not; options for not yet supported features are omitted. These are passed to Assimp when opening a file, meaning a change in these will be always applied to the next opened file. +Additional options exist to configure animation import. See +below for all options and their default values. + @snippet MagnumPlugins/AssimpImporter/AssimpImporter.conf configuration_ @section Trade-AssimpImporter-state Access to internal importer state @@ -326,6 +362,7 @@ importer state methods: - @ref LightData::importerState() returns `aiLight` - @ref ImageData2D::importerState() may return `aiTexture`, if texture was embedded into the loaded file. + - @ref AnimationData::importerState() returns `aiAnimation` - @ref openState() expects a pointer to an Assimp scene (i.e., `const aiScene*`) and optionally a path (in order to be able to load textures, if needed) From 88ffee39ea5f37324f9c1b8b9eca71e34054bfb3 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 20 Jun 2021 03:40:24 +0200 Subject: [PATCH 03/29] AssimpImporter: warn about having to patch glTF animation speed --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index 4da535b68..3b071c02d 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -1255,8 +1255,15 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) https://github.com/assimp/assimp/commit/7a8b7ba88d6d84dde7fd43419ac2b022c9887856 but can be assumed to always be 1000. */ /** @todo Check if this is broken in other importers, too */ - const bool isGltf = std::strcmp(_f->importerName, "glTF2 Importer") == 0; - if(isGltf) ticksPerSecond = 1000.0; + using namespace Containers::Literals; + + const bool isGltf = _f->importerName == "glTF2 Importer"_s; + constexpr Double GltfTicksPerSecond = 1000.0; + if(isGltf && !Math::equal(ticksPerSecond, GltfTicksPerSecond)) { + Warning{} << "Trade::AssimpImporter::animation():" << ticksPerSecond << + "ticks per second is incorrect for glTF, patching to" << GltfTicksPerSecond; + ticksPerSecond = GltfTicksPerSecond; + } /* Translation */ if(channel->mNumPositionKeys > 0) { From 65ba86ee3f0d443029587c4e29c1411da8482287 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 20 Jun 2021 03:40:44 +0200 Subject: [PATCH 04/29] AssimpImporter: fix whitespaces --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index 3b071c02d..326e4cd7a 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -353,9 +353,9 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { /* Get name of importer. Useful for workarounds based on importer/file type. */ _f->importerName = "unknown"; const int importerIndex = _importer->GetPropertyInteger("importerIndex", -1); - if (importerIndex != -1) { + if(importerIndex != -1) { const aiImporterDesc* info = _importer->GetImporterInfo(importerIndex); - if (info) _f->importerName = info->mName; + if(info) _f->importerName = info->mName; } /* Fill hashmaps for index lookup for materials/textures/meshes/nodes */ @@ -1230,7 +1230,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) const aiNodeAnim* channel = animation->mChannels[c]; const UnsignedInt target = doObject3DForName(channel->mNodeName.C_Str()); if(target == -1) { - Error{} << "Trade::AssimpImporter::animation(): unknown target node " << channel->mNodeName.C_Str(); + Error{} << "Trade::AssimpImporter::animation(): unknown target node" << channel->mNodeName.C_Str(); return Containers::NullOpt; } @@ -1337,7 +1337,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } /* Scale */ - if (channel->mNumScalingKeys > 0) { + if(channel->mNumScalingKeys > 0) { const size_t keyCount = channel->mNumScalingKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); From e1ed0a26f5f3cc63764162209db4b83871a3f80a Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 20 Jun 2021 19:45:32 +0200 Subject: [PATCH 05/29] AssimpImporter: detect and warn about possibly broken spline-interpolated animations --- .../AssimpImporter/AssimpImporter.cpp | 29 ++++++--- .../AssimpImporter/AssimpImporter.h | 3 +- .../AssimpImporter/CMakeLists.txt | 25 ++++++++ .../AssimpImporter/CheckAssimpVersion.cpp | 64 +++++++++++++++++++ .../Test/AssimpImporterTest.cpp | 1 + .../AssimpImporter/Test/CMakeLists.txt | 15 ++--- .../AssimpImporter/Test/configure.h.cmake | 1 - ...Version5.cpp => configureInternal.h.cmake} | 7 +- 8 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 src/MagnumPlugins/AssimpImporter/CheckAssimpVersion.cpp rename src/MagnumPlugins/AssimpImporter/{Test/CheckAssimpVersion5.cpp => configureInternal.h.cmake} (92%) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index 326e4cd7a..3988495f6 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -64,6 +64,8 @@ #include #include +#include "configureInternal.h" + namespace Magnum { namespace Math { namespace Implementation { template<> struct VectorConverter<3, Float, aiColor3D> { @@ -85,6 +87,7 @@ namespace Magnum { namespace Trade { struct AssimpImporter::File { Containers::Optional filePath; const char* importerName = nullptr; + bool importerIsGltf = false; const aiScene* scene = nullptr; std::vector nodes; /* (materialPointer, propertyIndexInsideMaterial, imageIndex) tuple, @@ -358,6 +361,10 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { if(info) _f->importerName = info->mName; } + using namespace Containers::Literals; + + _f->importerIsGltf = _f->importerName == "glTF2 Importer"_s; + /* Fill hashmaps for index lookup for materials/textures/meshes/nodes */ _f->materialIndicesForName.reserve(_f->scene->mNumMaterials); @@ -465,6 +472,18 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { } } } + + /* Before https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4 + Assimp incorrectly read spline tangents as values in glTF animation tracks. + Quick and dirty check to see if we're dealing with a possibly affected file + and Assimp version. This might produce false-positives on files without + spline-interpolated animations, but for doOpenState and doOpenFile we + have no access to the file content to check if the file contains "CUBICSPLINE". */ + if (_f->scene->HasAnimations() && _f->importerIsGltf && ASSIMP_VERSION < 20201123) { + Warning{} << "Trade::AssimpImporter::open(): spline-interpolated animations imported" << + "from this file are most likely broken using this version of Assimp. Consult the" << + "importer documentation for more information."; + } } void AssimpImporter::doOpenState(const void* state, const std::string& filePath) { @@ -1236,11 +1255,6 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) /* Assimp only supports linear interpolation. For glTF splines it simply uses the spline control points. */ - /** @todo Before https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4 - * Assimp incorrectly read the spline tangents as values. - * Is there a way to detect this so we can work around it, - * or at least emit a warning? - */ constexpr Animation::Interpolation interpolation = Animation::Interpolation::Linear; /* Extrapolation modes */ @@ -1255,11 +1269,8 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) https://github.com/assimp/assimp/commit/7a8b7ba88d6d84dde7fd43419ac2b022c9887856 but can be assumed to always be 1000. */ /** @todo Check if this is broken in other importers, too */ - using namespace Containers::Literals; - - const bool isGltf = _f->importerName == "glTF2 Importer"_s; constexpr Double GltfTicksPerSecond = 1000.0; - if(isGltf && !Math::equal(ticksPerSecond, GltfTicksPerSecond)) { + if(_f->importerIsGltf && !Math::equal(ticksPerSecond, GltfTicksPerSecond)) { Warning{} << "Trade::AssimpImporter::animation():" << ticksPerSecond << "ticks per second is incorrect for glTF, patching to" << GltfTicksPerSecond; ticksPerSecond = GltfTicksPerSecond; diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h index ae1037254..1be189ff6 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h @@ -235,7 +235,8 @@ verbosity levels in each instance. however, it can happen that multiple conflicting tracks affecting the same node are merged in the same clip, causing the animation to misbehave. - Assimp versions before commit [e3083c21f0a7beae6c37a2265b7919a02cbf83c4](https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4) - read spline-interpolated glTF animation tracks incorrectly and produce broken animations + read spline-interpolated glTF animation tracks incorrectly and produce broken + animations. If this is detected, the importer produces a warning. @subsection Trade-AssimpImporter-behavior-materials Material import diff --git a/src/MagnumPlugins/AssimpImporter/CMakeLists.txt b/src/MagnumPlugins/AssimpImporter/CMakeLists.txt index 136c8535c..85758af02 100644 --- a/src/MagnumPlugins/AssimpImporter/CMakeLists.txt +++ b/src/MagnumPlugins/AssimpImporter/CMakeLists.txt @@ -34,6 +34,30 @@ endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h) +# Go through all versions of interest and pick the highest one that compiles +foreach(_version 20201123 20190915 20151031) + try_compile(_works ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/checkAssimpVersion.cpp + LINK_LIBRARIES Assimp::Assimp + COMPILE_DEFINITIONS + -DCHECK_VERSION=${_version} + # I thought I could make this use C++11 by linking to + # Corrade::Utility, but for some reason the effect of the + # CORRADE_CXX_STANDARD property doesn't get passed through. So I + # have to use an internal variable for that instead. + ${CORRADE_CXX11_STANDARD_FLAG} + OUTPUT_VARIABLE _version_output) + if(_works) + set(ASSIMP_VERSION ${_version}) + break() + endif() +endforeach() +if(NOT ASSIMP_VERSION) + message(SEND_ERROR "Could not detect Assimp version. Maybe even older than 3.2? ${_version_output}") +endif() +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configureInternal.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/configureInternal.h) + # AssimpImporter plugin add_plugin(AssimpImporter "${MAGNUM_PLUGINS_IMPORTER_DEBUG_BINARY_INSTALL_DIR};${MAGNUM_PLUGINS_IMPORTER_DEBUG_LIBRARY_INSTALL_DIR}" @@ -41,6 +65,7 @@ add_plugin(AssimpImporter AssimpImporter.conf AssimpImporter.cpp AssimpImporter.h) +target_include_directories(AssimpImporter PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) if(MAGNUM_ASSIMPIMPORTER_BUILD_STATIC AND BUILD_STATIC_PIC) set_target_properties(AssimpImporter PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() diff --git a/src/MagnumPlugins/AssimpImporter/CheckAssimpVersion.cpp b/src/MagnumPlugins/AssimpImporter/CheckAssimpVersion.cpp new file mode 100644 index 000000000..6decc6c2d --- /dev/null +++ b/src/MagnumPlugins/AssimpImporter/CheckAssimpVersion.cpp @@ -0,0 +1,64 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020, 2021 Vladimír Vondruš + + 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. +*/ + +#if CHECK_VERSION >= 20190915 +#include +#endif + +#include +#include + +#ifndef CHECK_VERSION +#error CHECK_VERSION not defined +#define CHECK_VERSION 0xffffffff +#endif + +int main() { + int ret = 0; + + /* First version that correctly parses glTF2 spline-interpolated animation data: + https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4. + Check for Scene::mName added in + https://github.com/assimp/assimp/commit/afd69bea8a6a870a986b5c8ad1a07bf127b0eaa0 */ + #if CHECK_VERSION >= 20201123 + aiScene scene; + scene.mName = ""; + #endif + + /* Assimp 5. Of all the things that could break, this version reports itself as + 4.1. Since some of the insane awful bugs got fixed in version 5, the test has + to check against the version in order to adjust expectations. The only way I + could make this work is checking for the getEpsilon() function added in + https://github.com/assimp/assimp/commit/8b95479bb00b4bf8fb875f2c5b0605ddfd203b7f + Related bug: https://github.com/assimp/assimp/issues/2693 */ + #if CHECK_VERSION >= 20190915 + ret = static_cast(Assimp::Math::getEpsilon()); + #endif + + unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); + ret = static_cast(version); + + return ret; +} diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index d2ac66b6b..1c77655d3 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -61,6 +61,7 @@ #include #include "configure.h" +#include "MagnumPlugins/AssimpImporter/configureInternal.h" namespace Magnum { namespace Trade { namespace Test { namespace { diff --git a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt index 73d954360..0dfcde747 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt @@ -43,14 +43,6 @@ if(NOT MAGNUM_ASSIMPIMPORTER_BUILD_STATIC) endif() endif() -# Assimp 5. Of all the things that could break, this version reports itself as -# 4.1. Since some of the insane awful bugs got fixed in version 5, the test has -# to check against the version in order to adjust expectations. The only way I -# could make this work is checking for the getEpsilon() function added in -# https://github.com/assimp/assimp/commit/8b95479bb00b4bf8fb875f2c5b0605ddfd203b7f -# Related bug: https://github.com/assimp/assimp/issues/2693 -try_compile(ASSIMP_IS_VERSION_5 ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/CheckAssimpVersion5.cpp LINK_LIBRARIES Assimp::Assimp) - # First replace ${} variables, then $<> generator expressions configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure.h.in) @@ -87,7 +79,12 @@ corrade_add_test(AssimpImporterTest AssimpImporterTest.cpp y-up.dae z-up.dae) target_link_libraries(AssimpImporterTest PRIVATE Assimp::Assimp) -target_include_directories(AssimpImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) +target_include_directories(AssimpImporterTest PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/$ + # The test needs access to configureInternal.h written by + # AssimpImporter. The dynamic library doesn't get linked to + # and hence doesn't get the binary dir in the include dirs. + ${PROJECT_BINARY_DIR}/src) if(MAGNUM_ASSIMPIMPORTER_BUILD_STATIC) target_link_libraries(AssimpImporterTest PRIVATE AssimpImporter Magnum::AnyImageImporter) diff --git a/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake b/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake index 03cfae95d..5e900db40 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake @@ -27,4 +27,3 @@ #cmakedefine DDSIMPORTER_PLUGIN_FILENAME "${DDSIMPORTER_PLUGIN_FILENAME}" #cmakedefine STBIMAGEIMPORTER_PLUGIN_FILENAME "${STBIMAGEIMPORTER_PLUGIN_FILENAME}" #define ASSIMPIMPORTER_TEST_DIR "${ASSIMPIMPORTER_TEST_DIR}" -#cmakedefine01 ASSIMP_IS_VERSION_5 diff --git a/src/MagnumPlugins/AssimpImporter/Test/CheckAssimpVersion5.cpp b/src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake similarity index 92% rename from src/MagnumPlugins/AssimpImporter/Test/CheckAssimpVersion5.cpp rename to src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake index f3b511b7b..eddc69ba5 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/CheckAssimpVersion5.cpp +++ b/src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake @@ -23,8 +23,5 @@ DEALINGS IN THE SOFTWARE. */ -#include - -int main() { - return !(Assimp::Math::getEpsilon() > 0.0f); -} +#define ASSIMP_VERSION ${ASSIMP_VERSION} +#define ASSIMP_IS_VERSION_5 (ASSIMP_VERSION >= 20190915) From ccb06896f2490db989bf1115a6d5bdbfbccaf439 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Mon, 21 Jun 2021 00:07:24 +0200 Subject: [PATCH 06/29] AssimpImporter: fix warnings --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index 3988495f6..e2ede3a2c 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -369,7 +369,6 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { _f->materialIndicesForName.reserve(_f->scene->mNumMaterials); aiString matName; - aiString texturePath; UnsignedInt textureIndex = 0; std::unordered_map uniqueImages; for(std::size_t i = 0; i < _f->scene->mNumMaterials; ++i) { @@ -383,9 +382,9 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { /* Store first possible texture index for this material, next textures use successive indices. */ _f->textureIndices[mat] = textureIndex; - for(std::size_t i = 0; i != mat->mNumProperties; ++i) { + for(std::size_t j = 0; j != mat->mNumProperties; ++j) { /* We're only interested in AI_MATKEY_TEXTURE_* properties */ - const aiMaterialProperty& property = *mat->mProperties[i]; + const aiMaterialProperty& property = *mat->mProperties[j]; if(Containers::StringView{property.mKey.C_Str(), property.mKey.length} != _AI_MATKEY_TEXTURE_BASE) continue; /* For images ensure we have an unique path so each file isn't @@ -393,12 +392,12 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { of the material, which is then used to retrieve its path again. */ Containers::StringView texturePath = materialPropertyString(property); auto uniqueImage = uniqueImages.emplace(texturePath, _f->images.size()); - if(uniqueImage.second) _f->images.emplace_back(mat, i); + if(uniqueImage.second) _f->images.emplace_back(mat, j); /* Each texture points to i-th property of the material, which is then used to retrieve related info, plus an index into the unique images array */ - _f->textures.emplace_back(mat, i, uniqueImage.first->second); + _f->textures.emplace_back(mat, j, uniqueImage.first->second); ++textureIndex; } } @@ -1186,7 +1185,7 @@ std::string AssimpImporter::doAnimationName(UnsignedInt id) { namespace { Animation::Extrapolation extrapolationFor(aiAnimBehaviour behaviour) { - switch (behaviour) { + switch(behaviour) { case aiAnimBehaviour_DEFAULT: /** @todo emulate this correctly by inserting keyframes with the default node transformation */ From f23782e89384c60f967114d18d7a2a5db7fff9e2 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 00:36:27 +0200 Subject: [PATCH 07/29] AssimpImporter: review feedback --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 12 ++++++------ src/MagnumPlugins/AssimpImporter/AssimpImporter.h | 7 +++---- .../AssimpImporter/configureInternal.h.cmake | 1 + 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index e2ede3a2c..afefb6e14 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -388,13 +388,13 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { if(Containers::StringView{property.mKey.C_Str(), property.mKey.length} != _AI_MATKEY_TEXTURE_BASE) continue; /* For images ensure we have an unique path so each file isn't - imported more than once. Each image then points to i-th property + imported more than once. Each image then points to j-th property of the material, which is then used to retrieve its path again. */ Containers::StringView texturePath = materialPropertyString(property); auto uniqueImage = uniqueImages.emplace(texturePath, _f->images.size()); if(uniqueImage.second) _f->images.emplace_back(mat, j); - /* Each texture points to i-th property of the material, which is + /* Each texture points to j-th property of the material, which is then used to retrieve related info, plus an index into the unique images array */ _f->textures.emplace_back(mat, j, uniqueImage.first->second); @@ -478,9 +478,9 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { and Assimp version. This might produce false-positives on files without spline-interpolated animations, but for doOpenState and doOpenFile we have no access to the file content to check if the file contains "CUBICSPLINE". */ - if (_f->scene->HasAnimations() && _f->importerIsGltf && ASSIMP_VERSION < 20201123) { - Warning{} << "Trade::AssimpImporter::open(): spline-interpolated animations imported" << - "from this file are most likely broken using this version of Assimp. Consult the" << + if(_f->scene->HasAnimations() && _f->importerIsGltf && ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + Warning{} << "Trade::AssimpImporter::openData(): spline-interpolated animations imported " + "from this file are most likely broken using this version of Assimp. Consult the " "importer documentation for more information."; } } @@ -1265,7 +1265,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) double ticksPerSecond = animation->mTicksPerSecond != 0.0 ? animation->mTicksPerSecond : 25.0; /* For glTF files mTicksPerSecond is completely useless before - https://github.com/assimp/assimp/commit/7a8b7ba88d6d84dde7fd43419ac2b022c9887856 + https://github.com/assimp/assimp/commit/09d80ff478d825a80bce6fb787e8b19df9f321a8 but can be assumed to always be 1000. */ /** @todo Check if this is broken in other importers, too */ constexpr Double GltfTicksPerSecond = 1000.0; diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h index 1be189ff6..d939ba8d7 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h @@ -236,7 +236,9 @@ verbosity levels in each instance. node are merged in the same clip, causing the animation to misbehave. - Assimp versions before commit [e3083c21f0a7beae6c37a2265b7919a02cbf83c4](https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4) read spline-interpolated glTF animation tracks incorrectly and produce broken - animations. If this is detected, the importer produces a warning. + animations. A warning is printed when importing glTF animations on these versions. + Because it's impossible to detect the actual brokenness, the warning is + printed even if the imported data may be correct. @subsection Trade-AssimpImporter-behavior-materials Material import @@ -341,9 +343,6 @@ enum. Some of them are enabled by default, some not; options for not yet supported features are omitted. These are passed to Assimp when opening a file, meaning a change in these will be always applied to the next opened file. -Additional options exist to configure animation import. See -below for all options and their default values. - @snippet MagnumPlugins/AssimpImporter/AssimpImporter.conf configuration_ @section Trade-AssimpImporter-state Access to internal importer state diff --git a/src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake b/src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake index eddc69ba5..551bbad5e 100644 --- a/src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake +++ b/src/MagnumPlugins/AssimpImporter/configureInternal.h.cmake @@ -25,3 +25,4 @@ #define ASSIMP_VERSION ${ASSIMP_VERSION} #define ASSIMP_IS_VERSION_5 (ASSIMP_VERSION >= 20190915) +#define ASSIMP_HAS_BROKEN_GLTF_SPLINES (ASSIMP_VERSION < 20201123) From 08e1867024ccf53f3b19c5dff6191e53f84e0cdc Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 00:41:08 +0200 Subject: [PATCH 08/29] AssimpImporter: only assert on unknown target node name Assimp docs say this node must exist, so this should already be an assimp error at import time --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index afefb6e14..ec3b9c624 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -1247,10 +1247,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) for(std::size_t c = 0; c != animation->mNumChannels; ++c) { const aiNodeAnim* channel = animation->mChannels[c]; const UnsignedInt target = doObject3DForName(channel->mNodeName.C_Str()); - if(target == -1) { - Error{} << "Trade::AssimpImporter::animation(): unknown target node" << channel->mNodeName.C_Str(); - return Containers::NullOpt; - } + CORRADE_ASSERT(target != -1, "Trade::AssimpImporter::animation(): target node must exist", {}); /* Assimp only supports linear interpolation. For glTF splines it simply uses the spline control points. */ From e5e7823281f32d6907f095397d61f5716d26f1a3 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 00:42:17 +0200 Subject: [PATCH 09/29] AssimpImporter: ignore dummy tracks inserted by Assimp --- .../AssimpImporter/AssimpImporter.cpp | 107 ++++++++++++++++-- 1 file changed, 95 insertions(+), 12 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index ec3b9c624..71fca223e 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include #include #include @@ -1214,23 +1216,97 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) const std::size_t animationEnd = configuration().value("mergeAnimationClips") ? _f->scene->mNumAnimations : id + 1; + /* Calculate total channel count */ + std::size_t channelCount = 0; + for(std::size_t a = animationBegin; a != animationEnd; ++a) { + channelCount += _f->scene->mAnimations[a]->mNumChannels; + } + + /* Presence of translation/rotation/scaling keys for each channel. + We might skip certain tracks (see comments in the next loop) + but we need to know the correct track count and data array size + up front, so determine this and remember it for the actual + loop that extracts the tracks. */ + Containers::Array> channelTrackPresence{channelCount}; + /* Calculate total data size and track count. If merging all animations together, this is the sum of all clip track counts. */ std::size_t dataSize = 0; std::size_t trackCount = 0; - for (std::size_t a = animationBegin; a != animationEnd; ++a) { + std::size_t currentChannel = 0; + for(std::size_t a = animationBegin; a != animationEnd; ++a) { const aiAnimation* animation = _f->scene->mAnimations[a]; - for (std::size_t c = 0; c != animation->mNumChannels; ++c) { + for(std::size_t c = 0; c != animation->mNumChannels; ++c) { const aiNodeAnim* channel = animation->mChannels[c]; + UnsignedInt translationKeyCount = channel->mNumPositionKeys; + UnsignedInt rotationKeyCount = channel->mNumRotationKeys; + UnsignedInt scalingKeyCount = channel->mNumScalingKeys; + + /* Assimp adds useless 1-key tracks with default node + translation/rotation/scale if the channel doesn't + target all 3 of them. Ignore those. */ + if(translationKeyCount == 1 || rotationKeyCount == 1 || scalingKeyCount == 1) { + const aiNode* node = _f->scene->mRootNode->FindNode(channel->mNodeName); + CORRADE_ASSERT(node, "Trade::AssimpImporter::animation(): Target node must exist", {}); + + aiVector3D nodeTranslation; + aiQuaternion nodeRotation; + aiVector3D nodeScaling; + /* This might not perfectly restore the T/R/S components, but it's okay + if the comparison fails, this whole fix is a best-effort attempt */ + node->mTransformation.Decompose(nodeScaling, nodeRotation, nodeTranslation); + + const bool verbose{flags() & ImporterFlag::Verbose}; + + if(translationKeyCount == 1 && channel->mPositionKeys[0].mTime == 0.0) { + const Vector3 value = Vector3::from(&channel->mPositionKeys[0].mValue[0]); + const Vector3 nodeValue = Vector3::from(&nodeTranslation[0]); + if(Math::TypeTraits::equals(value, nodeValue)) { + translationKeyCount = 0; + } + if(verbose) + Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy translation " + "track in channel" << currentChannel; + } + if(rotationKeyCount == 1 && channel->mRotationKeys[0].mTime == 0.0) { + const aiQuaternion& valueQuat = channel->mRotationKeys[0].mValue; + const Quaternion value{{valueQuat.x, valueQuat.y, valueQuat.z}, valueQuat.w}; + const aiQuaternion& nodeQuat = nodeRotation; + const Quaternion nodeValue{{nodeQuat.x, nodeQuat.y, nodeQuat.z}, nodeQuat.w}; + if(Math::TypeTraits::equals(value, nodeValue)) { + rotationKeyCount = 0; + } + if(verbose) + Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy rotation " + "track in channel" << currentChannel; + } + if(scalingKeyCount == 1 && channel->mScalingKeys[0].mTime == 0.0) { + const Vector3 value = Vector3::from(&channel->mScalingKeys[0].mValue[0]); + const Vector3 nodeValue = Vector3::from(&nodeScaling[0]); + if(Math::TypeTraits::equals(value, nodeValue)) { + scalingKeyCount = 0; + } + if(verbose) + Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy scaling " + "track in channel" << currentChannel; + } + } + + channelTrackPresence[currentChannel] = { + translationKeyCount > 0, rotationKeyCount > 0, scalingKeyCount > 0 + }; + /** @todo handle alignment once we do more than just four-byte types */ - dataSize += channel->mNumPositionKeys*(sizeof(Float) + sizeof(Vector3)) + - channel->mNumRotationKeys*(sizeof(Float) + sizeof(Quaternion)) + - channel->mNumScalingKeys*(sizeof(Float) + sizeof(Vector3)); + dataSize += translationKeyCount*(sizeof(Float) + sizeof(Vector3)) + + rotationKeyCount*(sizeof(Float) + sizeof(Quaternion)) + + scalingKeyCount*(sizeof(Float) + sizeof(Vector3)); + + trackCount += (translationKeyCount > 0 ? 1 : 0) + + (rotationKeyCount > 0 ? 1 : 0) + + (scalingKeyCount > 0 ? 1 : 0); - trackCount += (channel->mNumPositionKeys > 0 ? 1 : 0) + - (channel->mNumRotationKeys > 0 ? 1 : 0) + - (channel->mNumScalingKeys > 0 ? 1 : 0); + currentChannel++; } } @@ -1241,6 +1317,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) bool hadToRenormalize = false; std::size_t dataOffset = 0; std::size_t trackId = 0; + currentChannel = 0; Containers::Array tracks{trackCount}; for(std::size_t a = animationBegin; a != animationEnd; ++a) { const aiAnimation* animation = _f->scene->mAnimations[a]; @@ -1272,8 +1349,12 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) ticksPerSecond = GltfTicksPerSecond; } + bool hasTranslation, hasRotation, hasScaling; + std::tie(hasTranslation, hasRotation, hasScaling) = + channelTrackPresence[currentChannel]; + /* Translation */ - if(channel->mNumPositionKeys > 0) { + if(hasTranslation) { const size_t keyCount = channel->mNumPositionKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); @@ -1299,7 +1380,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } /* Rotation */ - if(channel->mNumRotationKeys > 0) { + if(hasRotation) { const size_t keyCount = channel->mNumRotationKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); @@ -1311,7 +1392,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) for(size_t k = 0; k < channel->mNumRotationKeys; ++k) { keys[k] = channel->mRotationKeys[k].mTime / ticksPerSecond; const aiQuaternion& quat = channel->mRotationKeys[k].mValue; - values[k] = Quaternion({ quat.x, quat.y, quat.z }, quat.w); + values[k] = Quaternion{{quat.x, quat.y, quat.z}, quat.w}; } /* Ensure shortest path is always chosen. */ @@ -1344,7 +1425,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } /* Scale */ - if(channel->mNumScalingKeys > 0) { + if(hasScaling) { const size_t keyCount = channel->mNumScalingKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); @@ -1367,6 +1448,8 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) AnimationTrackType::Vector3, AnimationTrackTargetType::Scaling3D, target, track}; } + + currentChannel++; } } From 15647ccd5843c03b323d95eb1e306d5918cdc7db Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 00:49:17 +0200 Subject: [PATCH 10/29] AssimpImporter: add animation tests --- .../Test/AssimpImporterTest.cpp | 764 +++++++++++++++++- .../AssimpImporter/Test/CMakeLists.txt | 4 +- .../AssimpImporter/Test/configure.h.cmake | 1 + 3 files changed, 759 insertions(+), 10 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 1c77655d3..e9a47be86 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -38,21 +38,24 @@ #include #include #include +#include +#include #include -#include -#include #include +#include #include +#include #include +#include +#include #include +#include #include #include #include #include #include #include -#include -#include #include /* in assimp 3.0, version.h is missing this include for ASSIMP_API */ #include @@ -75,6 +78,23 @@ struct AssimpImporterTest: TestSuite::Tester { void openData(); void openDataFailed(); + void animation(); + void animationGltf(); + + void animationGltfNoScene(); + void animationGltfTicksPerSecondPatching(); + void animationGltfBrokenSplineWarning(); + void animationGltfSpline(); + + void animationDummyTracksRemovalOutput(); + + void animationShortestPathOptimizationEnabled(); + void animationShortestPathOptimizationDisabled(); + void animationQuaternionNormalizationEnabled(); + void animationQuaternionNormalizationDisabled(); + void animationMergeEmpty(); + void animationMerge(); + void camera(); void light(); void lightUnsupported(); @@ -131,6 +151,27 @@ constexpr struct { {"verbose", ImporterFlag::Verbose} }; +constexpr struct { + const char* name; + const char* suffix; +} ExportedAnimationFileData[]{ + {"Collada", ".dae"}, + {"Collada curves", "-curves.dae"}, + {"Collada curves with handles", "-curves-handles.dae"}, + {"FBX", ".fbx"}, + {"glTF", ".gltf"} +}; + +constexpr struct { + const char* name; + const char* suffix; +} GltfAnimationFileData[]{ + {"ascii external", ".gltf"}, + {"ascii embedded", "-embedded.gltf"}, + {"binary external", ".glb"}, + {"binary embedded", "-embedded.glb"} +}; + constexpr struct { const char* name; const char* file; @@ -145,13 +186,34 @@ constexpr struct { AssimpImporterTest::AssimpImporterTest() { addInstancedTests({&AssimpImporterTest::openFile}, - Containers::arraySize(VerboseData)); + Containers::arraySize(VerboseData)); addTests({&AssimpImporterTest::openFileFailed, &AssimpImporterTest::openData, - &AssimpImporterTest::openDataFailed, + &AssimpImporterTest::openDataFailed}); + + addInstancedTests({&AssimpImporterTest::animation}, + Containers::arraySize(ExportedAnimationFileData)); + + addInstancedTests({&AssimpImporterTest::animationGltf}, + Containers::arraySize(GltfAnimationFileData)); + + addTests({&AssimpImporterTest::animationGltfNoScene, + &AssimpImporterTest::animationGltfTicksPerSecondPatching, + &AssimpImporterTest::animationGltfBrokenSplineWarning, + &AssimpImporterTest::animationGltfSpline}); + + addInstancedTests({&AssimpImporterTest::animationDummyTracksRemovalOutput}, + Containers::arraySize(VerboseData)); - &AssimpImporterTest::camera, + addTests({&AssimpImporterTest::animationShortestPathOptimizationEnabled, + &AssimpImporterTest::animationShortestPathOptimizationDisabled, + &AssimpImporterTest::animationQuaternionNormalizationEnabled, + &AssimpImporterTest::animationQuaternionNormalizationDisabled, + &AssimpImporterTest::animationMergeEmpty, + &AssimpImporterTest::animationMerge}); + + addTests({&AssimpImporterTest::camera, &AssimpImporterTest::light, &AssimpImporterTest::lightUnsupported, @@ -176,7 +238,7 @@ AssimpImporterTest::AssimpImporterTest() { addInstancedTests({&AssimpImporterTest::upDirectionPatching, &AssimpImporterTest::upDirectionPatchingPreTransformVertices}, - Containers::arraySize(UpDirectionPatchingData)); + Containers::arraySize(UpDirectionPatchingData)); addTests({&AssimpImporterTest::imageEmbedded, &AssimpImporterTest::imageExternal, @@ -287,6 +349,690 @@ void AssimpImporterTest::openDataFailed() { CORRADE_COMPARE(out.str(), "Trade::AssimpImporter::openData(): loading failed: No suitable reader found for the file format of file \"$$$___magic___$$$.\".\n"); } +namespace { + +/* This does not indicate general assimp animation support, only used to skip + tests on certain versions and test files. */ +bool supportsAnimation(const std::string& fileName) { + /* 5.0.0 supports all of Collada, FBX, glTF */ + if(ASSIMP_IS_VERSION_5) + return true; + + /* splitExtension returns empty extensions for files starting with a dot */ + const std::string extension = Utility::Directory::splitExtension("x" + fileName).second; + const bool isGltf = extension == ".gltf" || extension == ".glb"; + if(isGltf) { + return false; + } else { + const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); + CORRADE_ASSERT(extension == ".dae" || extension == ".fbx", "Unsupported file type", false); + /* That's as far back as I checked, both Collada and FBX animations supported */ + return version > 302; + } +} + +} + +void AssimpImporterTest::animation() { + auto&& data = ExportedAnimationFileData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + if(!supportsAnimation(data.suffix)) + CORRADE_SKIP("Animation for this file type is not supported with the current version of Assimp"); + + /* Animation created and exported with Blender. Most animation tracks got + resampled during export, so there's no use comparing against exact + key/value pairs. The glTF specific tests cover that AssimpImporter correctly + passes on what assimp outputs. */ + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "exported-animation" + std::string{data.suffix}))); + CORRADE_VERIFY(importer->animationCount() > 0); + + struct Node { + const char* name; + Vector3 translation; + Quaternion rotation; + Vector3 scaling; + }; + + Node nodes[3] = { + { "Rotating" }, + { "Scaling" }, + { "Translating" } + }; + + Node* nodeMap[3]{}; + + const UnsignedInt objectCount = importer->object3DCount(); + CORRADE_COMPARE(objectCount, Containers::arraySize(nodes)); + + for(UnsignedInt i = 0; i < objectCount; i++) { + const std::string name = importer->object3DName(i); + for(Node& n : nodes) { + /* Exported Collada files have spaces replaced with underscores, + so check for the first words only */ + if(name.find(n.name) == 0) { + /* Node names in the test files are unique */ + CORRADE_VERIFY(!nodeMap[i]); + nodeMap[i] = &n; + } + } + CORRADE_VERIFY(nodeMap[i]); + } + + Animation::Player player; + Containers::Array> animationData{importer->animationCount()}; + + for(UnsignedInt i = 0; i < importer->animationCount(); i++) { + auto animation = importer->animation(i); + CORRADE_VERIFY(animation); + + for(UnsignedInt j = 0; j < animation->trackCount(); j++) { + /* all imported animations are linear */ + const auto track = animation->track(j); + CORRADE_COMPARE(track.interpolation(), Animation::Interpolation::Linear); + + const UnsignedInt target = animation->trackTarget(j); + switch(animation->trackTargetType(j)) { + case AnimationTrackTargetType::Translation3D: + player.add(animation->track(j), nodeMap[target]->translation); + break; + case AnimationTrackTargetType::Rotation3D: + player.add(animation->track(j), nodeMap[target]->rotation); + break; + case AnimationTrackTargetType::Scaling3D: + player.add(animation->track(j), nodeMap[target]->scaling); + break; + default: CORRADE_FAIL_IF(true, "Unexpected track target type"); + } + } + + animationData[i] = animation->release(); + } + + CORRADE_VERIFY(player.duration().contains({2.5f, 7.5f})); + + /** @todo verify player output at important keyframes. Requires + * massaging the export/output a lot: + * - ImportColladaIgnoreUpDirection seems to be ignored for + * Collada files with curves. Blender export bug? + * - FBX scales everything by 100, and Assimp ignores + * AI_CONFIG_FBX_CONVERT_TO_M of course: + * https://github.com/assimp/assimp/issues/3408 + * - FBX file seems to have all animations exported + * targetting the same object, can't find a way to + * correctly export this from Blender + */ +} + +void AssimpImporterTest::animationGltf() { + auto&& data = GltfAnimationFileData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + /* Using the same files as TinyGltfImporterTest, but modified to include a + scene, because Assimp refuses to import animations if there is no scene. */ + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation" + std::string{data.suffix}))); + + CORRADE_COMPARE(importer->animationCount(), 3); + + /* Empty animation */ + { + CORRADE_COMPARE(importer->animationName(0), "empty"); + CORRADE_COMPARE(importer->animationForName("empty"), 0); + + auto animation = importer->animation(0); + CORRADE_VERIFY(animation); + CORRADE_VERIFY(animation->data().empty()); + CORRADE_COMPARE(animation->trackCount(), 0); + + /* Translation/rotation/scaling animation */ + } { + CORRADE_COMPARE(importer->animationName(1), "TRS animation"); + CORRADE_COMPARE(importer->animationForName("TRS animation"), 1); + + std::ostringstream out; + Debug redirectDebug{&out}; + + auto animation = importer->animation(1); + CORRADE_VERIFY(animation); + CORRADE_VERIFY(animation->importerState()); + /* Two rotation keys, four translation and scaling keys. */ + CORRADE_COMPARE(animation->data().size(), + 2*(sizeof(Float) + sizeof(Quaternion)) + + 2*4*(sizeof(Float) + sizeof(Vector3))); + CORRADE_COMPARE(animation->trackCount(), 3); + + /* Rotation, linearly interpolated */ + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackResultType(0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(0), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(0), 0); + Animation::TrackView rotation = animation->track(0); + CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(rotation.before(), Animation::Extrapolation::Constant); + CORRADE_COMPARE(rotation.after(), Animation::Extrapolation::Constant); + constexpr Float rotationKeys[]{ + 1.25f, + 2.50f + }; + const Quaternion rotationValues[]{ + Quaternion::rotation(0.0_degf, Vector3::xAxis()), + Quaternion::rotation(180.0_degf, Vector3::xAxis()) + }; + CORRADE_COMPARE_AS(rotation.keys(), (Containers::StridedArrayView1D{rotationKeys}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(rotation.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + CORRADE_COMPARE(rotation.at(1.875f), Quaternion::rotation(90.0_degf, Vector3::xAxis())); + + constexpr Float translationScalingKeys[]{ + 0.0f, + 1.25f, + 2.5f, + 3.75f + }; + + /* Translation, constant interpolated, sharing keys with scaling */ + CORRADE_COMPARE(animation->trackType(1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(1), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(1), 1); + Animation::TrackView translation = animation->track(1); + CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(translation.before(), Animation::Extrapolation::Constant); + CORRADE_COMPARE(translation.after(), Animation::Extrapolation::Constant); + constexpr Vector3 translationData[]{ + Vector3::yAxis(0.0f), + Vector3::yAxis(2.5f), + Vector3::yAxis(2.5f), + Vector3::yAxis(0.0f) + }; + CORRADE_COMPARE_AS(translation.keys(), (Containers::StridedArrayView1D{translationScalingKeys}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(translation.values(), (Containers::StridedArrayView1D{translationData}), TestSuite::Compare::Container); + CORRADE_COMPARE(translation.at(1.5f), Vector3::yAxis(2.5f)); + + /* Scaling, linearly interpolated, sharing keys with translation */ + CORRADE_COMPARE(animation->trackType(2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(2), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(2), 2); + Animation::TrackView scaling = animation->track(2); + CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(scaling.before(), Animation::Extrapolation::Constant); + CORRADE_COMPARE(scaling.after(), Animation::Extrapolation::Constant); + constexpr Vector3 scalingData[]{ + Vector3{1.0f}, + Vector3::zScale(5.0f), + Vector3::zScale(6.0f), + Vector3(1.0f), + }; + CORRADE_COMPARE_AS(scaling.keys(), (Containers::StridedArrayView1D{translationScalingKeys}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scaling.values(), (Containers::StridedArrayView1D{scalingData}), TestSuite::Compare::Container); + CORRADE_COMPARE(scaling.at(1.5f), Vector3::zScale(5.2f)); + } +} + +void AssimpImporterTest::animationGltfNoScene() { + /* Assimp refuses to import glTF animations if the file + has no scenes. This reuses the TinyGltfImporter test + files, not the corrected ones used by other tests. */ + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TINYGLTFIMPORTER_TEST_DIR, + "animation.gltf"))); + + CORRADE_COMPARE(importer->animationCount(), 0); +} + +void AssimpImporterTest::animationGltfTicksPerSecondPatching() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + /* This was fixed right after 5.0.0, but 5.0.1 only selected compilation + fixes and didn't bump the minor version. Boldly assuming the next + minor version will have fixes from 2019. */ + const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); + const bool hasInvalidTicksPerSecond = version > 500; + if(!hasInvalidTicksPerSecond) + CORRADE_SKIP("Current version of assimp correctly sets glTF ticks per second."); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + + std::ostringstream out; + { + Warning redirectWarning{&out}; + CORRADE_VERIFY(importer->animation(1)); + } + CORRADE_VERIFY(out.str().find(" ticks per second is incorrect for glTF, patching to 1000\n") + != std::string::npos); +} + +void AssimpImporterTest::animationGltfBrokenSplineWarning() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) + CORRADE_SKIP("Current version of assimp correctly imports glTF spline-interpolated animations."); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + + std::ostringstream out; + { + Warning redirectWarning{&out}; + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + } + CORRADE_COMPARE(out.str(), "Trade::AssimpImporter::openData(): spline-interpolated animations imported " + "from this file are most likely broken using this version of Assimp. Consult the " + "importer documentation for more information.\n"); +} + +void AssimpImporterTest::animationGltfSpline() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + + CORRADE_COMPARE(importer->animationCount(), 3); + CORRADE_COMPARE(importer->animationName(2), "TRS animation, splines"); + + constexpr Float keys[]{ 0.5f, 3.5f, 4.0f, 5.0f }; + + auto animation = importer->animation(2); + CORRADE_VERIFY(animation); + CORRADE_VERIFY(animation->importerState()); + /* Four T/R/S keys */ + CORRADE_COMPARE(animation->data().size(), + 4*(sizeof(Float) + sizeof(Quaternion)) + + 2*4*(sizeof(Float) + sizeof(Vector3))); + CORRADE_COMPARE(animation->trackCount(), 3); + + /* Rotation */ + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackResultType(0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(0), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(0), 3); + Animation::TrackView rotation = animation->track(0); + CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(rotation.before(), Animation::Extrapolation::Constant); + CORRADE_COMPARE(rotation.after(), Animation::Extrapolation::Constant); + CORRADE_COMPARE_AS(rotation.keys(), (Containers::StridedArrayView1D{keys}), TestSuite::Compare::Container); + if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + constexpr Quaternion rotationValues[]{ + {{0.780076f, 0.0260025f, 0.598059f}, 0.182018f}, + {{-0.711568f, 0.391362f, 0.355784f}, 0.462519f}, + {{0.598059f, 0.182018f, 0.0260025f}, 0.780076f}, + {{0.711568f, -0.355784f, -0.462519f}, -0.391362f} + }; + CORRADE_COMPARE_AS(rotation.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + } + + /* Translation */ + CORRADE_COMPARE(animation->trackType(1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(1), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(1), 4); + Animation::TrackView translation = animation->track(1); + CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(translation.before(), Animation::Extrapolation::Constant); + CORRADE_COMPARE(translation.after(), Animation::Extrapolation::Constant); + CORRADE_COMPARE_AS(translation.keys(), (Containers::StridedArrayView1D{keys}), TestSuite::Compare::Container); + if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + constexpr Vector3 translationValues[]{ + {3.0f, 0.1f, 2.5f}, + {-2.0f, 1.1f, -4.3f}, + {1.5f, 9.8f, -5.1f}, + {5.1f, 0.1f, -7.3f} + }; + CORRADE_COMPARE_AS(translation.values(), (Containers::StridedArrayView1D{translationValues}), TestSuite::Compare::Container); + } + + /* Scaling */ + CORRADE_COMPARE(animation->trackType(2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(2), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(2), 5); + Animation::TrackView scaling = animation->track(2); + CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(scaling.before(), Animation::Extrapolation::Constant); + CORRADE_COMPARE(scaling.after(), Animation::Extrapolation::Constant); + CORRADE_COMPARE_AS(scaling.keys(), (Containers::StridedArrayView1D{keys}), TestSuite::Compare::Container); + if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + constexpr Vector3 scalingData[]{ + {-2.0f, 1.1f, -4.3f}, + {5.1f, 0.1f, -7.3f}, + {3.0f, 0.1f, 2.5f}, + {1.5f, 9.8f, -5.1f} + }; + CORRADE_COMPARE_AS(scaling.values(), (Containers::StridedArrayView1D{scalingData}), TestSuite::Compare::Container); + } +} + +void AssimpImporterTest::animationDummyTracksRemovalOutput() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + /* The actual removal is already implicitly tested in animation(), + just check for the message here */ + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + importer->setFlags(data.flags); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + + std::ostringstream out; + { + Debug redirectDebug{&out}; + CORRADE_VERIFY(importer->animation(1)); + } + + if(data.flags >= ImporterFlag::Verbose) { + CORRADE_COMPARE(out.str(), + "Trade::AssimpImporter::animation(): ignoring dummy translation track in channel 0\n" + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in channel 0\n" + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in channel 1\n" + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in channel 1\n" + "Trade::AssimpImporter::animation(): ignoring dummy translation track in channel 2\n" + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in channel 2\n"); + } else { + CORRADE_VERIFY(out.str().empty()); + } +} + +void AssimpImporterTest::animationShortestPathOptimizationEnabled() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + /* Enabled by default */ + CORRADE_VERIFY(importer->configuration().value("optimizeQuaternionShortestPath")); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation-patching.gltf"))); + + CORRADE_COMPARE(importer->animationCount(), 2); + CORRADE_COMPARE(importer->animationName(0), "Quaternion shortest-path patching"); + + auto animation = importer->animation(0); + CORRADE_VERIFY(animation); + CORRADE_COMPARE(animation->trackCount(), 1); + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + Animation::TrackView track = animation->track(0); + constexpr Quaternion rotationValues[]{ + {{0.0f, 0.0f, 0.92388f}, -0.382683f}, // 0 s: 225° + {{0.0f, 0.0f, 0.707107f}, -0.707107f}, // 1 s: 270° + {{0.0f, 0.0f, 0.382683f}, -0.92388f}, // 2 s: 315° + {{0.0f, 0.0f, 0.0f}, -1.0f}, // 3 s: 360° / 0° + {{0.0f, 0.0f, -0.382683f}, -0.92388f}, // 4 s: 45° (flipped) + {{0.0f, 0.0f, -0.707107f}, -0.707107f}, // 5 s: 90° (flipped) + {{0.0f, 0.0f, -0.92388f}, -0.382683f}, // 6 s: 135° (flipped back) + {{0.0f, 0.0f, -1.0f}, 0.0f}, // 7 s: 180° (flipped back) + {{0.0f, 0.0f, -0.92388f}, 0.382683f} // 8 s: 225° (flipped) + }; + CORRADE_COMPARE_AS(track.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + + CORRADE_COMPARE(track.at(Math::slerp, 0.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 1.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 2.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 3.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 4.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 5.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 6.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 7.5f).axis(), -Vector3::zAxis()); + + /* Some are negated because of the flipped axis but other than that it's + nicely monotonic */ + CORRADE_COMPARE(track.at(Math::slerp, 0.5f).angle(), 247.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 1.5f).angle(), 292.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 2.5f).angle(), 337.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 3.5f).angle(), 360.0_degf - 22.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 4.5f).angle(), 360.0_degf - 67.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 5.5f).angle(), 360.0_degf - 112.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 6.5f).angle(), 360.0_degf - 157.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 7.5f).angle(), 360.0_degf - 202.5_degf); +} + +void AssimpImporterTest::animationShortestPathOptimizationDisabled() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + /* Explicitly disable */ + importer->configuration().setValue("optimizeQuaternionShortestPath", false); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation-patching.gltf"))); + + CORRADE_COMPARE(importer->animationCount(), 2); + CORRADE_COMPARE(importer->animationName(0), "Quaternion shortest-path patching"); + + auto animation = importer->animation(0); + CORRADE_VERIFY(animation); + CORRADE_COMPARE(animation->trackCount(), 1); + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + Animation::TrackView track = animation->track(0); + + /* Should be the same as in animation-patching.bin.in */ + constexpr Quaternion rotationValues[]{ + {{0.0f, 0.0f, 0.92388f}, -0.382683f}, // 0 s: 225° + {{0.0f, 0.0f, 0.707107f}, -0.707107f}, // 1 s: 270° + {{0.0f, 0.0f, 0.382683f}, -0.92388f}, // 2 s: 315° + {{0.0f, 0.0f, 0.0f}, -1.0f}, // 3 s: 360° / 0° + {{0.0f, 0.0f, 0.382683f}, 0.92388f}, // 4 s: 45° (longer path) + {{0.0f, 0.0f, 0.707107f}, 0.707107f}, // 5 s: 90° + {{0.0f, 0.0f, -0.92388f}, -0.382683f}, // 6 s: 135° (longer path) + {{0.0f, 0.0f, -1.0f}, 0.0f}, // 7 s: 180° + {{0.0f, 0.0f, 0.92388f}, -0.382683f} // 8 s: 225° (longer path) + }; + CORRADE_COMPARE_AS(track.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 0.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 1.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 2.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 3.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 4.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 5.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 6.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 7.5f).axis(), Vector3::zAxis()); + + /* Some are negated because of the flipped axis but other than that it's + nicely monotonic because slerpShortestPath() ensures that */ + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 0.5f).angle(), 247.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 1.5f).angle(), 292.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 2.5f).angle(), 337.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 3.5f).angle(), 22.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 4.5f).angle(), 67.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 5.5f).angle(), 360.0_degf - 112.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 6.5f).angle(), 360.0_degf - 157.5_degf); + CORRADE_COMPARE(track.at(Math::slerpShortestPath, 7.5f).angle(), 202.5_degf); + + CORRADE_COMPARE(track.at(Math::slerp, 0.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 1.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 2.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 3.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 4.5f).axis(), Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 5.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 6.5f).axis(), -Vector3::zAxis()); + CORRADE_COMPARE(track.at(Math::slerp, 7.5f).axis(), -Vector3::zAxis(1.00004f)); /* ?! */ + + /* Things are a complete chaos when using non-SP slerp */ + CORRADE_COMPARE(track.at(Math::slerp, 0.5f).angle(), 247.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 1.5f).angle(), 292.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 2.5f).angle(), 337.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 3.5f).angle(), 202.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 4.5f).angle(), 67.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 5.5f).angle(), 67.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 6.5f).angle(), 202.5_degf); + CORRADE_COMPARE(track.at(Math::slerp, 7.5f).angle(), 337.5_degf); +} + +void AssimpImporterTest::animationQuaternionNormalizationEnabled() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + /* Enabled by default */ + CORRADE_VERIFY(importer->configuration().value("normalizeQuaternions")); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation-patching.gltf"))); + CORRADE_COMPARE(importer->animationCount(), 2); + CORRADE_COMPARE(importer->animationName(1), "Quaternion normalization patching"); + + Containers::Optional animation; + std::ostringstream out; + { + Warning redirectWarning{&out}; + animation = importer->animation(1); + } + CORRADE_VERIFY(animation); + CORRADE_VERIFY(out.str().find("Trade::AssimpImporter::animation(): quaternions in some rotation tracks were renormalized\n") + != std::string::npos); + CORRADE_COMPARE(animation->trackCount(), 1); + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + + Animation::TrackView track = animation->track(0); + constexpr Quaternion rotationValues[]{ + {{0.0f, 0.0f, 0.382683f}, 0.92388f}, // is normalized + {{0.0f, 0.0f, 0.707107f}, 0.707107f}, // is not, renormalized + {{0.0f, 0.0f, 0.382683f}, 0.92388f}, // is not, renormalized + }; + /* There is a *ridiculous* bug in Assimp 5.0.1(?) with glTF animations that makes it + ignore the value sampler size and always uses the key sampler size + (instead of using the minimum of the two). Wouldn't be surprised + if this produces an out-of-bounds access somewhere, too. */ + /** @todo make the importer print a warning? this would be another + blanket warning like the spline animations */ + CORRADE_COMPARE_AS(track.values().prefix(Containers::arraySize(rotationValues)), + (Containers::StridedArrayView1D{rotationValues}), + TestSuite::Compare::Container); +} + +void AssimpImporterTest::animationQuaternionNormalizationDisabled() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + /* Explicitly disable */ + CORRADE_VERIFY(importer->configuration().setValue("normalizeQuaternions", false)); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation-patching.gltf"))); + CORRADE_COMPARE(importer->animationCount(), 2); + CORRADE_COMPARE(importer->animationName(1), "Quaternion normalization patching"); + + auto animation = importer->animation(1); + CORRADE_VERIFY(animation); + CORRADE_COMPARE(animation->trackCount(), 1); + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + + Animation::TrackView track = animation->track(0); + const Quaternion rotationValues[]{ + Quaternion{{0.0f, 0.0f, 0.382683f}, 0.92388f}, // is normalized + Quaternion{{0.0f, 0.0f, 0.707107f}, 0.707107f}*2, // is not + Quaternion{{0.0f, 0.0f, 0.382683f}, 0.92388f}*2, // is not + }; + CORRADE_COMPARE_AS(track.values().prefix(Containers::arraySize(rotationValues)), + (Containers::StridedArrayView1D{rotationValues}), + TestSuite::Compare::Container); +} + +void AssimpImporterTest::animationMergeEmpty() { + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + /* Enable animation merging */ + importer->configuration().setValue("mergeAnimationClips", true); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TINYGLTFIMPORTER_TEST_DIR, + "empty.gltf"))); + + CORRADE_COMPARE(importer->animationCount(), 0); + CORRADE_COMPARE(importer->animationForName(""), -1); +} + +void AssimpImporterTest::animationMerge() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + /* Enable animation merging */ + importer->configuration().setValue("mergeAnimationClips", true); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + + CORRADE_COMPARE(importer->animationCount(), 1); + CORRADE_COMPARE(importer->animationName(0), ""); + CORRADE_COMPARE(importer->animationForName(""), -1); + + auto animation = importer->animation(0); + CORRADE_VERIFY(animation); + CORRADE_VERIFY(!animation->importerState()); /* No particular clip */ + /* + - Nothing from the first animation + - Two rotation keys, four translation and scaling keys + from the second animation + - Four T/R/S keys from the third animation + */ + CORRADE_COMPARE(animation->data().size(), + 2*(sizeof(Float) + sizeof(Quaternion)) + + 2*4*(sizeof(Float) + sizeof(Vector3)) + + 4*(sizeof(Float) + sizeof(Quaternion)) + + 2*4*(sizeof(Float) + sizeof(Vector3))); + + CORRADE_COMPARE(animation->trackCount(), 6); + + /* Rotation, linearly interpolated */ + CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(0), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(0), 0); + Animation::TrackView rotation = animation->track(0); + CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(rotation.at(1.875f), Quaternion::rotation(90.0_degf, Vector3::xAxis())); + + /* Translation, constant interpolated, sharing keys with scaling */ + CORRADE_COMPARE(animation->trackType(1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(1), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(1), 1); + Animation::TrackView translation = animation->track(1); + CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(translation.at(1.5f), Vector3::yAxis(2.5f)); + + /* Scaling, linearly interpolated, sharing keys with translation */ + CORRADE_COMPARE(animation->trackType(2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(2), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(2), 2); + Animation::TrackView scaling = animation->track(2); + CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); + CORRADE_COMPARE(scaling.at(1.5f), Vector3::zScale(5.2f)); + + /* Rotation, spline interpolated */ + CORRADE_COMPARE(animation->trackType(3), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(3), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(3), 3); + Animation::TrackView rotation2 = animation->track(3); + CORRADE_COMPARE(rotation2.interpolation(), Animation::Interpolation::Linear); + + /* Translation, spline interpolated */ + CORRADE_COMPARE(animation->trackType(4), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(4), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(4), 4); + Animation::TrackView translation2 = animation->track(4); + CORRADE_COMPARE(translation2.interpolation(), Animation::Interpolation::Linear); + + /* Scaling, spline interpolated */ + CORRADE_COMPARE(animation->trackType(5), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(5), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(5), 5); + Animation::TrackView scaling2 = animation->track(5); + CORRADE_COMPARE(scaling2.interpolation(), Animation::Interpolation::Linear); +} + void AssimpImporterTest::camera() { Containers::Pointer importer = _manager.instantiate("AssimpImporter"); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "camera.dae"))); @@ -937,7 +1683,7 @@ void AssimpImporterTest::emptyGltf() { Containers::Pointer importer = _manager.instantiate("AssimpImporter"); - CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "empty.gltf"))); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TINYGLTFIMPORTER_TEST_DIR, "empty.gltf"))); CORRADE_COMPARE(importer->defaultScene(), -1); CORRADE_COMPARE(importer->sceneCount(), 0); CORRADE_COMPARE(importer->object3DCount(), 0); diff --git a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt index 0dfcde747..6a1144e16 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt @@ -24,9 +24,11 @@ # if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) + set(TINYGLTFIMPORTER_TEST_DIR ".") set(ASSIMPIMPORTER_TEST_DIR ".") else() - set(ASSIMPIMPORTER_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(TINYGLTFIMPORTER_TEST_DIR ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/TinyGltfImporter/Test) + set(ASSIMPIMPORTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) endif() # CMake before 3.8 has broken $ expressions for iOS (see diff --git a/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake b/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake index 5e900db40..1bf33c38a 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AssimpImporter/Test/configure.h.cmake @@ -26,4 +26,5 @@ #cmakedefine ASSIMPIMPORTER_PLUGIN_FILENAME "${ASSIMPIMPORTER_PLUGIN_FILENAME}" #cmakedefine DDSIMPORTER_PLUGIN_FILENAME "${DDSIMPORTER_PLUGIN_FILENAME}" #cmakedefine STBIMAGEIMPORTER_PLUGIN_FILENAME "${STBIMAGEIMPORTER_PLUGIN_FILENAME}" +#define TINYGLTFIMPORTER_TEST_DIR "${TINYGLTFIMPORTER_TEST_DIR}" #define ASSIMPIMPORTER_TEST_DIR "${ASSIMPIMPORTER_TEST_DIR}" From 07ea683554d1590e80d9c8c0e69ddb0fcc4db871 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 01:04:26 +0200 Subject: [PATCH 11/29] AssimpImporter: add test files --- .../Test/animation-embedded.glb | Bin 0 -> 2940 bytes .../Test/animation-embedded.gltf | 1 + .../Test/animation-no-scene.gltf | 1 + .../Test/animation-patching.bin | Bin 0 -> 228 bytes .../Test/animation-patching.gltf | 97 ++++ .../AssimpImporter/Test/animation.bin | Bin 0 -> 664 bytes .../AssimpImporter/Test/animation.glb | Bin 0 -> 2940 bytes .../AssimpImporter/Test/animation.gltf | 281 +++++++++++ .../AssimpImporter/Test/empty.gltf | 5 - .../exported-animation-curves-handles.dae | 461 ++++++++++++++++++ .../Test/exported-animation-curves.dae | 321 ++++++++++++ .../Test/exported-animation.blend | Bin 0 -> 131551 bytes .../Test/exported-animation.dae | 181 +++++++ .../Test/exported-animation.fbx | Bin 0 -> 84236 bytes .../Test/exported-animation.gltf | 229 +++++++++ 15 files changed, 1572 insertions(+), 5 deletions(-) create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-embedded.glb create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-embedded.gltf create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-no-scene.gltf create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-patching.bin create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-patching.gltf create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation.bin create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation.glb create mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation.gltf delete mode 100644 src/MagnumPlugins/AssimpImporter/Test/empty.gltf create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves-handles.dae create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation.blend create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation.fbx create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf diff --git a/src/MagnumPlugins/AssimpImporter/Test/animation-embedded.glb b/src/MagnumPlugins/AssimpImporter/Test/animation-embedded.glb new file mode 100644 index 0000000000000000000000000000000000000000..1652e499d921b58e368b3bced679c8ffcccf2268 GIT binary patch literal 2940 zcmc&$!B5jr7;p4K;>9b*!}1O$nqp|X4QO;LENCDL5Vmn4CY0I1lC5jjPDADrj*{>P zxSdE$JmAH|=mmpt<1pfhg9p5LGSUCR-}lyT-Np*cgO8Q%eee5z-|zdquYKJpq@Uan z1mV>!K{y!^g!$CsLY3*ZZ8%J=vKL0#&X-K4GWp>+tBFiE^F`f($!6+mm6>|cz@kyK zoGm7@?51v-MuFCziOklERsjGstBGyr^l~cHhUpHfdNE8L7n!4%H(E5z(sQJN$$Z(0>d1WtL=G0IlS zg;rT|ZeezM8HJT94)>9Wr0WmhUjI~jcFE_h1bg?Phie1H6+^aF$eV_J9hH@K=~q`d z+>W`H%8_>1B`U+QSG7cDW-gIhA~}5GP58vSa?s>3K~s<&J)vi_hHaO4lULb#C6_bG zD|zE3?~L^=$5_ne_`QTi$(D*%$uvwSy=9@DBa$2?W5q-tQ4ew}OC_e0XdmL_heIO| z1-CMr2={@3j2~<=m>YICm>bCZ;Vvn)0|#zOAGaPb3G*P~Ec(qRCPpl?^uru zxwi#&#q~)Tjq+tWHd~ABN4dH>F4CVw=NUiR)Ky88MFn&Jvs+yq3yWhBG0G2@{~C@B zrVl4<&|$`3JlxVy39%Q$VuU}B?JQi-HMLME^ad|BGjj`gyV;8iLP*084DYw4@oD?t zHhkzBG`w}s$HVjNds-{9*M8*MJzUS9;~?J}*0*u(X^Nu6Pn)~2X_$Y&)je*1d>WT; zo;@<|jK=@0tFia{`-kLl+H5}Fc|8)#WX=%ZeEj9$0Ba9o%lD&S8*3-{{v4bC_B%$n zjru6?M`n=sIG4Mpx$!aBH4m3^P%gqcZ6;%i^7E)s{~pif-jP1IIClZ~abO<;`w)3J z7s9)EXd2TlF{j{IExJmCUfcc&HQEqput{M@j{b2aL}fHQFTatXZF vOy-mJVt3xN0l5I+E721g(UgS6%xd-nH-_rdtzSxoJLct4B}l(Pe> yf%75a4RAhG9%L67K=s4A}wbC literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/AssimpImporter/Test/animation-patching.gltf b/src/MagnumPlugins/AssimpImporter/Test/animation-patching.gltf new file mode 100644 index 000000000..2e823800d --- /dev/null +++ b/src/MagnumPlugins/AssimpImporter/Test/animation-patching.gltf @@ -0,0 +1,97 @@ +{ + "asset": { + "version": "2.0" + }, + "animations": [ + { + "name": "Quaternion shortest-path patching", + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "rotation" + } + } + ], + "samplers": [ + { + "input": 0, + "interpolation": "LINEAR", + "output": 1 + } + ] + }, + { + "name": "Quaternion normalization patching", + "channels": [ + { + "sampler": 0, + "target": { + "node": 0, + "path": "rotation" + } + } + ], + "samplers": [ + { + "input": 0, + "interpolation": "LINEAR", + "output": 2 + } + ] + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5126, + "count": 9, + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 9, + "type": "VEC4" + }, + { + "bufferView": 1, + "byteOffset": 144, + "componentType": 5126, + "count": 3, + "type": "VEC4" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 36 + }, + { + "buffer": 0, + "byteOffset": 36, + "byteLength": 192 + } + ], + "buffers": [ + { + "byteLength": 228, + "uri": "animation-patching.bin" + } + ], + "nodes": [ + {} + ], + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "scene": 0 +} diff --git a/src/MagnumPlugins/AssimpImporter/Test/animation.bin b/src/MagnumPlugins/AssimpImporter/Test/animation.bin new file mode 100644 index 0000000000000000000000000000000000000000..463bae1afe1d6660dc9251376bb0ed66ca89d729 GIT binary patch literal 664 zcmZ`$u}T9$5FM~dX&XslC1~k_MKHUojUZOS^+EA!KOv=o{J?H?AXvmk5N#sorL)+> zDuqRCtOWfB-)wGhBW7T@+nG1-y`3d04AG{g81jGFoEKH10Wh4aLi&OcKB*UWG5NP% zHFeKcuu3UYhY@NP=R4$btluA*-L={N#YWqFpLO-^cw91~4xu-^YUwPS zVLtSpCKL2_^y&8Av+uv)`>2m!zcllD*9L#<5W3Sm-?GiTM%@Z8Yp@n`)!{@d^-+2E zX7c=o_k)by3H%1!CAdrIL@&(ue^|?W{0^z_)HCKPzQ1?FD)pNB1O&c12TEN7`|B_D zhF;Y2?h`yKBhjLG*DQOm@AG-w9X#UROFWT__s2VdHu~pN_9^$`H}uY-H9b*!}1O$nqp|X4QO;LENCDL5Vmn4CY0I1lC5jjPDADrj*{>P zxSdE$JmAH|=mmpt<1pfhg9p5LGSUCR-}lyT-Np*cgO8Q%eee5z-|zdquYKJpq@Uan z1mV>!K{y!^g!$CsLY3*ZZ8%J=vKL0#&X-K4GWp>+tBFiE^F`f($!6+mm6>|cz@kyK zoGm7@?51v-MuFCziOklERsjGstBGyr^l~cHhUpHfdNE8L7n!4%H(E5z(sQJN$$Z(0>d1WtL=G0IlS zg;rT|ZeezM8HJT94)>9Wr0WmhUjI~jcFE_h1bg?Phie1H6+^aF$eV_J9hH@K=~q`d z+>W`H%8_>1B`U+QSG7cDW-gIhA~}5GP58vSa?s>3K~s<&J)vi_hHaO4lULb#C6_bG zD|zE3?~L^=$5_ne_`QTi$(D*%$uvwSy=9@DBa$2?W5q-tQ4ew}OC_e0XdmL_heIO| z1-CMr2={@3j2~<=m>YICm>bCZ;Vvn)0|#zOAGaPb3G*P~Ec(qRCPpl?^uru zxwi#&#q~)Tjq+tWHd~ABN4dH>F4CVw=NUiR)Ky88MFn&Jvs+yq3yWhBG0G2@{~C@B zrVl4<&|$`3JlxVy39%Q$VuU}B?JQi-HMLME^ad|BGjj`gyV;8iLP*084DYw4@oD?t zHhkzBG`w}s$HVjNds-{9*M8*MJzUS9;~?J}*0*u(X^Nu6Pn)~2X_$Y&)je*1d>WT; zo;@<|jK=@0tFia{`-kLl+H5}Fc|8)#WX=%ZeEj9$0Ba9o%lD&S8*3-{{v4bC_B%$n zjru6?M`n=sIG4Mpx$!aBH4m3^P%gqcZ6;%i^7E)s{~pif-jP1IIClZ~abO<;`w)3J z7s9)EXd2TlF{j{IExJmCUfcc&HQEqput{M@j{b2aL}fHQFTatXZF vOy-mJ + + + + Blender User + Blender 2.93.0 commit date:2021-06-02, commit time:11:21, hash:84da05a8b806 + + 2021-06-23T01:55:49 + 2021-06-23T01:55:49 + + Z_UP + + + + + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+
+ + + + + 2.5 5 7.5 + + + + + + + + 5 1 0.5 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 5 4.166666 1.5 6.666666 0.5 + + + + + + + + + 3.333333 5 5.833333 0.5 8.333333 0.5 + + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 1 1 0.5 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 1 4.166666 1 6.666666 0.5 + + + + + + + + + 3.333333 1 5.833333 1 8.333333 0.5 + + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 1 5 0.5 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 1 4.166666 5 6.666666 0.5 + + + + + + + + + 3.333333 1 5.833333 5 8.333333 0.5 + + + + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 5 5 0 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 5 4.166666 5 6.666666 0 + + + + + + + + + 3.333333 5 5.833333 5 8.333333 0 + + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + -3 -8 -8 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 -3 4.166666 -8 6.666666 -8 + + + + + + + + + 3.333333 -3 5.833333 -8 8.333333 -8 + + + + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 0 -0.01256364 45.02122 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 0 4.166666 -0.01256364 6.666666 45.02122 + + + + + + + + + 3.333333 0 5.833333 -0.01256364 8.333333 45.02122 + + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 0 -90.0008 -89.96865 + + + + + + + + BEZIER BEZIER BEZIER + + + + + + + + 1.666667 0 4.166666 -90.0008 6.666666 -89.96865 + + + + + + + + + 3.333333 0 5.833333 -90.0008 8.333333 -89.96865 + + + + + + + + + + + + + + + + + + + + + + 1 1 1 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 0 -8 0 + + + + 0.5 0.5 0.5 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 0 3 0 + + + + 1 1 1 + 0 0 1 -89.97488 + 0 1 0 89.98238 + 1 0 0 45 + 0 0 0 + + + + + + + +
\ No newline at end of file diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae b/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae new file mode 100644 index 000000000..bbc2a4e5f --- /dev/null +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae @@ -0,0 +1,321 @@ + + + + + Blender User + Blender 2.93.0 commit date:2021-06-02, commit time:11:21, hash:84da05a8b806 + + 2021-06-23T01:55:33 + 2021-06-23T01:55:33 + + Z_UP + + + + + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+
+ + + + + 2.5 5 7.5 + + + + + + + + 5 1 0.5 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 1 1 0.5 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 1 5 0.5 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 5 5 0 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + -3 -8 -8 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 0 -0.01256364 45.02122 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 2.5 5 7.5 + + + + + + + + 0 -90.0008 -89.96865 + + + + + + + + LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + + + + 1 1 1 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 0 -8 0 + + + + 0.5 0.5 0.5 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 0 3 0 + + + + 1 1 1 + 0 0 1 -89.97488 + 0 1 0 89.98238 + 1 0 0 45 + 0 0 0 + + + + + + + +
\ No newline at end of file diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.blend b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.blend new file mode 100644 index 0000000000000000000000000000000000000000..46f6389bafd0ea43e2e40abc92d56ee1d2e5e41f GIT binary patch literal 131551 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 literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae new file mode 100644 index 000000000..e679319e7 --- /dev/null +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae @@ -0,0 +1,181 @@ + + + + + Blender User + Blender 2.93.0 commit date:2021-06-02, commit time:11:21, hash:84da05a8b806 + + 2021-06-23T01:55:12 + 2021-06-23T01:55:12 + + Z_UP + + + + + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+
+ + + + + 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 7.541666 7.583333 7.625 7.666666 7.708333 7.75 7.791666 7.833333 7.875 7.916666 7.958333 8 8.041667 8.083333 8.125 8.166667 8.208333 8.25 8.291667 8.333333 8.375 8.416667 8.458333 8.5 8.541667 8.583333 8.625 8.666667 8.708333 8.75 8.791667 8.833333 8.875 8.916667 8.958333 9 9.041667 9.083333 9.125 9.166667 9.208333 9.25 9.291667 9.333333 9.375 9.416667 9.458333 9.5 9.541667 9.583333 9.625 9.666667 9.708333 9.75 9.791667 9.833333 9.875 9.916667 9.958333 10 10.04167 10.08333 10.125 10.16667 10.20833 10.25 10.29167 10.33333 10.375 10.41667 + + + + + + + + 1.003296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.013037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.029 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.050963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.078704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.112 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.15063 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.19437 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.243 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.296296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.354037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.416 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.481963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.551704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.625 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.70163 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.78137 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.864 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.949296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.037037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.127 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.218963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.312704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.408 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.50463 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.602371 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.701 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.800296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.900037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.099963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.199704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.299 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.39763 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.49537 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.592 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.687296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.781037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.873 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.962963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.050704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.136 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.21863 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.29837 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.375 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.448297 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.518037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.584 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.645963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.703704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.757 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.80563 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.84937 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.888 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.921297 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.949037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.971 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.986963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.996704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 5 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.997113 0 0 0 0 1 0 3 0 0 1.003296 0 0 0 0 1 4.988574 0 0 0 0 1 0 3 0 0 1.013037 0 0 0 0 1 4.974563 0 0 0 0 1 0 3 0 0 1.029 0 0 0 0 1 4.955259 0 0 0 0 1 0 3 0 0 1.050963 0 0 0 0 1 4.930845 0 0 0 0 1 0 3 0 0 1.078704 0 0 0 0 1 4.9015 0 0 0 0 1 0 3 0 0 1.112 0 0 0 0 1 4.867405 0 0 0 0 1 0 3 0 0 1.15063 0 0 0 0 1 4.828741 0 0 0 0 1 0 3 0 0 1.19437 0 0 0 0 1 4.785687 0 0 0 0 1 0 3 0 0 1.243 0 0 0 0 1 4.738426 0 0 0 0 1 0 3 0 0 1.296296 0 0 0 0 1 4.687137 0 0 0 0 1 0 3 0 0 1.354037 0 0 0 0 1 4.632 0 0 0 0 1 0 3 0 0 1.416 0 0 0 0 1 4.573197 0 0 0 0 1 0 3 0 0 1.481963 0 0 0 0 1 4.510907 0 0 0 0 1 0 3 0 0 1.551704 0 0 0 0 1 4.445312 0 0 0 0 1 0 3 0 0 1.625 0 0 0 0 1 4.376592 0 0 0 0 1 0 3 0 0 1.70163 0 0 0 0 1 4.304928 0 0 0 0 1 0 3 0 0 1.78137 0 0 0 0 1 4.2305 0 0 0 0 1 0 3 0 0 1.864 0 0 0 0 1 4.153489 0 0 0 0 1 0 3 0 0 1.949296 0 0 0 0 1 4.074074 0 0 0 0 1 0 3 0 0 2.037037 0 0 0 0 1 3.992437 0 0 0 0 1 0 3 0 0 2.127 0 0 0 0 1 3.908759 0 0 0 0 1 0 3 0 0 2.218963 0 0 0 0 1 3.82322 0 0 0 0 1 0 3 0 0 2.312704 0 0 0 0 1 3.736 0 0 0 0 1 0 3 0 0 2.408 0 0 0 0 1 3.64728 0 0 0 0 1 0 3 0 0 2.50463 0 0 0 0 1 3.55724 0 0 0 0 1 0 3 0 0 2.602371 0 0 0 0 1 3.466063 0 0 0 0 1 0 3 0 0 2.701 0 0 0 0 1 3.373926 0 0 0 0 1 0 3 0 0 2.800296 0 0 0 0 1 3.281012 0 0 0 0 1 0 3 0 0 2.900037 0 0 0 0 1 3.1875 0 0 0 0 1 0 3 0 0 3 0 0 0 0 1 3.093572 0 0 0 0 1 0 3 0 0 3.099963 0 0 0 0 1 2.999407 0 0 0 0 1 0 3 0 0 3.199704 0 0 0 0 1 2.905188 0 0 0 0 1 0 3 0 0 3.299 0 0 0 0 1 2.811093 0 0 0 0 1 0 3 0 0 3.39763 0 0 0 0 1 2.717303 0 0 0 0 1 0 3 0 0 3.49537 0 0 0 0 1 2.624 0 0 0 0 1 0 3 0 0 3.592 0 0 0 0 1 2.531363 0 0 0 0 1 0 3 0 0 3.687296 0 0 0 0 1 2.439574 0 0 0 0 1 0 3 0 0 3.781037 0 0 0 0 1 2.348813 0 0 0 0 1 0 3 0 0 3.873 0 0 0 0 1 2.259259 0 0 0 0 1 0 3 0 0 3.962963 0 0 0 0 1 2.171095 0 0 0 0 1 0 3 0 0 4.050704 0 0 0 0 1 2.0845 0 0 0 0 1 0 3 0 0 4.136 0 0 0 0 1 1.999655 0 0 0 0 1 0 3 0 0 4.21863 0 0 0 0 1 1.916741 0 0 0 0 1 0 3 0 0 4.29837 0 0 0 0 1 1.835938 0 0 0 0 1 0 3 0 0 4.375 0 0 0 0 1 1.757426 0 0 0 0 1 0 3 0 0 4.448297 0 0 0 0 1 1.681386 0 0 0 0 1 0 3 0 0 4.518037 0 0 0 0 1 1.608 0 0 0 0 1 0 3 0 0 4.584 0 0 0 0 1 1.537446 0 0 0 0 1 0 3 0 0 4.645963 0 0 0 0 1 1.469907 0 0 0 0 1 0 3 0 0 4.703704 0 0 0 0 1 1.405562 0 0 0 0 1 0 3 0 0 4.757 0 0 0 0 1 1.344592 0 0 0 0 1 0 3 0 0 4.80563 0 0 0 0 1 1.287178 0 0 0 0 1 0 3 0 0 4.84937 0 0 0 0 1 1.2335 0 0 0 0 1 0 3 0 0 4.888 0 0 0 0 1 1.183738 0 0 0 0 1 0 3 0 0 4.921297 0 0 0 0 1 1.138074 0 0 0 0 1 0 3 0 0 4.949037 0 0 0 0 1 1.096688 0 0 0 0 1 0 3 0 0 4.971 0 0 0 0 1 1.05976 0 0 0 0 1 0 3 0 0 4.986963 0 0 0 0 1 1.02747 0 0 0 0 1 0 3 0 0 4.996704 0 0 0 0 1 1 0 0 0 0 1 0 3 0 0 5 0 0 0 0 1 0.9754144 0 0 0 0 0.999588 0 3 0 0 4.996292 0 0 0 0 1 0.9516481 0 0 0 0 0.9983703 0 3 0 0 4.985333 0 0 0 0 1 0.9286875 0 0 0 0 0.996375 0 3 0 0 4.967375 0 0 0 0 1 0.9065185 0 0 0 0 0.9936296 0 3 0 0 4.942667 0 0 0 0 1 0.8851273 0 0 0 0 0.990162 0 3 0 0 4.911458 0 0 0 0 1 0.8645 0 0 0 0 0.986 0 3 0 0 4.874 0 0 0 0 1 0.8446227 0 0 0 0 0.9811713 0 3 0 0 4.830542 0 0 0 0 1 0.8254814 0 0 0 0 0.9757037 0 3 0 0 4.781333 0 0 0 0 1 0.8070624 0 0 0 0 0.969625 0 3 0 0 4.726625 0 0 0 0 1 0.7893519 0 0 0 0 0.9629629 0 3 0 0 4.666667 0 0 0 0 1 0.7723356 0 0 0 0 0.9557454 0 3 0 0 4.601708 0 0 0 0 1 0.756 0 0 0 0 0.948 0 3 0 0 4.532 0 0 0 0 1 0.7403311 0 0 0 0 0.9397546 0 3 0 0 4.457792 0 0 0 0 1 0.7253148 0 0 0 0 0.9310371 0 3 0 0 4.379333 0 0 0 0 1 0.7109375 0 0 0 0 0.921875 0 3 0 0 4.296875 0 0 0 0 1 0.6971852 0 0 0 0 0.9122963 0 3 0 0 4.210667 0 0 0 0 1 0.684044 0 0 0 0 0.9023287 0 3 0 0 4.120958 0 0 0 0 1 0.6715 0 0 0 0 0.892 0 3 0 0 4.028 0 0 0 0 1 0.6595393 0 0 0 0 0.8813379 0 3 0 0 3.932042 0 0 0 0 1 0.6481482 0 0 0 0 0.8703703 0 3 0 0 3.833333 0 0 0 0 1 0.6373125 0 0 0 0 0.859125 0 3 0 0 3.732125 0 0 0 0 1 0.6270185 0 0 0 0 0.8476297 0 3 0 0 3.628667 0 0 0 0 1 0.6172523 0 0 0 0 0.835912 0 3 0 0 3.523208 0 0 0 0 1 0.608 0 0 0 0 0.824 0 3 0 0 3.416 0 0 0 0 1 0.5992476 0 0 0 0 0.8119214 0 3 0 0 3.307292 0 0 0 0 1 0.5909815 0 0 0 0 0.7997037 0 3 0 0 3.197333 0 0 0 0 1 0.5831875 0 0 0 0 0.787375 0 3 0 0 3.086375 0 0 0 0 1 0.5758519 0 0 0 0 0.774963 0 3 0 0 2.974667 0 0 0 0 1 0.5689606 0 0 0 0 0.7624953 0 3 0 0 2.862458 0 0 0 0 1 0.5625 0 0 0 0 0.75 0 3 0 0 2.75 0 0 0 0 1 0.556456 0 0 0 0 0.7375046 0 3 0 0 2.637542 0 0 0 0 1 0.5508148 0 0 0 0 0.725037 0 3 0 0 2.525333 0 0 0 0 1 0.5455624 0 0 0 0 0.712625 0 3 0 0 2.413625 0 0 0 0 1 0.5406852 0 0 0 0 0.7002963 0 3 0 0 2.302667 0 0 0 0 1 0.5361689 0 0 0 0 0.6880788 0 3 0 0 2.192708 0 0 0 0 1 0.5319999 0 0 0 0 0.676 0 3 0 0 2.084 0 0 0 0 1 0.5281644 0 0 0 0 0.664088 0 3 0 0 1.976792 0 0 0 0 1 0.5246481 0 0 0 0 0.6523704 0 3 0 0 1.871333 0 0 0 0 1 0.5214375 0 0 0 0 0.640875 0 3 0 0 1.767876 0 0 0 0 1 0.5185186 0 0 0 0 0.6296296 0 3 0 0 1.666667 0 0 0 0 1 0.5158774 0 0 0 0 0.618662 0 3 0 0 1.567958 0 0 0 0 1 0.5135 0 0 0 0 0.608 0 3 0 0 1.472 0 0 0 0 1 0.5113727 0 0 0 0 0.5976713 0 3 0 0 1.379042 0 0 0 0 1 0.5094814 0 0 0 0 0.5877037 0 3 0 0 1.289333 0 0 0 0 1 0.5078125 0 0 0 0 0.578125 0 3 0 0 1.203125 0 0 0 0 1 0.5063518 0 0 0 0 0.568963 0 3 0 0 1.120667 0 0 0 0 1 0.5050856 0 0 0 0 0.5602454 0 3 0 0 1.042209 0 0 0 0 1 0.5039999 0 0 0 0 0.552 0 3 0 0 0.9679999 0 0 0 0 1 0.503081 0 0 0 0 0.5442547 0 3 0 0 0.8982916 0 0 0 0 1 0.5023148 0 0 0 0 0.537037 0 3 0 0 0.833333 0 0 0 0 1 0.5016874 0 0 0 0 0.530375 0 3 0 0 0.7733746 0 0 0 0 1 0.5011853 0 0 0 0 0.5242962 0 3 0 0 0.7186666 0 0 0 0 1 0.5007939 0 0 0 0 0.5188287 0 3 0 0 0.6694579 0 0 0 0 1 0.5005001 0 0 0 0 0.514 0 3 0 0 0.6259999 0 0 0 0 1 0.5002894 0 0 0 0 0.5098379 0 3 0 0 0.588542 0 0 0 0 1 0.5001481 0 0 0 0 0.5063704 0 3 0 0 0.557333 0 0 0 0 1 0.5000626 0 0 0 0 0.503625 0 3 0 0 0.5326257 0 0 0 0 1 0.5000185 0 0 0 0 0.5016297 0 3 0 0 0.5146666 0 0 0 0 1 0.5000023 0 0 0 0 0.500412 0 3 0 0 0.5037088 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + + + 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 7.541666 7.583333 7.625 7.666666 7.708333 7.75 7.791666 7.833333 7.875 7.916666 7.958333 8 8.041667 8.083333 8.125 8.166667 8.208333 8.25 8.291667 8.333333 8.375 8.416667 8.458333 8.5 8.541667 8.583333 8.625 8.666667 8.708333 8.75 8.791667 8.833333 8.875 8.916667 8.958333 9 9.041667 9.083333 9.125 9.166667 9.208333 9.25 9.291667 9.333333 9.375 9.416667 9.458333 9.5 9.541667 9.583333 9.625 9.666667 9.708333 9.75 9.791667 9.833333 9.875 9.916667 9.958333 10 10.04167 10.08333 10.125 10.16667 10.20833 10.25 10.29167 10.33333 10.375 10.41667 + + + + + + + + 1 0 0 0.004120371 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.0162963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.03625 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.06370372 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.09837963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.14 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.188287 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.242963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.30375 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.3703704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.4425463 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.52 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.6024537 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.6896296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.78125 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.8770372 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.9767129 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.08 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.18662 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.296296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.40875 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.523704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.640879 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.76 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.880787 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.002963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.12625 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.250371 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.375046 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.5 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.624954 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.74963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.87375 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.997037 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.119213 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.24 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.35912 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.476296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.591249 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.703704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.81338 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.92 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.023287 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.122963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.21875 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.310369 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.397546 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.48 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.557454 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.62963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.69625 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.757037 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.811712 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.860001 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.90162 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.936296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.96375 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.983704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.995879 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.00412 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.016296 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.03625 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.063704 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.09838 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.14 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.188287 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.242963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.30375 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.37037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.442546 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.52 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.602454 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.68963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.78125 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.877037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.976713 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.08 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.18662 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.296297 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.40875 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.523704 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.64088 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.76 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.880787 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.002963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.12625 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.25037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.375046 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.5 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.624954 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.74963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.87375 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.997037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.119212 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.239999 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.35912 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.476296 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.59125 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.703704 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.813379 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.920001 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.023287 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.122963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.21875 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.310369 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.397546 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.48 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.557454 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.62963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.69625 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.757037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.811712 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.860001 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.90162 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.936296 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.963749 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.983705 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.995878 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.99588 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.983704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.96375 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.936296 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.90162 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.86 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.811713 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.757037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.69625 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.62963 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.557454 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.48 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.397546 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.31037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.21875 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.122963 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.023287 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.92 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.81338 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.703704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.59125 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.476296 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.359121 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.24 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.119213 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.997037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.87375 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.749629 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.624954 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.5 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.375046 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.25037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.12625 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.002963 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.880787 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.76 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.64088 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.523704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.408751 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.296296 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.18662 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.08 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.9767127 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.877037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.78125 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.6896305 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.6024537 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.52 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.4425464 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.3703704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.3037496 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.2429628 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.1882877 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.1399994 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.09837961 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.06370354 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.03625011 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.01629639 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.004120827 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + + + 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 7.541666 7.583333 7.625 7.666666 7.708333 7.75 7.791666 7.833333 7.875 7.916666 7.958333 8 8.041667 8.083333 8.125 8.166667 8.208333 8.25 8.291667 8.333333 8.375 8.416667 8.458333 8.5 8.541667 8.583333 8.625 8.666667 8.708333 8.75 8.791667 8.833333 8.875 8.916667 8.958333 9 9.041667 9.083333 9.125 9.166667 9.208333 9.25 9.291667 9.333333 9.375 9.416667 9.458333 9.5 9.541667 9.583333 9.625 9.666667 9.708333 9.75 9.791667 9.833333 9.875 9.916667 9.958333 10 10.04167 10.08333 10.125 10.16667 10.20833 10.25 10.29167 10.33333 10.375 10.41667 + + + + + + + + 0.9999992 0 0.001294199 0 0 1 0 0 -0.001294199 0 0.9999992 0 0 0 0 1 0.9999869 0 0.005118608 0 0 1 0 0 -0.005118608 0 0.9999869 0 0 0 0 1 0.9999352 0 0.0113858 0 0 1 0 0 -0.0113858 0 0.9999352 0 0 0 0 1 0.9997998 0 0.02000786 0 0 1 0 0 -0.02000786 0 0.9997998 0 0 0 0 1 0.9995226 0 0.0308959 0 0 1 0 0 -0.0308959 0 0.9995226 0 0 0 0 1 0.9990333 0 0.04395952 0 0 1 0 0 -0.04395952 0 0.9990333 0 0 0 0 1 0.9982517 0 0.05910606 0 0 1 0 0 -0.05910606 0 0.9982517 0 0 0 0 1 0.9970895 0 0.07624008 0 0 1 0 0 -0.07624008 0 0.9970895 0 0 0 0 1 0.9954522 0 0.09526252 0 0 1 0 0 -0.09526252 0 0.9954522 0 0 0 0 1 0.993241 0 0.1160703 0 0 1 0 0 -0.1160703 0 0.993241 0 0 0 0 1 0.9903547 0 0.1385556 0 0 1 0 0 -0.1385556 0 0.9903547 0 0 0 0 1 0.9866911 0 0.1626056 0 0 1 0 0 -0.1626056 0 0.9866911 0 0 0 0 1 0.9821495 0 0.1881021 0 0 1 0 0 -0.1881021 0 0.9821495 0 0 0 0 1 0.9766314 0 0.2149212 0 0 1 0 0 -0.2149212 0 0.9766314 0 0 0 0 1 0.9700429 0 0.2429336 0 0 1 0 0 -0.2429336 0 0.9700429 0 0 0 0 1 0.962296 0 0.2720045 0 0 1 0 0 -0.2720045 0 0.962296 0 0 0 0 1 0.9533099 0 0.3019937 0 0 1 0 0 -0.3019937 0 0.9533099 0 0 0 0 1 0.9430127 0 0.3327569 0 0 1 0 0 -0.3327569 0 0.9430127 0 0 0 0 1 0.9313422 0 0.3641452 0 0 1 0 0 -0.3641452 0 0.9313422 0 0 0 0 1 0.9182477 0 0.3960066 0 0 1 0 0 -0.3960066 0 0.9182477 0 0 0 0 1 0.9036903 0 0.4281866 0 0 1 0 0 -0.4281866 0 0.9036903 0 0 0 0 1 0.8876443 0 0.4605297 0 0 1 0 0 -0.4605297 0 0.8876443 0 0 0 0 1 0.8700973 0 0.49288 0 0 1 0 0 -0.49288 0 0.8700973 0 0 0 0 1 0.8510513 0 0.5250825 0 0 1 0 0 -0.5250825 0 0.8510513 0 0 0 0 1 0.8305226 0 0.5569849 0 0 1 0 0 -0.5569849 0 0.8305226 0 0 0 0 1 0.808542 0 0.5884385 0 0 1 0 0 -0.5884385 0 0.808542 0 0 0 0 1 0.7851548 0 0.6192997 0 0 1 0 0 -0.6192997 0 0.7851548 0 0 0 0 1 0.7604203 0 0.6494312 0 0 1 0 0 -0.6494312 0 0.7604203 0 0 0 0 1 0.7344118 0 0.6787041 0 0 1 0 0 -0.6787041 0 0.7344118 0 0 0 0 1 0.7072155 0 0.7069981 0 0 1 0 0 -0.7069981 0 0.7072155 0 0 0 0 1 0.67893 0 0.734203 0 0 1 0 0 -0.734203 0 0.67893 0 0 0 0 1 0.6496651 0 0.7602206 0 0 1 0 0 -0.7602206 0 0.6496651 0 0 0 0 1 0.619541 0 0.7849643 0 0 1 0 0 -0.7849643 0 0.619541 0 0 0 0 1 0.5886871 0 0.808361 0 0 1 0 0 -0.808361 0 0.5886871 0 0 0 0 1 0.5572402 0 0.8303513 0 0 1 0 0 -0.8303513 0 0.5572402 0 0 0 0 1 0.5253443 0 0.8508898 0 0 1 0 0 -0.8508898 0 0.5253443 0 0 0 0 1 0.4931476 0 0.8699456 0 0 1 0 0 -0.8699456 0 0.4931476 0 0 0 0 1 0.4608027 0 0.8875026 0 0 1 0 0 -0.8875026 0 0.4608027 0 0 0 0 1 0.4284647 0 0.9035585 0 0 1 0 0 -0.9035585 0 0.4284647 0 0 0 0 1 0.3962889 0 0.9181259 0 0 1 0 0 -0.9181259 0 0.3962889 0 0 0 0 1 0.3644315 0 0.9312302 0 0 1 0 0 -0.9312302 0 0.3644315 0 0 0 0 1 0.3330471 0 0.9429102 0 0 1 0 0 -0.9429102 0 0.3330471 0 0 0 0 1 0.3022869 0 0.953217 0 0 1 0 0 -0.953217 0 0.3022869 0 0 0 0 1 0.2723002 0 0.9622123 0 0 1 0 0 -0.9622123 0 0.2723002 0 0 0 0 1 0.2432317 0 0.9699682 0 0 1 0 0 -0.9699682 0 0.2432317 0 0 0 0 1 0.2152215 0 0.9765652 0 0 1 0 0 -0.9765652 0 0.2152215 0 0 0 0 1 0.188404 0 0.9820916 0 0 1 0 0 -0.9820916 0 0.188404 0 0 0 0 1 0.1629089 0 0.9866411 0 0 1 0 0 -0.9866411 0 0.1629089 0 0 0 0 1 0.13886 0 0.990312 0 0 1 0 0 -0.990312 0 0.13886 0 0 0 0 1 0.1163755 0 0.9932053 0 0 1 0 0 -0.9932053 0 0.1163755 0 0 0 0 1 0.09556845 0 0.9954228 0 0 1 0 0 -0.9954228 0 0.09556845 0 0 0 0 1 0.07654665 0 0.997066 0 0 1 0 0 -0.997066 0 0.07654665 0 0 0 0 1 0.05941283 0 0.9982335 0 0 1 0 0 -0.9982335 0 0.05941283 0 0 0 0 1 0.04426661 0 0.9990197 0 0 1 0 0 -0.9990197 0 0.04426661 0 0 0 0 1 0.03120329 0 0.999513 0 0 1 0 0 -0.999513 0 0.03120329 0 0 0 0 1 0.02031552 0 0.9997936 0 0 1 0 0 -0.9997936 0 0.02031552 0 0 0 0 1 0.01169329 0 0.9999316 0 0 1 0 0 -0.9999316 0 0.01169329 0 0 0 0 1 0.005425979 0 0.9999853 0 0 1 0 0 -0.9999853 0 0.005425979 0 0 0 0 1 0.001601771 0 0.9999987 0 0 1 0 0 -0.9999987 0 0.001601771 0 0 0 0 1 3.07516e-4 0 0.9999999 0 0 1 0 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07516e-4 0.001294091 0.9999991 0 -3.97954e-7 0.9999992 -0.001294091 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07512e-4 0.005118181 0.9999868 0 -1.57392e-6 0.9999869 -0.005118181 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07496e-4 0.01138485 0.9999352 0 -3.50103e-6 0.9999352 -0.01138485 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07455e-4 0.02000619 0.9997998 0 -6.15223e-6 0.9997998 -0.02000619 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07369e-4 0.03089333 0.9995226 0 -9.5002e-6 0.9995227 -0.03089333 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07219e-4 0.04395586 0.9990335 0 -1.35171e-5 0.9990335 -0.04395586 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.06979e-4 0.05910115 0.998252 0 -1.81746e-5 0.998252 -0.05910114 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.06621e-4 0.07623373 0.9970899 0 -2.34431e-5 0.99709 -0.07623373 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.06118e-4 0.0952546 0.9954529 0 -2.92923e-5 0.9954529 -0.09525459 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.05438e-4 0.1160607 0.9932421 0 -3.56905e-5 0.9932421 -0.1160607 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.04551e-4 0.1385441 0.9903562 0 -4.26046e-5 0.9903563 -0.1385441 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.03424e-4 0.1625922 0.9866933 0 -4.99997e-5 0.9866934 -0.1625922 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.02028e-4 0.1880866 0.9821524 0 -5.78397e-5 0.9821525 -0.1880866 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.00331e-4 0.2149035 0.9766352 0 -6.60863e-5 0.9766353 -0.2149035 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.98306e-4 0.2429137 0.9700478 0 -7.46999e-5 0.9700479 -0.2429137 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.95924e-4 0.2719823 0.9623022 0 -8.3639e-5 0.9623023 -0.2719823 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.93161e-4 0.3019693 0.9533176 0 -9.28605e-5 0.9533176 -0.3019693 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.89995e-4 0.3327302 0.943022 0 -1.0232e-4 0.9430221 -0.3327302 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.86406e-4 0.3641162 0.9313534 0 -1.11972e-4 0.9313535 -0.3641162 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.8238e-4 0.3959754 0.9182611 0 -1.21769e-4 0.9182611 -0.3959754 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.77904e-4 0.4281533 0.9037061 0 -1.31664e-4 0.9037061 -0.4281533 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.72971e-4 0.4604944 0.8876626 0 -1.4161e-4 0.8876626 -0.4604943 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.67576e-4 0.4928425 0.8701185 0 -1.51557e-4 0.8701185 -0.4928425 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.6172e-4 0.5250433 0.8510755 0 -1.61459e-4 0.8510755 -0.5250432 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.55408e-4 0.556944 0.83055 0 -1.71269e-4 0.8305501 -0.556944 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.48649e-4 0.5883961 0.8085728 0 -1.80941e-4 0.8085729 -0.588396 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.41458e-4 0.6192559 0.7851892 0 -1.90431e-4 0.7851893 -0.6192558 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.33853e-4 0.6493865 0.7604585 0 -1.99697e-4 0.7604586 -0.6493864 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.25857e-4 0.6786584 0.734454 0 -2.08699e-4 0.734454 -0.6786584 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.17494e-4 0.7069517 0.7072618 0 -2.17399e-4 0.7072618 -0.7069517 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.08798e-4 0.7341564 0.6789804 0 -2.25765e-4 0.6789805 -0.7341563 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.99799e-4 0.7601737 0.6497198 0 -2.33766e-4 0.6497198 -0.7601737 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.90537e-4 0.7849176 0.6196001 0 -2.41375e-4 0.6196001 -0.7849176 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.8105e-4 0.8083148 0.5887505 0 -2.4857e-4 0.5887505 -0.8083147 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.71381e-4 0.8303057 0.5573082 0 -2.55333e-4 0.5573082 -0.8303056 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.61574e-4 0.8508453 0.5254163 0 -2.61649e-4 0.5254164 -0.8508452 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.51674e-4 0.8699023 0.4932241 0 -2.67509e-4 0.4932241 -0.8699022 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.41729e-4 0.8874606 0.4608836 0 -2.72909e-4 0.4608836 -0.8874605 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.31786e-4 0.9035183 0.4285496 0 -2.77847e-4 0.4285496 -0.9035182 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.21893e-4 0.9180874 0.396378 0 -2.82327e-4 0.396378 -0.9180874 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.12097e-4 0.9311937 0.3645246 0 -2.86357e-4 0.3645247 -0.9311937 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.02447e-4 0.942876 0.3331437 0 -2.8995e-4 0.3331437 -0.942876 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 9.29891e-5 0.9531851 0.3023875 0 -2.9312e-4 0.3023875 -0.953185 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 8.37687e-5 0.9621829 0.2724041 0 -2.95887e-4 0.2724041 -0.9621829 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 7.48307e-5 0.9699413 0.243339 0 -2.98273e-4 0.243339 -0.9699413 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 6.62181e-5 0.9765409 0.215332 0 -3.00302e-4 0.215332 -0.9765409 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 5.79721e-5 0.9820699 0.1885171 0 -3.02002e-4 0.1885171 -0.9820698 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 5.01327e-5 0.986622 0.1630247 0 -3.03402e-4 0.1630247 -0.9866219 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 4.27381e-5 0.9902954 0.1389783 0 -3.04532e-4 0.1389783 -0.9902954 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.58245e-5 0.9931911 0.1164962 0 -3.05422e-4 0.1164962 -0.9931911 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.94265e-5 0.9954111 0.09569103 0 -3.06105e-4 0.09569103 -0.995411 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.35776e-5 0.9970564 0.07667098 0 -3.06611e-4 0.07667098 -0.9970564 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.83092e-5 0.998226 0.05953897 0 -3.06971e-4 0.05953897 -0.9982259 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.36518e-5 0.9990141 0.0443938 0 -3.07213e-4 0.0443938 -0.9990141 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 9.63502e-6 0.999509 0.03133173 0 -3.07365e-4 0.03133173 -0.999509 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 6.28701e-6 0.999791 0.02044447 0 -3.07452e-4 0.02044448 -0.999791 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.63583e-6 0.9999301 0.01182322 0 -3.07495e-4 0.01182322 -0.9999301 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.70875e-6 0.9999846 0.00555663 0 -3.07512e-4 0.00555663 -0.9999845 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 5.32749e-7 0.9999985 0.001732424 0 -3.07516e-4 0.001732424 -0.9999985 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.34854e-7 0.9999999 4.38527e-4 0 -3.07516e-4 4.38527e-4 -0.9999999 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.34854e-7 1 -2.08699e-4 0 -3.07516e-4 -2.08699e-4 -0.9999999 0 -0.9999999 1.99033e-7 3.07516e-4 0 0 0 0 1 1.34854e-7 0.9999977 -0.002121288 0 -3.07516e-4 -0.002121288 -0.9999977 0 -0.9999999 7.87184e-7 3.07515e-4 0 0 0 0 1 1.34854e-7 0.9999862 -0.005255586 0 -3.07516e-4 -0.005255586 -0.9999862 0 -0.9999999 1.75103e-6 3.07511e-4 0 0 0 0 1 1.34854e-7 0.9999542 -0.009567883 0 -3.07516e-4 -0.009567883 -0.9999542 0 -0.9999999 3.07713e-6 3.07501e-4 0 0 0 0 1 1.34854e-7 0.9998873 -0.01501434 0 -3.07516e-4 -0.01501434 -0.9998872 0 -0.9999999 4.75199e-6 3.0748e-4 0 0 0 0 1 1.34854e-7 0.9997678 -0.02155096 0 -3.07516e-4 -0.02155095 -0.9997677 0 -0.9999999 6.76209e-6 3.07442e-4 0 0 0 0 1 1.34854e-7 0.9995756 -0.02913341 0 -3.07516e-4 -0.02913341 -0.9995755 0 -0.9999999 9.09379e-6 3.07382e-4 0 0 0 0 1 1.34854e-7 0.9992884 -0.03771707 0 -3.07516e-4 -0.03771706 -0.9992884 0 -0.9999999 1.17334e-5 3.07292e-4 0 0 0 0 1 1.34854e-7 0.9988828 -0.04725681 0 -3.07516e-4 -0.04725681 -0.9988827 0 -0.9999999 1.46669e-5 3.07166e-4 0 0 0 0 1 1.34854e-7 0.9983336 -0.05770704 0 -3.07516e-4 -0.05770704 -0.9983335 0 -0.9999999 1.78805e-5 3.06996e-4 0 0 0 0 1 1.34854e-7 0.9976152 -0.06902157 0 -3.07516e-4 -0.06902156 -0.9976151 0 -0.9999999 2.13598e-5 3.06774e-4 0 0 0 0 1 1.34854e-7 0.9967016 -0.08115354 0 -3.07516e-4 -0.08115354 -0.9967015 0 -0.9999999 2.50904e-5 3.06491e-4 0 0 0 0 1 1.34854e-7 0.995567 -0.09405546 0 -3.07516e-4 -0.09405545 -0.9955669 0 -0.9999999 2.90578e-5 3.0614e-4 0 0 0 0 1 1.34854e-7 0.9941857 -0.1076791 0 -3.07516e-4 -0.1076791 -0.9941857 0 -0.9999999 3.32471e-5 3.05714e-4 0 0 0 0 1 1.34854e-7 0.9925331 -0.1219754 0 -3.07516e-4 -0.1219754 -0.9925331 0 -0.9999999 3.76433e-5 3.05204e-4 0 0 0 0 1 1.34854e-7 0.9905856 -0.1368949 0 -3.07516e-4 -0.1368949 -0.9905855 0 -0.9999999 4.2231e-5 3.04603e-4 0 0 0 0 1 1.34854e-7 0.9883209 -0.1523872 0 -3.07516e-4 -0.1523872 -0.9883208 0 -0.9999999 4.69948e-5 3.03904e-4 0 0 0 0 1 1.34854e-7 0.9857185 -0.1684012 0 -3.07516e-4 -0.1684012 -0.9857185 0 -0.9999999 5.1919e-5 3.03102e-4 0 0 0 0 1 1.34854e-7 0.9827601 -0.1848855 0 -3.07516e-4 -0.1848855 -0.98276 0 -0.9999999 5.69878e-5 3.0219e-4 0 0 0 0 1 1.34854e-7 0.9794292 -0.2017881 0 -3.07516e-4 -0.2017881 -0.9794292 0 -0.9999999 6.21852e-5 3.01163e-4 0 0 0 0 1 1.34854e-7 0.9757122 -0.2190565 0 -3.07516e-4 -0.2190565 -0.9757121 0 -0.9999999 6.7495e-5 3.00018e-4 0 0 0 0 1 1.34854e-7 0.9715979 -0.2366382 0 -3.07516e-4 -0.2366382 -0.9715978 0 -0.9999999 7.29011e-5 2.9875e-4 0 0 0 0 1 1.34854e-7 0.967078 -0.2544802 0 -3.07516e-4 -0.2544802 -0.9670779 0 -0.9999999 7.83872e-5 2.97358e-4 0 0 0 0 1 1.34854e-7 0.9621473 -0.27253 0 -3.07516e-4 -0.27253 -0.9621472 0 -0.9999999 8.39372e-5 2.95839e-4 0 0 0 0 1 1.34854e-7 0.9568037 -0.2907349 0 -3.07516e-4 -0.2907349 -0.9568036 0 -0.9999999 8.95347e-5 2.94193e-4 0 0 0 0 1 1.34854e-7 0.9510482 -0.3090426 0 -3.07516e-4 -0.3090426 -0.9510481 0 -0.9999999 9.51639e-5 2.92421e-4 0 0 0 0 1 1.34854e-7 0.9448854 -0.3274013 0 -3.07516e-4 -0.3274013 -0.9448853 0 -0.9999999 1.00809e-4 2.90523e-4 0 0 0 0 1 1.34854e-7 0.9383229 -0.3457602 0 -3.07516e-4 -0.3457602 -0.9383229 0 -0.9999999 1.06453e-4 2.88503e-4 0 0 0 0 1 1.34854e-7 0.931372 -0.3640688 0 -3.07516e-4 -0.3640688 -0.931372 0 -0.9999999 1.12083e-4 2.86363e-4 0 0 0 0 1 1.34854e-7 0.9240472 -0.3822783 0 -3.07516e-4 -0.3822782 -0.9240472 0 -0.9999999 1.17681e-4 2.84108e-4 0 0 0 0 1 1.34854e-7 0.9163665 -0.4003403 0 -3.07516e-4 -0.4003403 -0.9163665 0 -0.9999999 1.23235e-4 2.81744e-4 0 0 0 0 1 1.34854e-7 0.908351 -0.4182087 0 -3.07516e-4 -0.4182087 -0.9083509 0 -0.9999999 1.28728e-4 2.79276e-4 0 0 0 0 1 1.34854e-7 0.9000251 -0.435838 0 -3.07516e-4 -0.435838 -0.9000251 0 -0.9999999 1.34149e-4 2.76714e-4 0 0 0 0 1 1.34854e-7 0.8914165 -0.4531849 0 -3.07516e-4 -0.4531849 -0.8914165 0 -0.9999999 1.39482e-4 2.74064e-4 0 0 0 0 1 1.34854e-7 0.8825557 -0.4702079 0 -3.07516e-4 -0.4702079 -0.8825557 0 -0.9999999 1.44716e-4 2.71337e-4 0 0 0 0 1 1.34854e-7 0.873476 -0.4868672 0 -3.07516e-4 -0.4868672 -0.873476 0 -0.9999999 1.49837e-4 2.68542e-4 0 0 0 0 1 1.34854e-7 0.8642137 -0.5031249 0 -3.07516e-4 -0.5031249 -0.8642136 0 -0.9999999 1.54836e-4 2.65692e-4 0 0 0 0 1 1.34854e-7 0.8548073 -0.5189455 0 -3.07516e-4 -0.5189455 -0.8548073 0 -0.9999999 1.59699e-4 2.62797e-4 0 0 0 0 1 1.34854e-7 0.845298 -0.5342951 0 -3.07516e-4 -0.5342951 -0.8452979 0 -0.9999999 1.64418e-4 2.59871e-4 0 0 0 0 1 1.34854e-7 0.8357287 -0.5491425 0 -3.07516e-4 -0.5491425 -0.8357287 0 -0.9999999 1.68983e-4 2.56926e-4 0 0 0 0 1 1.34854e-7 0.8261446 -0.5634582 0 -3.07516e-4 -0.5634581 -0.8261445 0 -0.9999999 1.73384e-4 2.53977e-4 0 0 0 0 1 1.34854e-7 0.8165925 -0.5772147 0 -3.07516e-4 -0.5772147 -0.8165924 0 -0.9999999 1.77613e-4 2.51038e-4 0 0 0 0 1 1.34854e-7 0.8071204 -0.5903868 0 -3.07516e-4 -0.5903868 -0.8071204 0 -0.9999999 1.81662e-4 2.48123e-4 0 0 0 0 1 1.34854e-7 0.7977782 -0.602951 0 -3.07516e-4 -0.602951 -0.7977782 0 -0.9999999 1.85525e-4 2.45248e-4 0 0 0 0 1 1.34854e-7 0.7886162 -0.6148858 0 -3.07516e-4 -0.6148857 -0.7886161 0 -0.9999999 1.89194e-4 2.42429e-4 0 0 0 0 1 1.34854e-7 0.7796856 -0.6261713 0 -3.07516e-4 -0.6261712 -0.7796855 0 -0.9999999 1.92663e-4 2.39682e-4 0 0 0 0 1 1.34854e-7 0.7710382 -0.6367889 0 -3.07516e-4 -0.6367889 -0.7710382 0 -0.9999999 1.95927e-4 2.37021e-4 0 0 0 0 1 1.34854e-7 0.7627261 -0.6467217 0 -3.07516e-4 -0.6467216 -0.7627261 0 -0.9999999 1.9898e-4 2.34463e-4 0 0 0 0 1 1.34854e-7 0.7548016 -0.6559531 0 -3.07516e-4 -0.6559531 -0.7548016 0 -0.9999999 2.01818e-4 2.32025e-4 0 0 0 0 1 1.34854e-7 0.7473165 -0.6644683 0 -3.07516e-4 -0.6644682 -0.7473164 0 -0.9999999 2.04436e-4 2.29722e-4 0 0 0 0 1 1.34854e-7 0.7403222 -0.6722522 0 -3.07516e-4 -0.6722522 -0.7403222 0 -0.9999999 2.06828e-4 2.2757e-4 0 0 0 0 1 1.34854e-7 0.7338696 -0.6792904 0 -3.07516e-4 -0.6792904 -0.7338696 0 -0.9999999 2.08992e-4 2.25585e-4 0 0 0 0 1 1.34854e-7 0.7280086 -0.6855679 0 -3.07516e-4 -0.6855679 -0.7280086 0 -0.9999999 2.10921e-4 2.23782e-4 0 0 0 0 1 1.34854e-7 0.7227878 -0.6910701 0 -3.07516e-4 -0.69107 -0.7227877 0 -0.9999999 2.12613e-4 2.22176e-4 0 0 0 0 1 1.34854e-7 0.7182543 -0.6957807 0 -3.07516e-4 -0.6957806 -0.7182543 0 -0.9999999 2.14061e-4 2.20781e-4 0 0 0 0 1 1.34854e-7 0.7144539 -0.6996825 0 -3.07516e-4 -0.6996825 -0.7144539 0 -0.9999999 2.1526e-4 2.19612e-4 0 0 0 0 1 1.34854e-7 0.7114298 -0.7027572 0 -3.07516e-4 -0.7027572 -0.7114297 0 -0.9999999 2.16205e-4 2.18681e-4 0 0 0 0 1 1.34854e-7 0.7092237 -0.7049835 0 -3.07516e-4 -0.7049834 -0.7092237 0 -0.9999999 2.16889e-4 2.18003e-4 0 0 0 0 1 1.34854e-7 0.7078741 -0.7063386 0 -3.07516e-4 -0.7063386 -0.7078741 0 -0.9999999 2.17306e-4 2.17588e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + + + + 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 + + + + 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 + + + + 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 + + + + + + + +
\ No newline at end of file diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.fbx b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.fbx new file mode 100644 index 0000000000000000000000000000000000000000..71d5e581ccdad30c827af640183177d3f7cc7472 GIT binary patch literal 84236 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 j{jt|IpgH043#?b-Fu)gQ;LHdOn6=818Y literal 0 HcmV?d00001 diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf new file mode 100644 index 000000000..7927093bb --- /dev/null +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf @@ -0,0 +1,229 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v1.6.16", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0, + 1, + 2 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Rotating cube" + }, + { + "mesh" : 0, + "name" : "Scaling cube", + "translation" : [ + 0, + 0, + -3 + ] + }, + { + "mesh" : 0, + "name" : "Translating cube", + "translation" : [ + 0, + 0, + 3 + ] + } + ], + "animations" : [ + { + "channels" : [ + { + "sampler" : 0, + "target" : { + "node" : 0, + "path" : "rotation" + } + } + ], + "name" : "Rotation animation", + "samplers" : [ + { + "input" : 4, + "interpolation" : "LINEAR", + "output" : 5 + } + ] + }, + { + "channels" : [ + { + "sampler" : 0, + "target" : { + "node" : 1, + "path" : "scale" + } + } + ], + "name" : "Scaling animation", + "samplers" : [ + { + "input" : 4, + "interpolation" : "LINEAR", + "output" : 6 + } + ] + }, + { + "channels" : [ + { + "sampler" : 0, + "target" : { + "node" : 2, + "path" : "translation" + } + } + ], + "name" : "Translation animation", + "samplers" : [ + { + "input" : 4, + "interpolation" : "LINEAR", + "output" : 7 + } + ] + } + ], + "meshes" : [ + { + "name" : "Cube", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3 + } + ] + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 24, + "max" : [ + 1, + 1, + 1 + ], + "min" : [ + -1, + -1, + -1 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 36, + "type" : "SCALAR" + }, + { + "bufferView" : 4, + "componentType" : 5126, + "count" : 181, + "max" : [ + 7.5 + ], + "min" : [ + 0 + ], + "type" : "SCALAR" + }, + { + "bufferView" : 5, + "componentType" : 5126, + "count" : 181, + "type" : "VEC4" + }, + { + "bufferView" : 6, + "componentType" : 5126, + "count" : 181, + "type" : "VEC3" + }, + { + "bufferView" : 7, + "componentType" : 5126, + "count" : 181, + "type" : "VEC3" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 288 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 576 + }, + { + "buffer" : 0, + "byteLength" : 72, + "byteOffset" : 768 + }, + { + "buffer" : 0, + "byteLength" : 724, + "byteOffset" : 840 + }, + { + "buffer" : 0, + "byteLength" : 2896, + "byteOffset" : 1564 + }, + { + "buffer" : 0, + "byteLength" : 2172, + "byteOffset" : 4460 + }, + { + "buffer" : 0, + "byteLength" : 2172, + "byteOffset" : 6632 + } + ], + "buffers" : [ + { + "byteLength" : 8804, + "uri" : "data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAAAAAAAKuqKj2rqqo9AAAAPquqKj5VVVU+AACAPlVVlT6rqqo+AADAPlVV1T6rquo+AAAAP6uqCj9VVRU/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" + } + ] +} From 29e71ea1ce9b201b3f5e8978e653f6f76d8724d8 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 02:58:40 +0200 Subject: [PATCH 12/29] AssimpImporter: oops --- src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index e9a47be86..88af73e80 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -597,7 +597,7 @@ void AssimpImporterTest::animationGltfTicksPerSecondPatching() { fixes and didn't bump the minor version. Boldly assuming the next minor version will have fixes from 2019. */ const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); - const bool hasInvalidTicksPerSecond = version > 500; + const bool hasInvalidTicksPerSecond = version <= 500; if(!hasInvalidTicksPerSecond) CORRADE_SKIP("Current version of assimp correctly sets glTF ticks per second."); @@ -724,7 +724,7 @@ void AssimpImporterTest::animationDummyTracksRemovalOutput() { if(!supportsAnimation(".gltf")) CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); - /* The actual removal is already implicitly tested in animation(), + /* The actual removal is already implicitly tested in animationGltf(), just check for the message here */ Containers::Pointer importer = _manager.instantiate("AssimpImporter"); From e9f8508451401e3d9f8b27ee8bec05ef73e12d5b Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Thu, 24 Jun 2021 03:13:05 +0200 Subject: [PATCH 13/29] AssimpImporter: update list of test files for corrade_add_test --- .../AssimpImporter/Test/CMakeLists.txt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt index 6a1144e16..ee5f540ed 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt @@ -55,10 +55,22 @@ corrade_add_test(AssimpImporterTest AssimpImporterTest.cpp LIBRARIES Magnum::Trade FILES empty.dae - empty.gltf + animation.gltf # animation*.* same as TinyGltfTest, but added a scene + animation.glb + animation.bin + animation-embedded.gltf + animation-embedded.glb + animation-no-scene.gltf + animation-patching.bin + animation-patching.gltf camera.dae diffuse_texture.png embedded-texture.blend + exported-animation.dae # Converted from exported-animation.blend + exported-animation.fbx + exported-animation.gltf + exported-animation-curves.dae + exported-animation-curves-handles.dae image-filename-trailing-space.mtl image-filename-trailing-space.obj image-mips.mtl From fd58c6b8fb4cbbab38fad78dc171dd49a186d3af Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 00:22:35 +0200 Subject: [PATCH 14/29] AssimpImporter: lowercase checkAssimpVersion.cpp --- .../{CheckAssimpVersion.cpp => checkAssimpVersion.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/MagnumPlugins/AssimpImporter/{CheckAssimpVersion.cpp => checkAssimpVersion.cpp} (100%) diff --git a/src/MagnumPlugins/AssimpImporter/CheckAssimpVersion.cpp b/src/MagnumPlugins/AssimpImporter/checkAssimpVersion.cpp similarity index 100% rename from src/MagnumPlugins/AssimpImporter/CheckAssimpVersion.cpp rename to src/MagnumPlugins/AssimpImporter/checkAssimpVersion.cpp From 95c03856953ef129730878f360bfb321cf798b54 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 03:10:13 +0200 Subject: [PATCH 15/29] AssimpImporter: add config value for dummy animation track removal --- .../AssimpImporter/AssimpImporter.conf | 4 ++ .../AssimpImporter/AssimpImporter.cpp | 70 ++++++++++--------- .../AssimpImporter/AssimpImporter.h | 7 +- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf b/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf index 44a546399..6b4d270aa 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.conf @@ -45,6 +45,10 @@ normalizeQuaternions=true # information. mergeAnimationClips=false +# Remove dummy animation tracks inserted by Assimp that contain only a single +# key/value pair with the default node transformation +removeDummyAnimationTracks=true + # AI_CONFIG_* values, can be changed only before the first file is opened ImportColladaIgnoreUpDirection=false diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index 71fca223e..6f26d77dc 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -40,7 +40,6 @@ #include #include #include -#include #include #include #include @@ -141,6 +140,7 @@ void fillDefaultConfiguration(Utility::ConfigurationGroup& conf) { conf.setValue("optimizeQuaternionShortestPath", true); conf.setValue("normalizeQuaternions", true); conf.setValue("mergeAnimationClips", false); + conf.setValue("removeDummyAnimationTracks", true); conf.setValue("ImportColladaIgnoreUpDirection", false); @@ -1205,16 +1205,18 @@ Animation::Extrapolation extrapolationFor(aiAnimBehaviour behaviour) { } Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) { + const bool verbose{flags() & ImporterFlag::Verbose}; + const bool removeDummyAnimationTracks = configuration().value("removeDummyAnimationTracks"); + const bool mergeAnimationClips = configuration().value("mergeAnimationClips"); + /* Import either a single animation or all of them together. At the moment, Blender doesn't really support cinematic animations (affecting multiple objects): https://blender.stackexchange.com/q/5689. And since https://github.com/KhronosGroup/glTF-Blender-Exporter/pull/166, these are exported as a set of object-specific clips, which may not be wanted, so we give the users an option to merge them all together. */ - const std::size_t animationBegin = - configuration().value("mergeAnimationClips") ? 0 : id; - const std::size_t animationEnd = - configuration().value("mergeAnimationClips") ? _f->scene->mNumAnimations : id + 1; + const std::size_t animationBegin = mergeAnimationClips ? 0 : id; + const std::size_t animationEnd = mergeAnimationClips ? _f->scene->mNumAnimations : id + 1; /* Calculate total channel count */ std::size_t channelCount = 0; @@ -1246,7 +1248,9 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) /* Assimp adds useless 1-key tracks with default node translation/rotation/scale if the channel doesn't target all 3 of them. Ignore those. */ - if(translationKeyCount == 1 || rotationKeyCount == 1 || scalingKeyCount == 1) { + if(removeDummyAnimationTracks && + (translationKeyCount == 1 || rotationKeyCount == 1 || scalingKeyCount == 1)) + { const aiNode* node = _f->scene->mRootNode->FindNode(channel->mNodeName); CORRADE_ASSERT(node, "Trade::AssimpImporter::animation(): Target node must exist", {}); @@ -1257,43 +1261,44 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) if the comparison fails, this whole fix is a best-effort attempt */ node->mTransformation.Decompose(nodeScaling, nodeRotation, nodeTranslation); - const bool verbose{flags() & ImporterFlag::Verbose}; - if(translationKeyCount == 1 && channel->mPositionKeys[0].mTime == 0.0) { const Vector3 value = Vector3::from(&channel->mPositionKeys[0].mValue[0]); const Vector3 nodeValue = Vector3::from(&nodeTranslation[0]); - if(Math::TypeTraits::equals(value, nodeValue)) { + if(value == nodeValue) { + if(verbose) { + Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy translation " + "track in animation" << a << Debug::nospace << ", channel" << c; + } translationKeyCount = 0; } - if(verbose) - Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy translation " - "track in channel" << currentChannel; } if(rotationKeyCount == 1 && channel->mRotationKeys[0].mTime == 0.0) { const aiQuaternion& valueQuat = channel->mRotationKeys[0].mValue; const Quaternion value{{valueQuat.x, valueQuat.y, valueQuat.z}, valueQuat.w}; const aiQuaternion& nodeQuat = nodeRotation; const Quaternion nodeValue{{nodeQuat.x, nodeQuat.y, nodeQuat.z}, nodeQuat.w}; - if(Math::TypeTraits::equals(value, nodeValue)) { + if(value == nodeValue) { + if(verbose) { + Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy rotation " + "track in animation" << a << Debug::nospace << ", channel" << c; + } rotationKeyCount = 0; } - if(verbose) - Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy rotation " - "track in channel" << currentChannel; } if(scalingKeyCount == 1 && channel->mScalingKeys[0].mTime == 0.0) { const Vector3 value = Vector3::from(&channel->mScalingKeys[0].mValue[0]); const Vector3 nodeValue = Vector3::from(&nodeScaling[0]); - if(Math::TypeTraits::equals(value, nodeValue)) { + if(value == nodeValue) { + if(verbose) { + Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy scaling " + "track in animation" << a << Debug::nospace << ", channel" << c; + } scalingKeyCount = 0; } - if(verbose) - Debug{} << "Trade::AssimpImporter::animation(): ignoring dummy scaling " - "track in channel" << currentChannel; } } - channelTrackPresence[currentChannel] = { + channelTrackPresence[currentChannel++] = { translationKeyCount > 0, rotationKeyCount > 0, scalingKeyCount > 0 }; @@ -1305,14 +1310,15 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) trackCount += (translationKeyCount > 0 ? 1 : 0) + (rotationKeyCount > 0 ? 1 : 0) + (scalingKeyCount > 0 ? 1 : 0); - - currentChannel++; } } /* Populate the data array */ Containers::Array data{dataSize}; + const bool optimizeQuaternionShortestPath = configuration().value("optimizeQuaternionShortestPath"); + const bool normalizeQuaternions = configuration().value("normalizeQuaternions"); + /* Import all tracks */ bool hadToRenormalize = false; std::size_t dataOffset = 0; @@ -1341,17 +1347,18 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) /* For glTF files mTicksPerSecond is completely useless before https://github.com/assimp/assimp/commit/09d80ff478d825a80bce6fb787e8b19df9f321a8 but can be assumed to always be 1000. */ - /** @todo Check if this is broken in other importers, too */ constexpr Double GltfTicksPerSecond = 1000.0; if(_f->importerIsGltf && !Math::equal(ticksPerSecond, GltfTicksPerSecond)) { - Warning{} << "Trade::AssimpImporter::animation():" << ticksPerSecond << + if(verbose) { + Debug{} << "Trade::AssimpImporter::animation():" << ticksPerSecond << "ticks per second is incorrect for glTF, patching to" << GltfTicksPerSecond; - ticksPerSecond = GltfTicksPerSecond; + } + ticksPerSecond = GltfTicksPerSecond; } bool hasTranslation, hasRotation, hasScaling; std::tie(hasTranslation, hasRotation, hasScaling) = - channelTrackPresence[currentChannel]; + channelTrackPresence[currentChannel++]; /* Translation */ if(hasTranslation) { @@ -1396,7 +1403,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } /* Ensure shortest path is always chosen. */ - if(configuration().value("optimizeQuaternionShortestPath")) { + if(optimizeQuaternionShortestPath) { Float flip = 1.0f; for(std::size_t i = 0; i != values.size() - 1; ++i) { if(Math::dot(values[i], values[i + 1]*flip) < 0) flip = -flip; @@ -1407,7 +1414,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) /* Normalize the quaternions if not already. Don't attempt to normalize every time to avoid tiny differences, only when the quaternion looks to be off. */ - if(configuration().value("normalizeQuaternions")) { + if(normalizeQuaternions) { for(auto& i: values) if(!i.isNormalized()) { i = i.normalized(); hadToRenormalize = true; @@ -1448,8 +1455,6 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) AnimationTrackType::Vector3, AnimationTrackTargetType::Scaling3D, target, track}; } - - currentChannel++; } } @@ -1457,8 +1462,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) Warning{} << "Trade::AssimpImporter::animation(): quaternions in some rotation tracks were renormalized"; return AnimationData{std::move(data), std::move(tracks), - configuration().value("mergeAnimationClips") ? nullptr : - &_f->scene->mAnimations[id]}; + mergeAnimationClips ? nullptr : &_f->scene->mAnimations[id]}; } const void* AssimpImporter::doImporterState() const { diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h index d939ba8d7..59f1e090c 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h @@ -206,6 +206,11 @@ verbosity levels in each instance. @subsection Trade-AssimpImporter-behavior-animation Animation import +- Assimp adds dummy animation tracks with a single key-value pair + and the default node transformation. If found, the importer removes these dummy + tracks and prints a message if verbose logging is enabled. Can be disabled + per-animation with the @cb{.ini} removeDummyAnimationTracks @ce option, see + @ref Trade-AssimpImporter-configuration "below". - Quaternion rotation tracks are postprocessed in order to make it possible to use the faster @ref Math::lerp(const Quaternion&, const Quaternion&, T) "Math::lerp()" / @@ -237,7 +242,7 @@ verbosity levels in each instance. - Assimp versions before commit [e3083c21f0a7beae6c37a2265b7919a02cbf83c4](https://github.com/assimp/assimp/commit/e3083c21f0a7beae6c37a2265b7919a02cbf83c4) read spline-interpolated glTF animation tracks incorrectly and produce broken animations. A warning is printed when importing glTF animations on these versions. - Because it's impossible to detect the actual brokenness, the warning is + Because it's impossible to detect the actual brokenness, the warning is printed even if the imported data may be correct. @subsection Trade-AssimpImporter-behavior-materials Material import From 4784218da82ba0ea0a94ee87677ac8bf9c851f1a Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 03:11:32 +0200 Subject: [PATCH 16/29] AssimpImporter: mention (missing) test coverage for aiAnimBehaviour --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index 6f26d77dc..ed3b9c3f4 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -478,7 +478,7 @@ void AssimpImporter::doOpenData(const Containers::ArrayView data) { Assimp incorrectly read spline tangents as values in glTF animation tracks. Quick and dirty check to see if we're dealing with a possibly affected file and Assimp version. This might produce false-positives on files without - spline-interpolated animations, but for doOpenState and doOpenFile we + spline-interpolated animations, but for doOpenState and doOpenFile we have no access to the file content to check if the file contains "CUBICSPLINE". */ if(_f->scene->HasAnimations() && _f->importerIsGltf && ASSIMP_HAS_BROKEN_GLTF_SPLINES) { Warning{} << "Trade::AssimpImporter::openData(): spline-interpolated animations imported " @@ -1187,6 +1187,11 @@ std::string AssimpImporter::doAnimationName(UnsignedInt id) { namespace { Animation::Extrapolation extrapolationFor(aiAnimBehaviour behaviour) { + /* This code is not covered by tests since there is currently + no code in Assimp that sets this except for the .irr importer. + So it'll be aiAnimBehaviour_DEFAULT for 99.99% of users, + and there are tests that check that this becomes + Extrapolation::Constant. */ switch(behaviour) { case aiAnimBehaviour_DEFAULT: /** @todo emulate this correctly by inserting keyframes From fecf7c18608e7163017ba14fc6c030cd601e1213 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 03:12:11 +0200 Subject: [PATCH 17/29] AssimpImporter: make missing animation target node an internal assert --- src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index ed3b9c3f4..f81005ba0 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -1257,7 +1257,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) (translationKeyCount == 1 || rotationKeyCount == 1 || scalingKeyCount == 1)) { const aiNode* node = _f->scene->mRootNode->FindNode(channel->mNodeName); - CORRADE_ASSERT(node, "Trade::AssimpImporter::animation(): Target node must exist", {}); + CORRADE_INTERNAL_ASSERT(node); aiVector3D nodeTranslation; aiQuaternion nodeRotation; @@ -1334,8 +1334,8 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) const aiAnimation* animation = _f->scene->mAnimations[a]; for(std::size_t c = 0; c != animation->mNumChannels; ++c) { const aiNodeAnim* channel = animation->mChannels[c]; - const UnsignedInt target = doObject3DForName(channel->mNodeName.C_Str()); - CORRADE_ASSERT(target != -1, "Trade::AssimpImporter::animation(): target node must exist", {}); + const Int target = doObject3DForName(channel->mNodeName.C_Str()); + CORRADE_INTERNAL_ASSERT(target != -1); /* Assimp only supports linear interpolation. For glTF splines it simply uses the spline control points. */ @@ -1388,7 +1388,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) tracks[trackId++] = AnimationTrackData{AnimationTrackType::Vector3, AnimationTrackType::Vector3, AnimationTrackTargetType::Translation3D, - target, track}; + static_cast(target), track }; } /* Rotation */ @@ -1433,7 +1433,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) tracks[trackId++] = AnimationTrackData{AnimationTrackType::Quaternion, AnimationTrackType::Quaternion, AnimationTrackTargetType::Rotation3D, - target, track}; + static_cast(target), track}; } /* Scale */ @@ -1458,7 +1458,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) extrapolationAfter}; tracks[trackId++] = AnimationTrackData{AnimationTrackType::Vector3, AnimationTrackType::Vector3, AnimationTrackTargetType::Scaling3D, - target, track}; + static_cast(target), track}; } } } From b2cedc36ae1cc67da3109e19299011899b9c8127 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 03:14:36 +0200 Subject: [PATCH 18/29] AssimpImporter: uses stridedArrayView directly --- .../Test/AssimpImporterTest.cpp | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 88af73e80..e4330fed6 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -527,8 +527,8 @@ void AssimpImporterTest::animationGltf() { Quaternion::rotation(0.0_degf, Vector3::xAxis()), Quaternion::rotation(180.0_degf, Vector3::xAxis()) }; - CORRADE_COMPARE_AS(rotation.keys(), (Containers::StridedArrayView1D{rotationKeys}), TestSuite::Compare::Container); - CORRADE_COMPARE_AS(rotation.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(rotation.keys(), Containers::stridedArrayView(rotationKeys), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(rotation.values(), Containers::stridedArrayView(rotationValues), TestSuite::Compare::Container); CORRADE_COMPARE(rotation.at(1.875f), Quaternion::rotation(90.0_degf, Vector3::xAxis())); constexpr Float translationScalingKeys[]{ @@ -553,8 +553,8 @@ void AssimpImporterTest::animationGltf() { Vector3::yAxis(2.5f), Vector3::yAxis(0.0f) }; - CORRADE_COMPARE_AS(translation.keys(), (Containers::StridedArrayView1D{translationScalingKeys}), TestSuite::Compare::Container); - CORRADE_COMPARE_AS(translation.values(), (Containers::StridedArrayView1D{translationData}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(translation.keys(), Containers::stridedArrayView(translationScalingKeys), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(translation.values(), Containers::stridedArrayView(translationData), TestSuite::Compare::Container); CORRADE_COMPARE(translation.at(1.5f), Vector3::yAxis(2.5f)); /* Scaling, linearly interpolated, sharing keys with translation */ @@ -572,8 +572,8 @@ void AssimpImporterTest::animationGltf() { Vector3::zScale(6.0f), Vector3(1.0f), }; - CORRADE_COMPARE_AS(scaling.keys(), (Containers::StridedArrayView1D{translationScalingKeys}), TestSuite::Compare::Container); - CORRADE_COMPARE_AS(scaling.values(), (Containers::StridedArrayView1D{scalingData}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scaling.keys(), Containers::stridedArrayView(translationScalingKeys), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scaling.values(), Containers::stridedArrayView(scalingData), TestSuite::Compare::Container); CORRADE_COMPARE(scaling.at(1.5f), Vector3::zScale(5.2f)); } } @@ -665,15 +665,15 @@ void AssimpImporterTest::animationGltfSpline() { CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(rotation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(rotation.after(), Animation::Extrapolation::Constant); - CORRADE_COMPARE_AS(rotation.keys(), (Containers::StridedArrayView1D{keys}), TestSuite::Compare::Container); if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + CORRADE_COMPARE_AS(rotation.keys(), Containers::stridedArrayView(keys), TestSuite::Compare::Container); constexpr Quaternion rotationValues[]{ {{0.780076f, 0.0260025f, 0.598059f}, 0.182018f}, {{-0.711568f, 0.391362f, 0.355784f}, 0.462519f}, {{0.598059f, 0.182018f, 0.0260025f}, 0.780076f}, {{0.711568f, -0.355784f, -0.462519f}, -0.391362f} }; - CORRADE_COMPARE_AS(rotation.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(rotation.values(), Containers::stridedArrayView(rotationValues), TestSuite::Compare::Container); } /* Translation */ @@ -685,15 +685,15 @@ void AssimpImporterTest::animationGltfSpline() { CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(translation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(translation.after(), Animation::Extrapolation::Constant); - CORRADE_COMPARE_AS(translation.keys(), (Containers::StridedArrayView1D{keys}), TestSuite::Compare::Container); if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + CORRADE_COMPARE_AS(translation.keys(), Containers::stridedArrayView(keys), TestSuite::Compare::Container); constexpr Vector3 translationValues[]{ {3.0f, 0.1f, 2.5f}, {-2.0f, 1.1f, -4.3f}, {1.5f, 9.8f, -5.1f}, {5.1f, 0.1f, -7.3f} }; - CORRADE_COMPARE_AS(translation.values(), (Containers::StridedArrayView1D{translationValues}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(translation.values(), Containers::stridedArrayView(translationValues), TestSuite::Compare::Container); } /* Scaling */ @@ -713,7 +713,7 @@ void AssimpImporterTest::animationGltfSpline() { {3.0f, 0.1f, 2.5f}, {1.5f, 9.8f, -5.1f} }; - CORRADE_COMPARE_AS(scaling.values(), (Containers::StridedArrayView1D{scalingData}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(scaling.values(), Containers::stridedArrayView(scalingData), TestSuite::Compare::Container); } } @@ -780,7 +780,7 @@ void AssimpImporterTest::animationShortestPathOptimizationEnabled() { {{0.0f, 0.0f, -1.0f}, 0.0f}, // 7 s: 180° (flipped back) {{0.0f, 0.0f, -0.92388f}, 0.382683f} // 8 s: 225° (flipped) }; - CORRADE_COMPARE_AS(track.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(track.values(), Containers::stridedArrayView(rotationValues), TestSuite::Compare::Container); CORRADE_COMPARE(track.at(Math::slerp, 0.5f).axis(), Vector3::zAxis()); CORRADE_COMPARE(track.at(Math::slerp, 1.5f).axis(), Vector3::zAxis()); @@ -834,7 +834,7 @@ void AssimpImporterTest::animationShortestPathOptimizationDisabled() { {{0.0f, 0.0f, -1.0f}, 0.0f}, // 7 s: 180° {{0.0f, 0.0f, 0.92388f}, -0.382683f} // 8 s: 225° (longer path) }; - CORRADE_COMPARE_AS(track.values(), (Containers::StridedArrayView1D{rotationValues}), TestSuite::Compare::Container); + CORRADE_COMPARE_AS(track.values(), Containers::stridedArrayView(rotationValues), TestSuite::Compare::Container); CORRADE_COMPARE(track.at(Math::slerpShortestPath, 0.5f).axis(), Vector3::zAxis()); CORRADE_COMPARE(track.at(Math::slerpShortestPath, 1.5f).axis(), Vector3::zAxis()); @@ -910,11 +910,8 @@ void AssimpImporterTest::animationQuaternionNormalizationEnabled() { ignore the value sampler size and always uses the key sampler size (instead of using the minimum of the two). Wouldn't be surprised if this produces an out-of-bounds access somewhere, too. */ - /** @todo make the importer print a warning? this would be another - blanket warning like the spline animations */ CORRADE_COMPARE_AS(track.values().prefix(Containers::arraySize(rotationValues)), - (Containers::StridedArrayView1D{rotationValues}), - TestSuite::Compare::Container); + Containers::stridedArrayView(rotationValues), TestSuite::Compare::Container); } void AssimpImporterTest::animationQuaternionNormalizationDisabled() { @@ -941,8 +938,7 @@ void AssimpImporterTest::animationQuaternionNormalizationDisabled() { Quaternion{{0.0f, 0.0f, 0.382683f}, 0.92388f}*2, // is not }; CORRADE_COMPARE_AS(track.values().prefix(Containers::arraySize(rotationValues)), - (Containers::StridedArrayView1D{rotationValues}), - TestSuite::Compare::Container); + Containers::stridedArrayView(rotationValues), TestSuite::Compare::Container); } void AssimpImporterTest::animationMergeEmpty() { From 5cee73d9acc749d83e763fd84f3698a505404201 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 03:20:39 +0200 Subject: [PATCH 19/29] AssimpImporter: don't test all possible glTF file types --- .../Test/AssimpImporterTest.cpp | 30 ++++-------------- .../AssimpImporter/Test/CMakeLists.txt | 5 +-- .../Test/animation-embedded.glb | Bin 2940 -> 0 bytes .../Test/animation-embedded.gltf | 1 - .../AssimpImporter/Test/animation.glb | Bin 2940 -> 0 bytes 5 files changed, 8 insertions(+), 28 deletions(-) delete mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-embedded.glb delete mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation-embedded.gltf delete mode 100644 src/MagnumPlugins/AssimpImporter/Test/animation.glb diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index e4330fed6..6c86647ad 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -162,16 +162,6 @@ constexpr struct { {"glTF", ".gltf"} }; -constexpr struct { - const char* name; - const char* suffix; -} GltfAnimationFileData[]{ - {"ascii external", ".gltf"}, - {"ascii embedded", "-embedded.gltf"}, - {"binary external", ".glb"}, - {"binary embedded", "-embedded.glb"} -}; - constexpr struct { const char* name; const char* file; @@ -195,11 +185,9 @@ AssimpImporterTest::AssimpImporterTest() { addInstancedTests({&AssimpImporterTest::animation}, Containers::arraySize(ExportedAnimationFileData)); - addInstancedTests({&AssimpImporterTest::animationGltf}, - Containers::arraySize(GltfAnimationFileData)); - - addTests({&AssimpImporterTest::animationGltfNoScene, &AssimpImporterTest::animationGltfTicksPerSecondPatching, + addTests({&AssimpImporterTest::animationGltf, + &AssimpImporterTest::animationGltfNoScene, &AssimpImporterTest::animationGltfBrokenSplineWarning, &AssimpImporterTest::animationGltfSpline}); @@ -360,12 +348,11 @@ bool supportsAnimation(const std::string& fileName) { /* splitExtension returns empty extensions for files starting with a dot */ const std::string extension = Utility::Directory::splitExtension("x" + fileName).second; - const bool isGltf = extension == ".gltf" || extension == ".glb"; - if(isGltf) { - return false; - } else { + const bool isGltf = extension == ".gltf"; + if(isGltf) return false; + else { const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); - CORRADE_ASSERT(extension == ".dae" || extension == ".fbx", "Unsupported file type", false); + CORRADE_INTERNAL_ASSERT(extension == ".dae" || extension == ".fbx"); /* That's as far back as I checked, both Collada and FBX animations supported */ return version > 302; } @@ -468,9 +455,6 @@ void AssimpImporterTest::animation() { } void AssimpImporterTest::animationGltf() { - auto&& data = GltfAnimationFileData[testCaseInstanceId()]; - setTestCaseDescription(data.name); - if(!supportsAnimation(".gltf")) CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); @@ -479,7 +463,7 @@ void AssimpImporterTest::animationGltf() { Containers::Pointer importer = _manager.instantiate("AssimpImporter"); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, - "animation" + std::string{data.suffix}))); + "animation.gltf"))); CORRADE_COMPARE(importer->animationCount(), 3); diff --git a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt index ee5f540ed..0436eb8ec 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt @@ -55,11 +55,8 @@ corrade_add_test(AssimpImporterTest AssimpImporterTest.cpp LIBRARIES Magnum::Trade FILES empty.dae - animation.gltf # animation*.* same as TinyGltfTest, but added a scene - animation.glb + animation.gltf # Same as in TinyGltfTest, but added a scene animation.bin - animation-embedded.gltf - animation-embedded.glb animation-no-scene.gltf animation-patching.bin animation-patching.gltf diff --git a/src/MagnumPlugins/AssimpImporter/Test/animation-embedded.glb b/src/MagnumPlugins/AssimpImporter/Test/animation-embedded.glb deleted file mode 100644 index 1652e499d921b58e368b3bced679c8ffcccf2268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2940 zcmc&$!B5jr7;p4K;>9b*!}1O$nqp|X4QO;LENCDL5Vmn4CY0I1lC5jjPDADrj*{>P zxSdE$JmAH|=mmpt<1pfhg9p5LGSUCR-}lyT-Np*cgO8Q%eee5z-|zdquYKJpq@Uan z1mV>!K{y!^g!$CsLY3*ZZ8%J=vKL0#&X-K4GWp>+tBFiE^F`f($!6+mm6>|cz@kyK zoGm7@?51v-MuFCziOklERsjGstBGyr^l~cHhUpHfdNE8L7n!4%H(E5z(sQJN$$Z(0>d1WtL=G0IlS zg;rT|ZeezM8HJT94)>9Wr0WmhUjI~jcFE_h1bg?Phie1H6+^aF$eV_J9hH@K=~q`d z+>W`H%8_>1B`U+QSG7cDW-gIhA~}5GP58vSa?s>3K~s<&J)vi_hHaO4lULb#C6_bG zD|zE3?~L^=$5_ne_`QTi$(D*%$uvwSy=9@DBa$2?W5q-tQ4ew}OC_e0XdmL_heIO| z1-CMr2={@3j2~<=m>YICm>bCZ;Vvn)0|#zOAGaPb3G*P~Ec(qRCPpl?^uru zxwi#&#q~)Tjq+tWHd~ABN4dH>F4CVw=NUiR)Ky88MFn&Jvs+yq3yWhBG0G2@{~C@B zrVl4<&|$`3JlxVy39%Q$VuU}B?JQi-HMLME^ad|BGjj`gyV;8iLP*084DYw4@oD?t zHhkzBG`w}s$HVjNds-{9*M8*MJzUS9;~?J}*0*u(X^Nu6Pn)~2X_$Y&)je*1d>WT; zo;@<|jK=@0tFia{`-kLl+H5}Fc|8)#WX=%ZeEj9$0Ba9o%lD&S8*3-{{v4bC_B%$n zjru6?M`n=sIG4Mpx$!aBH4m3^P%gqcZ6;%i^7E)s{~pif-jP1IIClZ~abO<;`w)3J z7s9)EXd2TlF{j{IExJmCUfcc&HQEqput{M@j{b2aL}fHQFTatXZF vOy-mJ9b*!}1O$nqp|X4QO;LENCDL5Vmn4CY0I1lC5jjPDADrj*{>P zxSdE$JmAH|=mmpt<1pfhg9p5LGSUCR-}lyT-Np*cgO8Q%eee5z-|zdquYKJpq@Uan z1mV>!K{y!^g!$CsLY3*ZZ8%J=vKL0#&X-K4GWp>+tBFiE^F`f($!6+mm6>|cz@kyK zoGm7@?51v-MuFCziOklERsjGstBGyr^l~cHhUpHfdNE8L7n!4%H(E5z(sQJN$$Z(0>d1WtL=G0IlS zg;rT|ZeezM8HJT94)>9Wr0WmhUjI~jcFE_h1bg?Phie1H6+^aF$eV_J9hH@K=~q`d z+>W`H%8_>1B`U+QSG7cDW-gIhA~}5GP58vSa?s>3K~s<&J)vi_hHaO4lULb#C6_bG zD|zE3?~L^=$5_ne_`QTi$(D*%$uvwSy=9@DBa$2?W5q-tQ4ew}OC_e0XdmL_heIO| z1-CMr2={@3j2~<=m>YICm>bCZ;Vvn)0|#zOAGaPb3G*P~Ec(qRCPpl?^uru zxwi#&#q~)Tjq+tWHd~ABN4dH>F4CVw=NUiR)Ky88MFn&Jvs+yq3yWhBG0G2@{~C@B zrVl4<&|$`3JlxVy39%Q$VuU}B?JQi-HMLME^ad|BGjj`gyV;8iLP*084DYw4@oD?t zHhkzBG`w}s$HVjNds-{9*M8*MJzUS9;~?J}*0*u(X^Nu6Pn)~2X_$Y&)je*1d>WT; zo;@<|jK=@0tFia{`-kLl+H5}Fc|8)#WX=%ZeEj9$0Ba9o%lD&S8*3-{{v4bC_B%$n zjru6?M`n=sIG4Mpx$!aBH4m3^P%gqcZ6;%i^7E)s{~pif-jP1IIClZ~abO<;`w)3J z7s9)EXd2TlF{j{IExJmCUfcc&HQEqput{M@j{b2aL}fHQFTatXZF vOy-mJ Date: Fri, 25 Jun 2021 03:23:30 +0200 Subject: [PATCH 20/29] AssimpImporter: use EXPECT_FAIL to document known bugs --- .../Test/AssimpImporterTest.cpp | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 6c86647ad..7abb34642 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -563,14 +563,11 @@ void AssimpImporterTest::animationGltf() { } void AssimpImporterTest::animationGltfNoScene() { - /* Assimp refuses to import glTF animations if the file - has no scenes. This reuses the TinyGltfImporter test - files, not the corrected ones used by other tests. */ + /* This reuses the TinyGltfImporter test files, not the corrected ones used by other tests. */ Containers::Pointer importer = _manager.instantiate("AssimpImporter"); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TINYGLTFIMPORTER_TEST_DIR, "animation.gltf"))); - CORRADE_COMPARE(importer->animationCount(), 0); } void AssimpImporterTest::animationGltfTicksPerSecondPatching() { @@ -596,6 +593,8 @@ void AssimpImporterTest::animationGltfTicksPerSecondPatching() { } CORRADE_VERIFY(out.str().find(" ticks per second is incorrect for glTF, patching to 1000\n") != std::string::npos); + CORRADE_EXPECT_FAIL("Assimp refuses to import glTF animations if the file has no scenes."); + CORRADE_COMPARE(importer->animationCount(), 3); } void AssimpImporterTest::animationGltfBrokenSplineWarning() { @@ -649,8 +648,12 @@ void AssimpImporterTest::animationGltfSpline() { CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(rotation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(rotation.after(), Animation::Extrapolation::Constant); - if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { CORRADE_COMPARE_AS(rotation.keys(), Containers::stridedArrayView(keys), TestSuite::Compare::Container); + { + #if ASSIMP_HAS_BROKEN_GLTF_SPLINES + CORRADE_EXPECT_FAIL("Current version of assimp incorrectly imports glTF spline-interpolated animations."); + #endif + constexpr Quaternion rotationValues[]{ {{0.780076f, 0.0260025f, 0.598059f}, 0.182018f}, {{-0.711568f, 0.391362f, 0.355784f}, 0.462519f}, @@ -669,8 +672,12 @@ void AssimpImporterTest::animationGltfSpline() { CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(translation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(translation.after(), Animation::Extrapolation::Constant); - if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { CORRADE_COMPARE_AS(translation.keys(), Containers::stridedArrayView(keys), TestSuite::Compare::Container); + { + #if ASSIMP_HAS_BROKEN_GLTF_SPLINES + CORRADE_EXPECT_FAIL("Current version of assimp incorrectly imports glTF spline-interpolated animations."); + #endif + constexpr Vector3 translationValues[]{ {3.0f, 0.1f, 2.5f}, {-2.0f, 1.1f, -4.3f}, @@ -689,8 +696,12 @@ void AssimpImporterTest::animationGltfSpline() { CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(scaling.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(scaling.after(), Animation::Extrapolation::Constant); - CORRADE_COMPARE_AS(scaling.keys(), (Containers::StridedArrayView1D{keys}), TestSuite::Compare::Container); - if(!ASSIMP_HAS_BROKEN_GLTF_SPLINES) { + CORRADE_COMPARE_AS(scaling.keys(), Containers::stridedArrayView(keys), TestSuite::Compare::Container); + { + #if ASSIMP_HAS_BROKEN_GLTF_SPLINES + CORRADE_EXPECT_FAIL("Current version of assimp incorrectly imports glTF spline-interpolated animations."); + #endif + constexpr Vector3 scalingData[]{ {-2.0f, 1.1f, -4.3f}, {5.1f, 0.1f, -7.3f}, From 9afb329ea1e78f6379aca2b031d4893ab9b79146 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Fri, 25 Jun 2021 03:24:21 +0200 Subject: [PATCH 21/29] AssimpImporter: test removeDummyAnimationTracks --- .../Test/AssimpImporterTest.cpp | 104 +++++++++++------- 1 file changed, 63 insertions(+), 41 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 7abb34642..37eaf9fc6 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -82,10 +83,10 @@ struct AssimpImporterTest: TestSuite::Tester { void animationGltf(); void animationGltfNoScene(); - void animationGltfTicksPerSecondPatching(); void animationGltfBrokenSplineWarning(); void animationGltfSpline(); + void animationGltfTicksPerSecondPatching(); void animationDummyTracksRemovalOutput(); void animationShortestPathOptimizationEnabled(); @@ -185,13 +186,13 @@ AssimpImporterTest::AssimpImporterTest() { addInstancedTests({&AssimpImporterTest::animation}, Containers::arraySize(ExportedAnimationFileData)); - &AssimpImporterTest::animationGltfTicksPerSecondPatching, addTests({&AssimpImporterTest::animationGltf, &AssimpImporterTest::animationGltfNoScene, &AssimpImporterTest::animationGltfBrokenSplineWarning, &AssimpImporterTest::animationGltfSpline}); - addInstancedTests({&AssimpImporterTest::animationDummyTracksRemovalOutput}, + addInstancedTests({&AssimpImporterTest::animationGltfTicksPerSecondPatching, + &AssimpImporterTest::animationDummyTracksRemovalOutput}, Containers::arraySize(VerboseData)); addTests({&AssimpImporterTest::animationShortestPathOptimizationEnabled, @@ -568,31 +569,6 @@ void AssimpImporterTest::animationGltfNoScene() { CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TINYGLTFIMPORTER_TEST_DIR, "animation.gltf"))); -} - -void AssimpImporterTest::animationGltfTicksPerSecondPatching() { - if(!supportsAnimation(".gltf")) - CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); - - /* This was fixed right after 5.0.0, but 5.0.1 only selected compilation - fixes and didn't bump the minor version. Boldly assuming the next - minor version will have fixes from 2019. */ - const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); - const bool hasInvalidTicksPerSecond = version <= 500; - if(!hasInvalidTicksPerSecond) - CORRADE_SKIP("Current version of assimp correctly sets glTF ticks per second."); - - Containers::Pointer importer = _manager.instantiate("AssimpImporter"); - CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, - "animation.gltf"))); - - std::ostringstream out; - { - Warning redirectWarning{&out}; - CORRADE_VERIFY(importer->animation(1)); - } - CORRADE_VERIFY(out.str().find(" ticks per second is incorrect for glTF, patching to 1000\n") - != std::string::npos); CORRADE_EXPECT_FAIL("Assimp refuses to import glTF animations if the file has no scenes."); CORRADE_COMPARE(importer->animationCount(), 3); } @@ -625,7 +601,7 @@ void AssimpImporterTest::animationGltfSpline() { CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "animation.gltf"))); - CORRADE_COMPARE(importer->animationCount(), 3); + CORRADE_COMPARE(importer->animationCount(), 3); CORRADE_COMPARE(importer->animationName(2), "TRS animation, splines"); constexpr Float keys[]{ 0.5f, 3.5f, 4.0f, 5.0f }; @@ -712,6 +688,39 @@ void AssimpImporterTest::animationGltfSpline() { } } +void AssimpImporterTest::animationGltfTicksPerSecondPatching() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + /* This was fixed right after 5.0.0, but 5.0.1 only selected compilation + fixes and didn't bump the minor version. Boldly assuming the next + minor version will have fixes from 2019. */ + const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); + const bool hasInvalidTicksPerSecond = version <= 500; + if(!hasInvalidTicksPerSecond) + CORRADE_SKIP("Current version of assimp correctly sets glTF ticks per second."); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + importer->setFlags(data.flags); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + + std::ostringstream out; + { + Debug redirectDebug{&out}; + CORRADE_VERIFY(importer->animation(1)); + } + + if(data.flags >= ImporterFlag::Verbose) { + CORRADE_VERIFY(Containers::StringView{out.str()}.contains( + " ticks per second is incorrect for glTF, patching to 1000\n")); + } else + CORRADE_VERIFY(out.str().empty()); +} + void AssimpImporterTest::animationDummyTracksRemovalOutput() { auto&& data = VerboseData[testCaseInstanceId()]; setTestCaseDescription(data.name); @@ -724,26 +733,38 @@ void AssimpImporterTest::animationDummyTracksRemovalOutput() { Containers::Pointer importer = _manager.instantiate("AssimpImporter"); importer->setFlags(data.flags); + /* default value */ + CORRADE_VERIFY(importer->configuration().value("removeDummyAnimationTracks")); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "animation.gltf"))); std::ostringstream out; + { Debug redirectDebug{&out}; CORRADE_VERIFY(importer->animation(1)); } if(data.flags >= ImporterFlag::Verbose) { - CORRADE_COMPARE(out.str(), - "Trade::AssimpImporter::animation(): ignoring dummy translation track in channel 0\n" - "Trade::AssimpImporter::animation(): ignoring dummy scaling track in channel 0\n" - "Trade::AssimpImporter::animation(): ignoring dummy rotation track in channel 1\n" - "Trade::AssimpImporter::animation(): ignoring dummy scaling track in channel 1\n" - "Trade::AssimpImporter::animation(): ignoring dummy translation track in channel 2\n" - "Trade::AssimpImporter::animation(): ignoring dummy rotation track in channel 2\n"); - } else { + CORRADE_VERIFY(Containers::StringView{out.str()}.contains( + "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation 1, channel 0\n" + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation 1, channel 0\n" + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation 1, channel 1\n" + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation 1, channel 1\n" + "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation 1, channel 2\n" + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation 1, channel 2\n")); + } else CORRADE_VERIFY(out.str().empty()); + + { + out.str(""); + Debug redirectDebug{&out}; + importer->configuration().setValue("removeDummyAnimationTracks", false); + CORRADE_VERIFY(importer->animation(1)); } + + CORRADE_VERIFY(!Containers::StringView{out.str()}.contains( + "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation ")); } void AssimpImporterTest::animationShortestPathOptimizationEnabled() { @@ -890,8 +911,8 @@ void AssimpImporterTest::animationQuaternionNormalizationEnabled() { animation = importer->animation(1); } CORRADE_VERIFY(animation); - CORRADE_VERIFY(out.str().find("Trade::AssimpImporter::animation(): quaternions in some rotation tracks were renormalized\n") - != std::string::npos); + CORRADE_VERIFY(Containers::StringView{out.str()}.contains( + "Trade::AssimpImporter::animation(): quaternions in some rotation tracks were renormalized\n")); CORRADE_COMPARE(animation->trackCount(), 1); CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); @@ -2208,10 +2229,11 @@ void AssimpImporterTest::fileCallbackNotFound() { /* Assimp 5.0 changed the error string. aiGetVersion*() returns 401 for assimp 5, FFS, so we have to check differently. See CMakeLists.txt for details. */ - if(ASSIMP_IS_VERSION_5) + #if ASSIMP_IS_VERSION_5 CORRADE_COMPARE(out.str(), "Trade::AssimpImporter::openFile(): failed to open some-file.dae: Failed to open file 'some-file.dae'.\n"); - else + #else CORRADE_COMPARE(out.str(), "Trade::AssimpImporter::openFile(): failed to open some-file.dae: Failed to open file some-file.dae.\n"); + #endif } void AssimpImporterTest::fileCallbackEmptyFile() { From 4203a8f214e919bdab981e4f73a8c37d191954d1 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sat, 26 Jun 2021 00:59:52 +0200 Subject: [PATCH 22/29] AssimpImporter: begone, std::tuple! you are banished --- .../AssimpImporter/AssimpImporter.cpp | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp index f81005ba0..61a8c5c0a 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.cpp @@ -30,6 +30,7 @@ #include #include +#include #include #include #include @@ -1233,8 +1234,11 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) We might skip certain tracks (see comments in the next loop) but we need to know the correct track count and data array size up front, so determine this and remember it for the actual - loop that extracts the tracks. */ - Containers::Array> channelTrackPresence{channelCount}; + loop that extracts the tracks. + BigEnumSet because EnumSet requires binary-exclusive enum + values. */ + typedef Containers::BigEnumSet TargetTypes; + Containers::Array channelTargetTypes{channelCount}; /* Calculate total data size and track count. If merging all animations together, this is the sum of all clip track counts. */ @@ -1303,9 +1307,11 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } } - channelTrackPresence[currentChannel++] = { - translationKeyCount > 0, rotationKeyCount > 0, scalingKeyCount > 0 - }; + TargetTypes targetTypes; + if(translationKeyCount > 0) targetTypes |= AnimationTrackTargetType::Translation3D; + if(rotationKeyCount > 0) targetTypes |= AnimationTrackTargetType::Rotation3D; + if(scalingKeyCount > 0) targetTypes |= AnimationTrackTargetType::Scaling3D; + channelTargetTypes[currentChannel++] = targetTypes; /** @todo handle alignment once we do more than just four-byte types */ dataSize += translationKeyCount*(sizeof(Float) + sizeof(Vector3)) + @@ -1361,12 +1367,10 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) ticksPerSecond = GltfTicksPerSecond; } - bool hasTranslation, hasRotation, hasScaling; - std::tie(hasTranslation, hasRotation, hasScaling) = - channelTrackPresence[currentChannel++]; + const TargetTypes targetTypes = channelTargetTypes[currentChannel++]; /* Translation */ - if(hasTranslation) { + if(targetTypes & AnimationTrackTargetType::Translation3D) { const size_t keyCount = channel->mNumPositionKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); @@ -1392,7 +1396,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } /* Rotation */ - if(hasRotation) { + if(targetTypes & AnimationTrackTargetType::Rotation3D) { const size_t keyCount = channel->mNumRotationKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); @@ -1437,7 +1441,7 @@ Containers::Optional AssimpImporter::doAnimation(UnsignedInt id) } /* Scale */ - if(hasScaling) { + if(targetTypes & AnimationTrackTargetType::Scaling3D) { const size_t keyCount = channel->mNumScalingKeys; const auto keys = Containers::arrayCast( data.suffix(dataOffset).prefix(keyCount*sizeof(Float))); From 91166ce8e0e79782fbadd2fab6f23ff1a991239c Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sat, 26 Jun 2021 01:10:00 +0200 Subject: [PATCH 23/29] AssimpImporter: use StringView for extension comparison --- .../AssimpImporter/Test/AssimpImporterTest.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 37eaf9fc6..e8d9fc90c 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -342,18 +342,15 @@ namespace { /* This does not indicate general assimp animation support, only used to skip tests on certain versions and test files. */ -bool supportsAnimation(const std::string& fileName) { +bool supportsAnimation(const Containers::StringView fileName) { /* 5.0.0 supports all of Collada, FBX, glTF */ if(ASSIMP_IS_VERSION_5) return true; - - /* splitExtension returns empty extensions for files starting with a dot */ - const std::string extension = Utility::Directory::splitExtension("x" + fileName).second; - const bool isGltf = extension == ".gltf"; - if(isGltf) return false; + else if(fileName.hasSuffix(".gltf")) + return false; else { const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); - CORRADE_INTERNAL_ASSERT(extension == ".dae" || extension == ".fbx"); + CORRADE_INTERNAL_ASSERT(fileName.hasSuffix(".dae") || fileName.hasSuffix(".fbx")); /* That's as far back as I checked, both Collada and FBX animations supported */ return version > 302; } From 498d653484e7d560344f2bfa3cfc55390f60f9db Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sat, 26 Jun 2021 04:48:20 +0200 Subject: [PATCH 24/29] AssimpImporter: forgot to check for glTF support in some tests --- .../AssimpImporter/Test/AssimpImporterTest.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index e8d9fc90c..d987f37d2 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -561,6 +561,9 @@ void AssimpImporterTest::animationGltf() { } void AssimpImporterTest::animationGltfNoScene() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + /* This reuses the TinyGltfImporter test files, not the corrected ones used by other tests. */ Containers::Pointer importer = _manager.instantiate("AssimpImporter"); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(TINYGLTFIMPORTER_TEST_DIR, @@ -955,6 +958,9 @@ void AssimpImporterTest::animationQuaternionNormalizationDisabled() { } void AssimpImporterTest::animationMergeEmpty() { + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); /* Enable animation merging */ importer->configuration().setValue("mergeAnimationClips", true); From bd1eff980dd77bc08cd56eb53c95f66f3ed22971 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 27 Jun 2021 03:28:14 +0200 Subject: [PATCH 25/29] AssimpImporter: don't assume fixed animation channel order and document the behavior --- .../AssimpImporter/AssimpImporter.h | 5 +- .../Test/AssimpImporterTest.cpp | 180 ++++++++++++------ 2 files changed, 130 insertions(+), 55 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h index 59f1e090c..8b601b69c 100644 --- a/src/MagnumPlugins/AssimpImporter/AssimpImporter.h +++ b/src/MagnumPlugins/AssimpImporter/AssimpImporter.h @@ -206,11 +206,14 @@ verbosity levels in each instance. @subsection Trade-AssimpImporter-behavior-animation Animation import -- Assimp adds dummy animation tracks with a single key-value pair +- Assimp sometimes adds dummy animation tracks with a single key-value pair and the default node transformation. If found, the importer removes these dummy tracks and prints a message if verbose logging is enabled. Can be disabled per-animation with the @cb{.ini} removeDummyAnimationTracks @ce option, see @ref Trade-AssimpImporter-configuration "below". +- Channel order within animations is not always preserved + by Assimp, depending on file type and compiler. You may have to manually + order tracks by type and target after importing. - Quaternion rotation tracks are postprocessed in order to make it possible to use the faster @ref Math::lerp(const Quaternion&, const Quaternion&, T) "Math::lerp()" / diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index d987f37d2..8d875434d 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -452,6 +453,22 @@ void AssimpImporterTest::animation() { */ } +namespace { + +struct AnimationTarget { + AnimationTrackTargetType type; + UnsignedInt keyCount; + UnsignedInt channel; +}; + +const Containers::StaticArray<3, AnimationTarget> AnimationGltfLinearTargets{ + AnimationTarget{AnimationTrackTargetType::Rotation3D, 2, ~0u}, + AnimationTarget{AnimationTrackTargetType::Translation3D, 4, ~0u}, + AnimationTarget{AnimationTrackTargetType::Scaling3D, 4, ~0u} +}; + +} + void AssimpImporterTest::animationGltf() { if(!supportsAnimation(".gltf")) CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); @@ -492,12 +509,26 @@ void AssimpImporterTest::animationGltf() { 2*4*(sizeof(Float) + sizeof(Vector3))); CORRADE_COMPARE(animation->trackCount(), 3); + /* Channel order is not preserved by Assimp so we can't directly + compare tracks by their glTF sampler id. Find channel through + target id, then use that. */ + + Containers::StaticArray<3, AnimationTarget> targets = AnimationGltfLinearTargets; + + for(UnsignedInt i = 0; i < animation->trackCount(); i++) { + CORRADE_VERIFY(animation->trackTarget(i) < Containers::arraySize(targets)); + AnimationTarget& target = targets[animation->trackTarget(i)]; + CORRADE_COMPARE(target.channel, ~0u); + target.channel = i; + } + /* Rotation, linearly interpolated */ - CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); - CORRADE_COMPARE(animation->trackResultType(0), AnimationTrackType::Quaternion); - CORRADE_COMPARE(animation->trackTargetType(0), AnimationTrackTargetType::Rotation3D); - CORRADE_COMPARE(animation->trackTarget(0), 0); - Animation::TrackView rotation = animation->track(0); + const UnsignedInt ch0 = targets[0].channel; + CORRADE_COMPARE(animation->trackType(ch0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackResultType(ch0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(ch0), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(ch0), 0); + Animation::TrackView rotation = animation->track(ch0); CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(rotation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(rotation.after(), Animation::Extrapolation::Constant); @@ -521,11 +552,12 @@ void AssimpImporterTest::animationGltf() { }; /* Translation, constant interpolated, sharing keys with scaling */ - CORRADE_COMPARE(animation->trackType(1), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackResultType(1), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(1), AnimationTrackTargetType::Translation3D); - CORRADE_COMPARE(animation->trackTarget(1), 1); - Animation::TrackView translation = animation->track(1); + const UnsignedInt ch1 = targets[1].channel; + CORRADE_COMPARE(animation->trackType(ch1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(ch1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch1), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(ch1), 1); + Animation::TrackView translation = animation->track(ch1); CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(translation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(translation.after(), Animation::Extrapolation::Constant); @@ -540,11 +572,12 @@ void AssimpImporterTest::animationGltf() { CORRADE_COMPARE(translation.at(1.5f), Vector3::yAxis(2.5f)); /* Scaling, linearly interpolated, sharing keys with translation */ - CORRADE_COMPARE(animation->trackType(2), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackResultType(2), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(2), AnimationTrackTargetType::Scaling3D); - CORRADE_COMPARE(animation->trackTarget(2), 2); - Animation::TrackView scaling = animation->track(2); + const UnsignedInt ch2 = targets[2].channel; + CORRADE_COMPARE(animation->trackType(ch2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(ch2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch2), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(ch2), 2); + Animation::TrackView scaling = animation->track(ch2); CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(scaling.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(scaling.after(), Animation::Extrapolation::Constant); @@ -615,12 +648,25 @@ void AssimpImporterTest::animationGltfSpline() { 2*4*(sizeof(Float) + sizeof(Vector3))); CORRADE_COMPARE(animation->trackCount(), 3); + /* Map from target to channel id */ + Containers::StaticArray<3, AnimationTarget> targets = AnimationGltfLinearTargets; + + for(UnsignedInt i = 0; i < animation->trackCount(); i++) { + /* Nodes 3-5 */ + CORRADE_VERIFY(animation->trackTarget(i) >= Containers::arraySize(targets) && + animation->trackTarget(i) < (2*Containers::arraySize(targets))); + AnimationTarget& target = targets[animation->trackTarget(i) - Containers::arraySize(targets)]; + CORRADE_COMPARE(target.channel, ~0u); + target.channel = i; + } + /* Rotation */ - CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); - CORRADE_COMPARE(animation->trackResultType(0), AnimationTrackType::Quaternion); - CORRADE_COMPARE(animation->trackTargetType(0), AnimationTrackTargetType::Rotation3D); - CORRADE_COMPARE(animation->trackTarget(0), 3); - Animation::TrackView rotation = animation->track(0); + const UnsignedInt ch0 = targets[0].channel; + CORRADE_COMPARE(animation->trackType(ch0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackResultType(ch0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(ch0), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(ch0), 3); + Animation::TrackView rotation = animation->track(ch0); CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(rotation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(rotation.after(), Animation::Extrapolation::Constant); @@ -640,11 +686,12 @@ void AssimpImporterTest::animationGltfSpline() { } /* Translation */ - CORRADE_COMPARE(animation->trackType(1), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackResultType(1), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(1), AnimationTrackTargetType::Translation3D); - CORRADE_COMPARE(animation->trackTarget(1), 4); - Animation::TrackView translation = animation->track(1); + const UnsignedInt ch1 = targets[1].channel; + CORRADE_COMPARE(animation->trackType(ch1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(ch1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch1), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(ch1), 4); + Animation::TrackView translation = animation->track(ch1); CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(translation.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(translation.after(), Animation::Extrapolation::Constant); @@ -664,11 +711,12 @@ void AssimpImporterTest::animationGltfSpline() { } /* Scaling */ - CORRADE_COMPARE(animation->trackType(2), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackResultType(2), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(2), AnimationTrackTargetType::Scaling3D); - CORRADE_COMPARE(animation->trackTarget(2), 5); - Animation::TrackView scaling = animation->track(2); + const UnsignedInt ch2 = targets[2].channel; + CORRADE_COMPARE(animation->trackType(ch2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackResultType(ch2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch2), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(ch2), 5); + Animation::TrackView scaling = animation->track(ch2); CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(scaling.before(), Animation::Extrapolation::Constant); CORRADE_COMPARE(scaling.after(), Animation::Extrapolation::Constant); @@ -1002,49 +1050,73 @@ void AssimpImporterTest::animationMerge() { CORRADE_COMPARE(animation->trackCount(), 6); + /* Map from target to channel id */ + + Containers::StaticArray<3, AnimationTarget> linearTargets = AnimationGltfLinearTargets; + /* The order is the same (target = linear target + 3), we can re-use + the data as long as we don't use keyCount */ + Containers::StaticArray<3, AnimationTarget> splineTargets = AnimationGltfLinearTargets; + + for(UnsignedInt i = 0; i < animation->trackCount(); i++) { + const UnsignedInt targetId = animation->trackTarget(i); + CORRADE_VERIFY(targetId < (Containers::arraySize(linearTargets) + + Containers::arraySize(splineTargets))); + AnimationTarget& target = targetId < Containers::arraySize(linearTargets) + ? linearTargets[targetId] + : splineTargets[targetId - Containers::arraySize(linearTargets)]; + CORRADE_COMPARE(target.channel, ~0u); + target.channel = i; + } + /* Rotation, linearly interpolated */ - CORRADE_COMPARE(animation->trackType(0), AnimationTrackType::Quaternion); - CORRADE_COMPARE(animation->trackTargetType(0), AnimationTrackTargetType::Rotation3D); - CORRADE_COMPARE(animation->trackTarget(0), 0); - Animation::TrackView rotation = animation->track(0); + const UnsignedInt ch0 = linearTargets[0].channel; + CORRADE_COMPARE(animation->trackType(ch0), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(ch0), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(ch0), 0); + Animation::TrackView rotation = animation->track(ch0); CORRADE_COMPARE(rotation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(rotation.at(1.875f), Quaternion::rotation(90.0_degf, Vector3::xAxis())); /* Translation, constant interpolated, sharing keys with scaling */ - CORRADE_COMPARE(animation->trackType(1), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(1), AnimationTrackTargetType::Translation3D); - CORRADE_COMPARE(animation->trackTarget(1), 1); - Animation::TrackView translation = animation->track(1); + const UnsignedInt ch1 = linearTargets[1].channel; + CORRADE_COMPARE(animation->trackType(ch1), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch1), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(ch1), 1); + Animation::TrackView translation = animation->track(ch1); CORRADE_COMPARE(translation.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(translation.at(1.5f), Vector3::yAxis(2.5f)); /* Scaling, linearly interpolated, sharing keys with translation */ - CORRADE_COMPARE(animation->trackType(2), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(2), AnimationTrackTargetType::Scaling3D); - CORRADE_COMPARE(animation->trackTarget(2), 2); - Animation::TrackView scaling = animation->track(2); + const UnsignedInt ch2 = linearTargets[2].channel; + CORRADE_COMPARE(animation->trackType(ch2), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch2), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(ch2), 2); + Animation::TrackView scaling = animation->track(ch2); CORRADE_COMPARE(scaling.interpolation(), Animation::Interpolation::Linear); CORRADE_COMPARE(scaling.at(1.5f), Vector3::zScale(5.2f)); /* Rotation, spline interpolated */ - CORRADE_COMPARE(animation->trackType(3), AnimationTrackType::Quaternion); - CORRADE_COMPARE(animation->trackTargetType(3), AnimationTrackTargetType::Rotation3D); - CORRADE_COMPARE(animation->trackTarget(3), 3); - Animation::TrackView rotation2 = animation->track(3); + const UnsignedInt ch3 = splineTargets[0].channel; + CORRADE_COMPARE(animation->trackType(ch3), AnimationTrackType::Quaternion); + CORRADE_COMPARE(animation->trackTargetType(ch3), AnimationTrackTargetType::Rotation3D); + CORRADE_COMPARE(animation->trackTarget(ch3), 3); + Animation::TrackView rotation2 = animation->track(ch3); CORRADE_COMPARE(rotation2.interpolation(), Animation::Interpolation::Linear); /* Translation, spline interpolated */ - CORRADE_COMPARE(animation->trackType(4), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(4), AnimationTrackTargetType::Translation3D); - CORRADE_COMPARE(animation->trackTarget(4), 4); - Animation::TrackView translation2 = animation->track(4); + const UnsignedInt ch4 = splineTargets[1].channel; + CORRADE_COMPARE(animation->trackType(ch4), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch4), AnimationTrackTargetType::Translation3D); + CORRADE_COMPARE(animation->trackTarget(ch4), 4); + Animation::TrackView translation2 = animation->track(ch4); CORRADE_COMPARE(translation2.interpolation(), Animation::Interpolation::Linear); /* Scaling, spline interpolated */ - CORRADE_COMPARE(animation->trackType(5), AnimationTrackType::Vector3); - CORRADE_COMPARE(animation->trackTargetType(5), AnimationTrackTargetType::Scaling3D); - CORRADE_COMPARE(animation->trackTarget(5), 5); - Animation::TrackView scaling2 = animation->track(5); + const UnsignedInt ch5 = splineTargets[2].channel; + CORRADE_COMPARE(animation->trackType(ch5), AnimationTrackType::Vector3); + CORRADE_COMPARE(animation->trackTargetType(ch5), AnimationTrackTargetType::Scaling3D); + CORRADE_COMPARE(animation->trackTarget(ch5), 5); + Animation::TrackView scaling2 = animation->track(ch5); CORRADE_COMPARE(scaling2.interpolation(), Animation::Interpolation::Linear); } From 0a64f207c750b57bf84fe0852feb35a5ea8c8dd7 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 27 Jun 2021 03:29:43 +0200 Subject: [PATCH 26/29] AssimpImporter: test dummy track removal a bit more rigorously --- .../Test/AssimpImporterTest.cpp | 116 ++++++++++++++---- 1 file changed, 95 insertions(+), 21 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 8d875434d..5a24f0593 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -86,10 +86,10 @@ struct AssimpImporterTest: TestSuite::Tester { void animationGltfNoScene(); void animationGltfBrokenSplineWarning(); void animationGltfSpline(); - void animationGltfTicksPerSecondPatching(); - void animationDummyTracksRemovalOutput(); + void animationDummyTracksRemovalEnabled(); + void animationDummyTracksRemovalDisabled(); void animationShortestPathOptimizationEnabled(); void animationShortestPathOptimizationDisabled(); void animationQuaternionNormalizationEnabled(); @@ -193,7 +193,8 @@ AssimpImporterTest::AssimpImporterTest() { &AssimpImporterTest::animationGltfSpline}); addInstancedTests({&AssimpImporterTest::animationGltfTicksPerSecondPatching, - &AssimpImporterTest::animationDummyTracksRemovalOutput}, + &AssimpImporterTest::animationDummyTracksRemovalEnabled, + &AssimpImporterTest::animationDummyTracksRemovalDisabled}, Containers::arraySize(VerboseData)); addTests({&AssimpImporterTest::animationShortestPathOptimizationEnabled, @@ -769,50 +770,123 @@ void AssimpImporterTest::animationGltfTicksPerSecondPatching() { CORRADE_VERIFY(out.str().empty()); } -void AssimpImporterTest::animationDummyTracksRemovalOutput() { +void AssimpImporterTest::animationDummyTracksRemovalEnabled() { auto&& data = VerboseData[testCaseInstanceId()]; setTestCaseDescription(data.name); if(!supportsAnimation(".gltf")) CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); - /* The actual removal is already implicitly tested in animationGltf(), - just check for the message here */ + /* Correct removal is already implicitly tested in animationGltf(), + only check for track count/size and the message here */ Containers::Pointer importer = _manager.instantiate("AssimpImporter"); importer->setFlags(data.flags); - /* default value */ + /* Enabled by default */ CORRADE_VERIFY(importer->configuration().value("removeDummyAnimationTracks")); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "animation.gltf"))); + Containers::Optional animation; std::ostringstream out; - { Debug redirectDebug{&out}; - CORRADE_VERIFY(importer->animation(1)); + animation = importer->animation(1); + CORRADE_VERIFY(animation); + } + + /* Animation for each target object id */ + Containers::StaticArray<3, AnimationTarget> targets = AnimationGltfLinearTargets; + + /* 1 track for each object */ + CORRADE_COMPARE(animation->trackCount(), Containers::arraySize(targets)); + for(UnsignedInt i = 0; i < animation->trackCount(); i++) { + CORRADE_VERIFY(animation->trackTarget(i) < Containers::arraySize(targets)); + AnimationTarget& target = targets[animation->trackTarget(i)]; + CORRADE_COMPARE(target.channel, ~0u); + target.channel = i; + CORRADE_COMPARE(animation->trackTargetType(i), target.type); + CORRADE_COMPARE(animation->track(i).size(), target.keyCount); } if(data.flags >= ImporterFlag::Verbose) { - CORRADE_VERIFY(Containers::StringView{out.str()}.contains( - "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation 1, channel 0\n" - "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation 1, channel 0\n" - "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation 1, channel 1\n" - "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation 1, channel 1\n" - "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation 1, channel 2\n" - "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation 1, channel 2\n")); + const std::string str = out.str(); + CORRADE_VERIFY(Containers::StringView{str}.contains( + Utility::formatString( + "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation 1, channel {}\n" + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation 1, channel {}\n", + targets[0].channel, targets[0].channel))); + CORRADE_VERIFY(Containers::StringView{str}.contains( + Utility::formatString( + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation 1, channel {}\n" + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation 1, channel {}\n", + targets[1].channel, targets[1].channel))); + CORRADE_VERIFY(Containers::StringView{str}.contains( + Utility::formatString( + "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation 1, channel {}\n" + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation 1, channel {}\n", + targets[2].channel, targets[2].channel))); } else CORRADE_VERIFY(out.str().empty()); +} + +void AssimpImporterTest::animationDummyTracksRemovalDisabled() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + if(!supportsAnimation(".gltf")) + CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); + + Containers::Pointer importer = _manager.instantiate("AssimpImporter"); + importer->setFlags(data.flags); + /* Explicitly disable */ + importer->configuration().setValue("removeDummyAnimationTracks", false); + CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, + "animation.gltf"))); + Containers::Optional animation; + std::ostringstream out; { - out.str(""); Debug redirectDebug{&out}; - importer->configuration().setValue("removeDummyAnimationTracks", false); - CORRADE_VERIFY(importer->animation(1)); + animation = importer->animation(1); + CORRADE_VERIFY(animation); + } + + /* Non-dummy animation for each target object id */ + Containers::StaticArray<3, AnimationTarget> targets = AnimationGltfLinearTargets; + + /* Animation type for each track within a channel. + Tracks within channels are always added in the order T,R,S */ + constexpr AnimationTrackTargetType trackAnimationType[]{ + AnimationTrackTargetType::Translation3D, + AnimationTrackTargetType::Rotation3D, + AnimationTrackTargetType::Scaling3D + }; + + /* T/R/S tracks (1 original + 2 dummy tracks) for each object */ + CORRADE_COMPARE(animation->trackCount(), + Containers::arraySize(targets)*Containers::arraySize(trackAnimationType)); + + for(UnsignedInt i = 0; i < animation->trackCount(); i++) { + CORRADE_VERIFY(animation->trackTarget(i) < Containers::arraySize(targets)); + const UnsignedInt channel = i / Containers::arraySize(trackAnimationType); + const UnsignedInt indexWithinChannel = i % Containers::arraySize(trackAnimationType); + AnimationTarget& target = targets[animation->trackTarget(i)]; + CORRADE_VERIFY(target.channel == ~0u || target.channel == channel); + target.channel = channel; + CORRADE_COMPARE(animation->trackTargetType(i), trackAnimationType[indexWithinChannel]); + const UnsignedInt keyCount = animation->trackTargetType(i) == target.type + ? target.keyCount : 1; + CORRADE_COMPARE(animation->track(i).size(), keyCount); } - CORRADE_VERIFY(!Containers::StringView{out.str()}.contains( - "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation ")); + const std::string str = out.str(); + CORRADE_VERIFY(!Containers::StringView{str}.contains( + "Trade::AssimpImporter::animation(): ignoring dummy translation track in animation")); + CORRADE_VERIFY(!Containers::StringView{str}.contains( + "Trade::AssimpImporter::animation(): ignoring dummy rotation track in animation")); + CORRADE_VERIFY(!Containers::StringView{str}.contains( + "Trade::AssimpImporter::animation(): ignoring dummy scaling track in animation")); } void AssimpImporterTest::animationShortestPathOptimizationEnabled() { From 9c3e7c5900b4b7c674679c69a4388cda3473e39a Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 27 Jun 2021 22:27:40 +0200 Subject: [PATCH 27/29] AssimpImporter: test player output in animation() --- .../Test/AssimpImporterTest.cpp | 146 ++++-- .../AssimpImporter/Test/CMakeLists.txt | 4 +- .../exported-animation-curves-handles.dae | 461 ------------------ .../Test/exported-animation-curves.dae | 321 ------------ .../Test/exported-animation.blend | Bin 131551 -> 132815 bytes .../Test/exported-animation.dae | 402 ++++++++++++--- .../Test/exported-animation.fbx | Bin 84236 -> 29372 bytes .../Test/exported-animation.gltf | 148 +++++- .../AssimpImporter/Test/exported-animation.md | 23 + 9 files changed, 586 insertions(+), 919 deletions(-) delete mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves-handles.dae delete mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae create mode 100644 src/MagnumPlugins/AssimpImporter/Test/exported-animation.md diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 5a24f0593..20e8ad023 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -145,6 +145,28 @@ struct AssimpImporterTest: TestSuite::Tester { PluginManager::Manager _manager; }; +/* Used by animation() to store transformation results */ +struct AnimationNode { + const char* name; + Vector3 translation; + Quaternion rotation; + Vector3 scaling; +}; + +void correctAnimationNodeDefault(AnimationNode&) { } + +void correctAnimationNodeCollada(AnimationNode& node) { + /* Blender's Collada exporter doesn't seem to apply axis change + inside animations correctly. Flip it manually, consistent with + export up and forward axis (see exported-animation.md): + y = z, z = -y */ + /** @todo try the Godot Collada exporter: + https://github.com/godotengine/collada-exporter */ + node.translation = Vector3{node.translation.x(), node.translation.z(), -node.translation.y()}; + /** @todo correct rotation, currently untested in animation() for Collada */ + node.scaling = Vector3{node.scaling.x(), node.scaling.z(), node.scaling.y()}; +} + constexpr struct { const char* name; ImporterFlags flags; @@ -156,12 +178,11 @@ constexpr struct { constexpr struct { const char* name; const char* suffix; + void (*correctAnimationNode)(AnimationNode&); } ExportedAnimationFileData[]{ - {"Collada", ".dae"}, - {"Collada curves", "-curves.dae"}, - {"Collada curves with handles", "-curves-handles.dae"}, - {"FBX", ".fbx"}, - {"glTF", ".gltf"} + {"Collada", ".dae", &correctAnimationNodeCollada}, + {"FBX", ".fbx", &correctAnimationNodeDefault}, + {"glTF", ".gltf", &correctAnimationNodeDefault} }; constexpr struct { @@ -340,8 +361,6 @@ void AssimpImporterTest::openDataFailed() { CORRADE_COMPARE(out.str(), "Trade::AssimpImporter::openData(): loading failed: No suitable reader found for the file format of file \"$$$___magic___$$$.\".\n"); } -namespace { - /* This does not indicate general assimp animation support, only used to skip tests on certain versions and test files. */ bool supportsAnimation(const Containers::StringView fileName) { @@ -358,8 +377,6 @@ bool supportsAnimation(const Containers::StringView fileName) { } } -} - void AssimpImporterTest::animation() { auto&& data = ExportedAnimationFileData[testCaseInstanceId()]; setTestCaseDescription(data.name); @@ -367,37 +384,33 @@ void AssimpImporterTest::animation() { if(!supportsAnimation(data.suffix)) CORRADE_SKIP("Animation for this file type is not supported with the current version of Assimp"); - /* Animation created and exported with Blender. Most animation tracks got - resampled during export, so there's no use comparing against exact - key/value pairs. The glTF specific tests cover that AssimpImporter correctly - passes on what assimp outputs. */ + /* Animation created and exported with Blender. Most animation tracks + got resampled and/or merged during export, so there's no use + comparing against exact key/value arrays. Just apply all tracks + and check if the transformation roughly matches at specific + points in time. + animationGltf() test covers that AssimpImporter correctly + passes on what Assimp outputs. */ Containers::Pointer importer = _manager.instantiate("AssimpImporter"); CORRADE_VERIFY(importer->openFile(Utility::Directory::join(ASSIMPIMPORTER_TEST_DIR, "exported-animation" + std::string{data.suffix}))); - CORRADE_VERIFY(importer->animationCount() > 0); - - struct Node { - const char* name; - Vector3 translation; - Quaternion rotation; - Vector3 scaling; - }; - Node nodes[3] = { + /* Find animation target nodes by their name */ + AnimationNode nodes[3] = { { "Rotating" }, { "Scaling" }, { "Translating" } }; - Node* nodeMap[3]{}; + AnimationNode* nodeMap[3]{}; const UnsignedInt objectCount = importer->object3DCount(); CORRADE_COMPARE(objectCount, Containers::arraySize(nodes)); for(UnsignedInt i = 0; i < objectCount; i++) { const std::string name = importer->object3DName(i); - for(Node& n : nodes) { + for(AnimationNode& n : nodes) { /* Exported Collada files have spaces replaced with underscores, so check for the first words only */ if(name.find(n.name) == 0) { @@ -409,7 +422,9 @@ void AssimpImporterTest::animation() { CORRADE_VERIFY(nodeMap[i]); } - Animation::Player player; + CORRADE_VERIFY(importer->animationCount() > 0); + + Animation::Player player; Containers::Array> animationData{importer->animationCount()}; for(UnsignedInt i = 0; i < importer->animationCount(); i++) { @@ -417,8 +432,8 @@ void AssimpImporterTest::animation() { CORRADE_VERIFY(animation); for(UnsignedInt j = 0; j < animation->trackCount(); j++) { - /* all imported animations are linear */ const auto track = animation->track(j); + /* All imported animations are linear */ CORRADE_COMPARE(track.interpolation(), Animation::Interpolation::Linear); const UnsignedInt target = animation->trackTarget(j); @@ -439,22 +454,69 @@ void AssimpImporterTest::animation() { animationData[i] = animation->release(); } - CORRADE_VERIFY(player.duration().contains({2.5f, 7.5f})); - - /** @todo verify player output at important keyframes. Requires - * massaging the export/output a lot: - * - ImportColladaIgnoreUpDirection seems to be ignored for - * Collada files with curves. Blender export bug? - * - FBX scales everything by 100, and Assimp ignores - * AI_CONFIG_FBX_CONVERT_TO_M of course: - * https://github.com/assimp/assimp/issues/3408 - * - FBX file seems to have all animations exported - * targetting the same object, can't find a way to - * correctly export this from Blender - */ -} + /* 4 keyframes at 0/60/120/180, exported at 24fps (60/24 = 2.5, etc.). */ + constexpr UnsignedInt KeyCount = 4; + constexpr Float keys[KeyCount]{0.0f, 2.5f, 5.0f, 7.5f}; + + CORRADE_VERIFY(player.duration().contains({ keys[0], keys[Containers::arraySize(keys) - 1] })); + player.play(0.0f); -namespace { + /* Get initial rotation. Some formats (e.g. FBX) might have rotated meshes, + with nodes transformed to make up for it. We need this to check the rotation + from key 0 to key i. */ + Quaternion initialRotation[Containers::arraySize(nodes)]; + + player.advance(keys[0]); + for(UnsignedInt i = 0; i < Containers::arraySize(nodes); i++) { + data.correctAnimationNode(nodes[i]); + initialRotation[i] = nodes[i].rotation; + } + + /* Check values */ + constexpr Vector3 translationData[KeyCount]{ + {0.0f, 0.0f, 3.0f}, + {5.0f, 0.0f, 3.0f}, + {5.0f, 0.0f, 8.0f}, + {0.0f, 0.0f, 8.0f} + }; + + constexpr Vector3 rotationData[KeyCount]{ + {0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, Float{Rad(-90.0_degf)}}, + {Float{Rad(90.0_degf)}, 0.0f, Float{Rad(-90.0_degf)}}, + {Float{Rad(135.0_degf)}, 0.0f, Float{Rad(-90.0_degf)}} + }; + + constexpr Vector3 scalingData[KeyCount]{ + {1.0f, 1.0f, 1.0f}, + {5.0f, 1.0f, 1.0f}, + {1.0f, 5.0f, 1.0f}, + {0.5f, 0.5f, 0.5f} + }; + + /* Be lenient when checking the interpolated output; resampling during + export can make things be off by quite a bit. */ + constexpr Vector3 Epsilon{0.05f}; + const bool isCollada = Containers::StringView{data.suffix}.hasSuffix(".dae"); + + for(UnsignedInt i = 0; i < Containers::arraySize(keys); i++) { + player.advance(keys[i]); + const Vector3 rotation{(nodes[0].rotation * initialRotation[0].inverted()).toEuler()}; + /* For formats with non-zero initial rotation, we need to apply it + to get the correct scale even though that object originally + has no rotation animation targetting it */ + const Vector3 scaling = Math::abs(nodes[1].rotation.transformVector(nodes[1].scaling)); + const Vector3& translation = nodes[2].translation; + { + /* I'm not sure how to correct the rotation to account for the axis swap. See + correctAnimationNodeCollada() for more info. */ + CORRADE_EXPECT_FAIL_IF(isCollada && i > 0, "Collada rotation values are wrong"); + CORRADE_VERIFY(Math::abs(rotation - rotationData[i]) < Epsilon); + } + CORRADE_VERIFY(Math::abs(scaling - scalingData[i]) < Epsilon); + CORRADE_VERIFY(Math::abs(translation - translationData[i]) < Epsilon); + } +} struct AnimationTarget { AnimationTrackTargetType type; @@ -468,8 +530,6 @@ const Containers::StaticArray<3, AnimationTarget> AnimationGltfLinearTargets{ AnimationTarget{AnimationTrackTargetType::Scaling3D, 4, ~0u} }; -} - void AssimpImporterTest::animationGltf() { if(!supportsAnimation(".gltf")) CORRADE_SKIP("glTF 2 animation is not supported with the current version of Assimp"); diff --git a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt index 0436eb8ec..57fa9f0e2 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AssimpImporter/Test/CMakeLists.txt @@ -55,7 +55,7 @@ corrade_add_test(AssimpImporterTest AssimpImporterTest.cpp LIBRARIES Magnum::Trade FILES empty.dae - animation.gltf # Same as in TinyGltfTest, but added a scene + animation.gltf # Same as in TinyGltfImporterTest, but added a scene animation.bin animation-no-scene.gltf animation-patching.bin @@ -66,8 +66,6 @@ corrade_add_test(AssimpImporterTest AssimpImporterTest.cpp exported-animation.dae # Converted from exported-animation.blend exported-animation.fbx exported-animation.gltf - exported-animation-curves.dae - exported-animation-curves-handles.dae image-filename-trailing-space.mtl image-filename-trailing-space.obj image-mips.mtl diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves-handles.dae b/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves-handles.dae deleted file mode 100644 index 067693c42..000000000 --- a/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves-handles.dae +++ /dev/null @@ -1,461 +0,0 @@ - - - - - Blender User - Blender 2.93.0 commit date:2021-06-02, commit time:11:21, hash:84da05a8b806 - - 2021-06-23T01:55:49 - 2021-06-23T01:55:49 - - Z_UP - - - - - - - -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 - - - - - - - - - - -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 - - - - - - - - - - 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 - - - - - - - - - - - - - - -

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

-
-
-
-
- - - - - 2.5 5 7.5 - - - - - - - - 5 1 0.5 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 5 4.166666 1.5 6.666666 0.5 - - - - - - - - - 3.333333 5 5.833333 0.5 8.333333 0.5 - - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 1 1 0.5 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 1 4.166666 1 6.666666 0.5 - - - - - - - - - 3.333333 1 5.833333 1 8.333333 0.5 - - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 1 5 0.5 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 1 4.166666 5 6.666666 0.5 - - - - - - - - - 3.333333 1 5.833333 5 8.333333 0.5 - - - - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 5 5 0 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 5 4.166666 5 6.666666 0 - - - - - - - - - 3.333333 5 5.833333 5 8.333333 0 - - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - -3 -8 -8 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 -3 4.166666 -8 6.666666 -8 - - - - - - - - - 3.333333 -3 5.833333 -8 8.333333 -8 - - - - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 0 -0.01256364 45.02122 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 0 4.166666 -0.01256364 6.666666 45.02122 - - - - - - - - - 3.333333 0 5.833333 -0.01256364 8.333333 45.02122 - - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 0 -90.0008 -89.96865 - - - - - - - - BEZIER BEZIER BEZIER - - - - - - - - 1.666667 0 4.166666 -90.0008 6.666666 -89.96865 - - - - - - - - - 3.333333 0 5.833333 -90.0008 8.333333 -89.96865 - - - - - - - - - - - - - - - - - - - - - - 1 1 1 - 0 0 1 0 - 0 1 0 0 - 1 0 0 0 - 0 -8 0 - - - - 0.5 0.5 0.5 - 0 0 1 0 - 0 1 0 0 - 1 0 0 0 - 0 3 0 - - - - 1 1 1 - 0 0 1 -89.97488 - 0 1 0 89.98238 - 1 0 0 45 - 0 0 0 - - - - - - - -
\ No newline at end of file diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae b/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae deleted file mode 100644 index bbc2a4e5f..000000000 --- a/src/MagnumPlugins/AssimpImporter/Test/exported-animation-curves.dae +++ /dev/null @@ -1,321 +0,0 @@ - - - - - Blender User - Blender 2.93.0 commit date:2021-06-02, commit time:11:21, hash:84da05a8b806 - - 2021-06-23T01:55:33 - 2021-06-23T01:55:33 - - Z_UP - - - - - - - -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 - - - - - - - - - - -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 - - - - - - - - - - 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 - - - - - - - - - - - - - - -

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

-
-
-
-
- - - - - 2.5 5 7.5 - - - - - - - - 5 1 0.5 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 1 1 0.5 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 1 5 0.5 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 5 5 0 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - -3 -8 -8 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 0 -0.01256364 45.02122 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - 2.5 5 7.5 - - - - - - - - 0 -90.0008 -89.96865 - - - - - - - - LINEAR LINEAR LINEAR - - - - - - - - - - - - - - - - - - - 1 1 1 - 0 0 1 0 - 0 1 0 0 - 1 0 0 0 - 0 -8 0 - - - - 0.5 0.5 0.5 - 0 0 1 0 - 0 1 0 0 - 1 0 0 0 - 0 3 0 - - - - 1 1 1 - 0 0 1 -89.97488 - 0 1 0 89.98238 - 1 0 0 45 - 0 0 0 - - - - - - - -
\ No newline at end of file diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.blend b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.blend index 46f6389bafd0ea43e2e40abc92d56ee1d2e5e41f..0f61e71e80bbbf4eda714560da352c272e2f24ff 100644 GIT binary patch literal 132815 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
pfzCNnLl7;G?#e;VlRtPQmO{$}- zx)%Bv&;PhqJorBOTGX*oz(Y?*;L~7G{eHJ4H~qVk#AtfK790V2+Y-!0F?N`I>vqES zH<1KqJMxI0ZnAm&RjFyxoPp0et4~^Mj(L^{}x(}h(I^`!mqZQOcN_j z9E%nrPp$P=o}dvUoM=;vgc)I2*}5Rp*tXhj(PQ?JIZ|Otg>m|jCN;y{qM7+VBfnQO zP3bx9*e7dQk927rti>2gqz_(5O(#(r&8cM7!?RW|j9BII!?T{dn%y>9@A-!LM{EnK zxu5995tMj(&SUv8FaMOY0wj{@czWn{J?M$07xt|thXt-gsd%w0Do&UgA!0r=5~i>J zGB_}D)4PQ3-$AN8EKA@ec@IhXkTI0>F^uCmgOiW@*vltqGIV8IGxBO8M5+==6b7;n zs0?J@vfh8Lyd9n8sni7>N~GOX`Lyz>$Vl%AvGUfLw?9Ai`E*0PTd-%dpV+YW4qAHz z`|*=vbDXO8RY^Y|FrfK-#uQg~5(#@Dr`k)%x2Izr5B+R5UFf>vWnyhe(y7 z1IKqc@=5*5kj4L0_dQtcNN?ZruC0IEq zzC*+}^*^96_@16}JTWn7@r0TC2L|77g&67G?>YND7P4tpja&nhtyD6{49C!MOi;J}Bw*twt zHxbsHAxee<@^oK=G1$2X6DSTH9*+p&^kC$EsQmNEK^s#|CO-KsWr0`BUpi{6`y_*L zWI|a~3zfsI)L-S=NL?|fs@RRD1sR77T?tPvj1sH`XjJsYTJ11YTf4t-(X&P2JzQY^ zK30@QYL#ft?72db)^^wNl3?p;FI^BeNpz#GTIE}$!^0;%u~v*$!DOop`U9gHrqVAM{ zXAeKB*CSgZsh-3v)=kSUNQxH`H*jwlPa_9k@$FizG&y}Ku<;+UD7EPQmK^0mM6S2^ zEg~v`;hc)jT2eg0&vSg2;`Zplhw#}Y`gBH?l9W^q>n_T1dS)Yh754dDM7qG*#gQ7s znu#e|gM+~#q2$tr-y%+|FNo36hMHgGjg9^JlB?|#(yGEx*msIqJNhbmCc8t<665{- zCKD0f5JkF-!RfY#2aK&~Bi;&s3AQo@xdM-#;Z>4GLk$*lcmt^WS-!J}JrvD-^!18~ z_P#&M$Z}G`u!(VYWT@S@7aO!WzxvctIziz9Nfn7?26x@jvy%UK&p0R|KkK=*Lkx~t zSYGvOp5QEhXd7q(G^ZRAtsFtE_Jp-B(CsG*D(^!sjzhb`zCIv3#sBTysDo`0uMlI% zMjFBJ5HI@gJ8@f8zruYv!ek8Z+`EdLBd)bVHUg~?rRWTPQSlw|B2*5!_f%}Y>6coS z>Vt(uy>%KcGtv=`)Qc0<88kII;QLzv>((w&8nosR#VR z!c&!1KDK$>yVdhR^+)F4JNMw$+|byX7b!s*97a#0A|s9CS1lwB(IwhD&^r20Tss?H zeZux+Kq>@HiGn_be6zDe`^sa)qDQ?d@@qPB@hOd^fQ=gNr(YIrch5DkADTaB&k)x} zk6?bbOs&dtMCcJKYez5}epbNqR5+b|t#$U4tQz~WT8p@lD>~{fT|GJ@0o~lXZO5`= zv4&;V0)~dws*$oonP2pB^9LFF&37Z&7Hd1SFT|66#?i(jR0YHNHMY_89)^TKOFWe# zk?m|GHE@qSD;=Rn>>7c*{L=D;Qj`S|cNk6sTWTbbp+Cgy--(McGLNi15EkfbU{rmt z8GEv`$t||6eou){K@-x--0Vq2Em4cqw5^IH55PmbD-5@#S9>MmgAt@;;ty9f)7$wg36@+AXi4;73#_*q!V>j6HMz!AK$PQ-t z(P~GKBZa^ZN7Eb0(^I^EEEX9tiuvL0{tNn^O!DV zSOMV*pKZ{uSy!*Q*Cp^q=%j8d)b`Q}ic+sxUotHOL@7c1A@3u=Y$0t%gZ^=bb#KOe zFF(&#cloQRbmhNbT;AK|_o0==$746Ew~~ZTDJ918#^@2Y{O_@gOo*b*(4BXiExHb0D9^96zyxYvxmC9wvKX(}T ze6)X~I7*k=oXK~|5+ogBvO9c2J&0k-j7Ey&f5`BBIW5HxWh}oew7U!Z7(#T>K>8JX z(5xwZUTnA1z$;DHM}`0z9>I1fjC)w-exW~(G1)Q+D4Rrxq0A!|QWG;b)tN*8CUZCt zIn|61uTXzS+l*uj-YhrCYWF5WkV!GX*!U;ogiOW(m`^62C4Rqk)CWG1+rP~2-zZ-F zH57ozxZ5%^)7uyK$Jyb-Y=7zHPf=pP?K?R@2qM49hoG)wvu&(5LwdCp>1}`(lSISkQ+%|YJq*uyc5(Oj$`dAYBdZ_XgpX;3X`3$ce91u zC^FRSp-dP(`~szUyrd%(FPlBxF`~L0xXrs>>6{%|CgKPpVnU!3Bm#AdSSSz)=aD8z zl*6Qu9byh{v%otn8<(VR55J^BbdP@)_6oTGYN;Jqs`Fhv>u4cium(ZZIF~7 zoY%ojFSSESK@ju#^3Eh*Vy4@pYpsQ3v>7c{_dBAHv~nGqL)>ac0xj2uQXAI70IxNU z=m2;7oKGTFW*C&*Y^I3`XKFJ;>?bTUGmFuhaJ|3p&ZE8(ffZsKnS2-;Z`rtN+ok6f zAa`fr`x;ZeVlyQIDum)>D@V*QVsXw!3>}sW`R>vnaJXH5`4UP-fhcmPN&B4k?xnWk z#*1iL(A}!qeC{uC8l@~&{my$mcEM_6^N0!@=IEzuxXR@nGUWxcBkTUEee-a&Me~Me5+WZcTpqq2M?NjNXt1f3E|*j_e3Ayr$MU8(NR0Bj^r-EWuxj$$lmwT!!W8R4F?L zJR?qNA6k59ey6s-Fe_d_VLS8i$x7#^q-%i^yhCoI!bBxk?`B2+R%odBlfE(r0u9tI zH-abJRf2&r_m~;yknxR>+Y-)^N>|~El}ED)fCn)n`FUXoRzJ*8p`(@ei-;ji!xWV| zY%-RRIN;nC9ZH%<+QrsnB&n-&?H=aRo(ZCT01rcOWUnjwrK1g?4D#g23J^Ug@hsYx zdfLEjWxmFOsS#n%4B_W`XDCSuT}ps0pL>>}Ccb7ep2vBN1&Uus4}*BYY~*QVVhkKj zCMOT{1GuA7pf$0x3&ke(r1Y~G_o40fPG~EPBxi{pD_jFbND&SMilIx@cZTglW#wt4 z8`B%MuQG)+l0F1m;NzqVeZ9X2{@=b86~jJScDEcn1VL+Z&`N0!sE%4-lSG`VcGz38 z31OtXgwTV8NDCw~$ZVU5)YdymGdA}G)sTuKvBshdasR~0heOO{r{lYfo=HqB0m`CJ z35}>-7zj(U2ZC=DEvC?`*a4dpt#QYKx(F*#&FL*|hWB*nJVl*cudEO$t!??l)l5xO zQ@SzMX`q<`Hn<6*HMq^+(@mO}75||6QmP^qkuLY>-MUdv64Apw~w8EcZHlDlC;rQQ3r{O0^2 zL`=S4N5;f};DgpW0_AE$6;x-Uw%vAiD3baVJjYkt3mlq4oshsvhyKiei6r586h>-BMv;2F-?KzkQ@Re zZETWEgH~A(u!9n@ifl7KmpIM91P&-(AodRf(o3LXL5Q;4uWD-%_MhrW$kS8)k zQd;djf=q~oI_dnAB~NgzC+o#dozmWe4h4CA0E8kUCSnMcE+)UXRA95<3<8aKQ6@=F zAl<>65nR#q3K;4W(q3?P_5DaQar3M;?NPU0a3 zq-ddD{d~d>9=^GdfR1=B&7A^s#HtM%MwF-WQPKerNOUDXWlB0`{@%HZJS+n`q?bLr zXeA5*JtW=_I&eVH6{VJCpa;a*#Ae^%;@!%H)Jq6={L^TZ_QWA6y+ii0#gbO%b5PSh zA;oh5nw-Xt8t6#;K$)lFlIj<*?@Pj+Y!+=K2@iM^*nP&9kq_;;9&OQiQHYdUN&q{} zweaJJ&5S8xD;=iM3OX>4rC8~|TZHX!=fh!NU#ztC`?@tvkd{&_7iuix4kD!ToCU-l zZwP4JZzz{nXhvzHF+lu06fkF{T!#SF0hW$F0(pkL+gVhoQyeH0L3$lS61U;K`*kcbtv*1Z5m=stc3-Lcmr>;)`)QO3IW@e zrG(Cr?X=-y97u$)J1J{XD)-KZNK~3}EaI9#WDG>1C+5U=VG^#oc_}0;m(Ei)sI&`A zm9tkdq`j~ZD7-z|7L5D}En+g4{QwkHGN93GFpBEBM<7eBU zBL0vNo*Eu!ry}c70rAZMnyy%9u@2i$*wlA`yvX|~1rP^M)Q2usvgnhHzQzhT zCyr6x_OOaVM}nQTtkoPt2cc*itBFeNsFVc+e=O!o*pbdC8ORVg#zvPL0Nc|2Y23mT z*ocCU1WRx}&Y?M5<}?VMXc-FG%OlqGC%r}F643&&1p1^ettsLjM5(JQtnfpB-8VX| zhC!0?1|%g^E{bF`9w%Rf4f#yWkJr4;zF}*GijQ8bUf3?H`t z>e+bdo(Xa*lG)1PIzIKq098~%{9sA|G<&GXnRVZa;aIY?HXyE&;ys2%N#}K% z_HQJxA!nrO=2Qln6zN0n1cx?|HVuCT`%(jqLWOAf`Tz%~)N+f@19NCsx--8F}KKvV;Fj0~@B4OCWSc18` zm@#q`z&!MtiAMoMyFKK8<4QL*5)lO~Za5PfN!$fXdxfFu zd542k1eR(dOZrVPRtFpjG&f5^ounFxy!kA{$b<7WDA3^c$rK07s72ajJ}}yNvye_I zV5&HDY58Tn%>pMKw-8^Hg%Qc1ld0rmjt2~LBvcpRmD~kDrDcfME9<+pSQYO_%vQJo za_Y*YiM_`0RxVix5-lggKFz0MIg*ZY>KLIVnMfcAp3|l^7;At$xU%E`^Xl z9her18xp2}mK(Dhvi>EsMEoUwhNmS03cEx&QAxk9p@cT5gmnlmf5&+MoBM`sHO|DZ zPGGVB*IlvsERP0LM~JZsF$Pmq>}Zrp#>gihGJ6U1SEqjQW6Od#065YlQN+8#hA&z6 zp)301S&(?7Q#FBOLY162yYtgvB0`=1YI&gZfF;@)0E6Bv>;+B;+qcUrq`14bo6d5j zCkv`a>}E1>zC1cHqe5b!m)FEM2rb8cR$KwX1l8O zEW-XIbHWyVjwq6?LIA@i@MqX2Uyi%+&+Izot1uIYm9pGf84vTZ4D;I+b{3Tr5JMZ` zTK0L$TbY8gTJn*R!AqTG;H9u?9~vpy*0Bh4F5jkgxrjc64@HNGXv#20phigNifyzw z0`c(Zgp)n7*j70BZrspJfsbn~r>BnDvWoq{BcrWjNMkb85b2#6pRCI{wV;L9PBCecWQ#I$dqG)(!E4Gi9C4eD?(R_vMIc!tUMS)K;@+@}NhrSi!OKj>G z!A4pT$*>dE1oXES>10f8;<6gbY~w!FyA$n1B-9*oDt|e$OZHI@0BcNjWCXDNu$dl* z9KqmdN@8V{VRW@4Ov0@^sntk|k*`oi+YrnQk+XKTHknCVkILgbh8#6B@!kNXatwmO z6=kdsOg`jq!HLO{jfGe8yHJq1#bgugd~!!@3)S>Ud4q)Kov9=T!H&>FeA1(&6a0-j zVE}VhIdJ4S8pn$ook`*|5QuzPop3&b7%WpYyurAtH1y+$f*(U2yhSVUmQ#TkN-2o8 z_7a@NUK95J#L9xzW5Fu<@Bv7OJFP|VBF5PXv@$sj0dcY%N5MqWc)W+%5}^p!RB=Rr zP8AfZWfYDg#$&lVMzoTT0uBIiB+(H?A5wuh&dmvY8t@LN91H;r=e^QxJ-Qv6pv~cK zQ6c#$wRGf0);q%lmtyVccv-Y9NOeTq+c7KhEfAEUHlw_W7Zc(be#z;0_;oaH%&EUK zmXS|_BoaJ6fw-N;37mISfQU%Au9T96O9b#tWHJeq-x6t4DS|a8*E(P(e}h56go7 zIF@((qSnc#@Mk1_%5FFcq8Sp|2O4q$}?vY?P>qIP6+U?NlrK~65EKx~fb$%I#h({~&wrzPSHNTSX}B`0IE zZ^|5+5T6NA6OsX(VcUy-H528xlo=~yL}sEIkr&&xe3Y@tgo2`1FWrjY;aq7WAS|r* z&1CweKC0Skchru2zmA9u;wiSxwxJf*uPgC_6S~`q2`IIQ>0qf4fXtdxB`r4nBF7Q_ z6zN+g1KP0A`Ob|qGTgPPF@AGM-Z~*7tnmm2_iZF2z_>iJ&<++?f!NlB&+RTR7>xri z@)W7viCAn6xE~bU9qeQ~eV~6w4p(wjo$KU8kdsKWVlj9T*yR#-oUkP7C+wC;3iZXY zngTh8v-Oxm<1|9se&#u}lvqL#ccEa6v3 zipI3$A&YT{1%iMkPZ~ufpOm7LMd(rmct)NORdSq!Wvg+?m(``39TW*drb>}&-&ykc z&Q3PpDJ<55#^&19$mK&dlaFjLI4#12&MMZ!vpYoW@M>^Us~{$!rt%VdAQax%;*__w zTxkcGM@90Vo-i(?GNQbUD&^NQkuo9NDJ55mAz_GD(yF@>p;jx^j-DBeKu&arx%l{1 zD0O*u*QP}A@Z5F)ZHrNNXg_YJ0)kPA#qxJ4#z4i6HE5g5?8sz4G73?tHD#1a7UR;` z6IqMvTUAfcG-8$BI$N;C8H6KF#3?nWZ2VBCbg~+wi;)nT{s7__vKHo6o`m59P_=M% zE0sgj0x+{GGD5C!mB;S&Ezw;yr#+XwOlOK*T>=-r{IK<@CgL#G{*vg-6uX{~m{ell zH|(+xz-ZKkX=j$>!($wzH0jwE><=$s_`zw+zUYM+Nf@5%t5hi!iKk%M$Kb3w!f|+# z9-yku-IN?i#)hbpa~Zhsptd0O3Cr*RESRamG!yD8I$4<*I$1>}bh4Ea=fe&Lv2QlI zoM659LAwGyXxrWEx9?i$JVvxmV-MfMu6#)x$YbgpIRuM7fQZ8~I!vX6+uoEGn9!T! z@zhEIjX~CHi3D9>IMut5HIzsPtaf1qX*#G@TFn!nCuyc2H!&6MNVTxk`FKMM%OIW}O#B`bvbxe%G@tX^J20!x z{d#C_@|pF4Vae&kibmImR((!jaAxUlIAKqypqPDCYCDe-Rg&`dAwgpMx>A-DeSDR2 zL<*R!TcWAN);!(TQ`6pHhiyL4Loru{I=8C^`-2VImT`TYUdv3A8npbk2k5MW2XM); z`c@sNT0&c%83mFScci3%=+i`B+Z=uF)Ls#Ni+(V~>k~TFVhV$}*0Y0*(;OA*By0SMg&2ola$=A-c15eU_R#}>r7FlwL6i~a zLP|0&5YD&hT2;5Ze1yBdy6}Wrn-211tF-2hYS96w?IaS_D_haxOmT7CujFabS#h2c zZBob`|F@&n^`m5Qds-*V6GZ>cnM1=&>o9qTeoDai;WzfgVfL^R8e>(B%^nTH$kGbR zQ0#Q-ge4N3THWluch%q@$H+Nbj3)Om^}0FL60W>@azE+|bXyf}ccXoC`TYBLpWgk; z>*4b^pI(0)e*604YgghZPaG8-6zXp1F+nV+6F|B>r903g;+XhC_EUTA6gcz^-JX+} z1r29aIH}k{03;21?DZ(tPfjF?lURh6;fvGmO^=)RieQ|=L`R7Kv-B9q-DSITnxcvP zQET$}#nwU4s%FB)AKpM+9hfeEyGv>%VIgrh`TXvlQ`b1pBeSMxHMczbrY*9}V$~l~ z5cd$8SS#)U!{Z}}TvLjx(;f#b!6jykFkG{BMtH1|MlwuB%zI`NH9LgsAM1$Y_HZNC_-R5g#g;6 zE#r{MMn0!L^gXR|bkbThATO5)lolZY4$xMm)@;vZ7k;_q%!{9hGl%^m8gaPimE*;c z-n9E*I6E=1Q%=vU04^)SZ%R>(Qq)AAJrh9+53}90ZI;vj6f5cozK9};FmA<`XuzSR zwu50EA_KEdieP%bY>=<4K zR?chmyNH)=*zzxP7JT;Ltlw@spXqi+Nom(vCtu{=aKpwPOQwXmCjvq({7FkI?avO2 zWz8Sh>$#;<8E7va_74Q(0p!6V54x~V;(2XmLm96RK_@Y!{BlXjoURVbll1=ul{S;c8 zqvP;Lg`w3B4$&*|74xMreoxhqu<1i*bQM%NH?g;aB`vBFB#g-!sw*C3GU@`B0N=4_ z!?R%mEbE8B81@HHDW2Mm&4Bwx8hZ+@`ka zKgyax6j6;Ra7i+~;@dV%;$w2=e&seyoBCzPjrd;-$&?JZp5?X{lT)0PpzV+#L^>4C z*eAf=NzQa+9`F*|H0;PkX`W6D;y%k0nE|bjeQ58AmKQy zog2P`5Hzl}7;vvehNBR`z^2lO&QD=kx69<^y+#YWMXC(0@2MF-%^%$5Fc)0s{AEkK z3=jdRNv>Xz3!J(&1Ux1f5jPI0&F}GSOmMYKK~b)IuJ5u(Cq?%#H^t&JJUyOHBSI1E zB1fkT%<>U*axrMj5_&McukDBNj8kBcx!pA#=pM)bQG^bO6hWfR7qTDB7v%j8MLvam zeRb^EbwV3qgT!^qn(Gko2e0o;d9GXt039b`lS!B)!wI~ z1uA>&g1g0OA5<1cAbyL@-Lr+H5$_wrrltLE<-GB`lDJoBq^_dYEc;4o?J|Ry2e!Bm zHn?kHlwIh)BTC=GBydIo5?9Q6_|wGh6{Nt9oajOJUW%P2NfMgmFAeLXx_q9c7#(oP z)(3rjqPRMU@UMIKxZJ>AeT1-5$pZmFR6v)6BPBzCmcZOeb_#TKKz>0ay|G3!>=`%X zF_{o@5I5^_=SJZZs4A+9Bw}jM%GWt+25U3TPiM#m#xiT5I*YWJoRv((LB`UiA|PB% z&uvf#T?d8CWBa3G$Yh6P5$R$&@X%-QL?X}DE4s;%kQTq&s2F_>z%e3s4p|;WCHxx6 zmpC%*h{qrXTEg`s;Txjj4xxcAkW^S|ZZH<1k>mw4_eRKp?u&67>N+jxXH68EW7O2P z*o_MOi|bx@Birkv&iY)m(1*CXo0;P%j)>v32!pAyoD(QvCD$m`MBZ#62E`oZ9L8a^ z4hb%Cyi=sLQx)pR-*f+cCeCCs9=oYZJJ#>uyNIm9UiD==CY&i6HgbvDqMGqd`bg*U zgIO+Y>#&d%$r3qefjGO3mqzcU=Lqn0!g@apo)8vAVyTN!F53^UQ2-pI3;OZ14Z)V< zS`O?Yg)g_D;FoP)GL^#BylRJXH%7{&E}3hF;=5`_z(XcvFpzu-lB1_6h_f750l#eKFTJU7{$i^Zr>~^{O#egK5c&P~B{EEN zDU`o^M|G#}m2%c81WN%F=&<)bd`N?KqEEi=?O8%ALXq+$9a2B*y^tTNZS;HlXL zR^$P^89S;oYfN38*HG$=F~*h&k9%?>i>%RKbCL4`*>PDJMkdtbxvlD!ECdiw=ZBdTb79<6Q~lulN~!P-C+0Be%mh_} ziYTGwa<2QcSx#|~C+FVBF#=VRXtTo`n+4(!PKcR$PYfzwO?)DMFbT4eG&r_pGz3rr z25iT*X`pN+mt_b6kzU`mmkkHeEz<$fVA3UeaUyA)yK5uA7QIG7b{U421Gp4D9e6_+ zc-a>d(Zcay?x`=bHHXzYR2DI!!wNl;CZ67bAs(#P=pZ2dI{u**oR%953esB5$V?rv z9K-$MDW%JkO2_PIf|T!C>D(>fJwv8Z8>j>wlp*6|z$&i;JCF-UJ$cDOgYNLl{dF|ee zbg@H-6R1aA(au6n|DBT(D4pscFrw3p0=VH2@tZ1BRh_ioATCM^=ED|JtpZs{ zJIJhnp-xs}(8H_`(rVG)Pn1>SOj#yYouMhQwvj%e4N4=n&F2c!Rc3iDIZATO@*2d+ zBYu{gW4y^U91dpd4FjR<#ASjz_1xVLWK}khb>MG`>peqm2+>%Q80P9Y=FQ)Z;DGt7 z1uz8!Od~CY;_94w=<|xX^z7P_6~8uW>f9GJeu*}khjiJ@^4<&LY4HzXmpZMDhzvyh zj_&+B=VWGul8It+u&b|cBk5n+XY~3y5*Hgn;VK2zXJ557i7r1j{DP>9^k%K^%UUhZrQ%Ar6!dgQUDH2@SInM?>9x zxfJ!ikg4&$O^#11c$fcL%gz+@8mTb(GSr9_H#2S#DJgdO;&(&<_6O!k?b`5v=XnBq zgea!G-WwFN2S?ckQD6(Bc@}OQs3QmdB4uccFn-*>>d)Ww=U*Vnf92ob`1dbTG{2L1 zTBc#zu4y>Le)Q%GG8nhQNCpv?^DYo>cS07?(!u()HB5H$u*mxL>|^MDhpu!HTwCVl zzKINvw3(nrYQF6Lk92PR-xeq>(@DL%)YYroyyx3_)dZiiG@dKD`mA5ud%8mM`CgvZ zYo3Omv)jJ;qDkRcUD?IsPPWU~Bq95;YcP(4Ey(W@X8W{gXH13Qx&;Pi!}XiF-o1kc z_b4y1*9>ZDs-=){t$s#R79R(3$m#D4m}ZcOJ`_8IUUEQ z1oe^jAw*29{0s-hh=w$bl}I;-D#BH9AS;W6D7}y|=me$@UGM4-4!bGSptldyjvfBs z0o$~;xPWz+i?6$4FFbdR@b6z3GfJJ?)(_%aHDZ zXB4v(T8gx7G)G+}e?SbNu;WSP*8Q|_UC)kh_3(oy>8j%oB;_)k!OPvJQ?%Mb>w3bY6Wf? z=jNH+o0PkqhpkkZU79L#^@SSo~EuM8zhqbDbihkx5OXKzQTGrV%hBP!T0r?93YKhBmEw zcjjTa;D|%Z@d%+xhd3ZxKW<{3BMh@auiI;HR{gRo7QZAo{0lY2MPfJNHgru}H-j*t zVWg|CoWw1Nkgeo>fHt=y1*(N&ViDzd)*R29<1?;+N7jt{Qo;!aT3Ll#VR_~pY3@o3 zsjIm=YwpgQ`?Kc$T;8c6dH+NXxN?+@uZ`+hJ11L3wS18Ufx(ZXvcmrbsndqgf!Ci1 z_wegKh#-TWkaY8Hu|t|fmar^hGZ>v|WO)#C!K@1nU*Sa)T3R|#BB&7N%>&GV;Z^Uk zF)=3?NXeUJp~ovPrCz_Bgz4Y0EDNyIFvNJ;YVL3yr#*6P!AX|}rqxBS#3eLdvam7K zcnS##9CK@hD|$Wa2@#I4-YAC+fzwcAwNVbn78zm*mqf7e$%OI1JZ$ZmLKkahE7w5H zMOO}!vigc)FyR2GHg*yidK1VjuZZ^pPK_D=s@IVo5n_n#vH*b^I4o-;qlPI zTc31En|!fig}%JgDc!E-owfOPoqN#DyCz+-rGzCQYYZ>Nf?hHRQxUI}^194QzPmQ> zG~!Al%iV+`v?pm>qTp2}E>ki@_ynqv8zQZFF40~kTWsLomO>l?x<&EVc0uhGtF~e1 zx%x6^$9enHrQ@35%W<}#22AI#KLV7SsC^`L$pvm!GQz$37#|+{<`tnD zP}E4sdKJg5D22dgXM~v=Ql`T?Btl50aVFBbs39Ng0P<-da(aq(vOTxsA*0p3!{GVr z4P{;oLJcnkCC0bBNr?zwQA#|%LHBIetnq}+<)hdu?`)ny;B+1X;B+43;dIuYZ23lg zW}YWur)=kJ37ISCs=_L5X_avjw62-pbfxGXG^<6))xiO-31YWTRIS-8W)>KKzD=F* zK^6nICfgX!s+z`SRnyO~#Ad7UHdWTCH#!>33)F^MmUdO_voL(1oR3ul#qUV@nYTc9sTg3M6!># zA3lqlZD@(AOxI$TGAuW`6ntMQm#?^a@&l)xw*B5_3Bc5D{{q#K3$MI^UbIP_{wz&isQ4;V$zz{h3qi zF~d5Wstc@>+y!#(N;j(>ck`WH-Cc0>T^s{n0{UZIyP(q+r46v>MJZGD>P^QAQYv2w^zVYmM0Y>>QH#8R~LA zu01cO^~Z7FC?yfb$grRi6d9opOq_6xB^zv~K6JrX58k3aN|@Czx&?wMLKvpL_#Smh zhDGiSmNVFoDQ7_yHZhfGW^{;TLH-haXX92#2_e(9h%9C$-dKiE*suN@?<&w}WsqX9 zzS5ygEzK>Sw3MET4 zC?Lcn)&ZH`U9G$En=0W1%Db1!sEqZN~l21Zwl_MWsmquZ1L ziFr=vvglZ#4dxPo>LrS2biwE*iK0+nAJJ{Oepx}l&@xKZd?)k-Yhm}ffY_YQ`FnuSj6uq*|$H4oSC@ z}NhwS0!?-LX z45)!zn{ag?4>N|Ev&N)#{Xu(Lwz|IyqZi9K5`RTV>d^iSjh`YI(B8}o1!b$5;X9*H$CEyIYh%#3o0-NEw{Q9s-PDSH*zgO-VV3 zI(UpSscggRa`mXLX!iOUp(EYvGRb6kV6jM-%8RZZ#U)2zWL)MsMAKS~6eyYbG0rV4 zO6gYRU7fVg@AMdzE{;#zdm=MryK~pI{3nwnq%2?1^f3dC_} zlIl_rmL1nZo@l%xWBm*(nB7!D_|28xh^{Q0Jl6R<6&)N--^;QzU$Y3^zJI}EnfUu5-gdRbzzF0;6pNr zOE$tc04r@brI!y`-{=^jH`=<2Ne85XTqVasyn-8R3%K{FA(9YLq_;L4XPz%)u>=?k zLqu9ZVYnObq(Cn0QGv0-XElYbC4aa;k1YgnWNs0qfKy!QotA-Oo&dO93B6AvmB|Wc zePLIo(906lQ4cdS3)NI`z2Bq?xu!g!(Va+c#>@dT*yfyadrsBXGlwBdNWmIJ%|;R4 zwHG@J1ZVec&d?ajA`6|c0wbOt<@momhFH+*1A38SQgtzdB5U*$CV8iEX$y4T1qH>9 z0-sIiDoUk~iC98gi1Rn=o3Kcx))323M_TT`nwE!`?jTB;CB$;TYh-+KK#45BSaTIy zBI~61CmZEF;UGVj2Oa0a`tvAQQX7E ziCWI`w6klEfB_8AT#k;fkvJ9q?55|6@{)`khvLykJVFwU|DbhXkvOLQc&ivlm3$+j ziP(n-k3O%2;`j9%=H`K`<_GA3KRJd}fthLHq*w9{;keO(C*F%FKh1y&$EyhQ8W6+* z%0#Au(UFqCxWHM)i@TIfp<;_xliPJ(+4f?r_EEp@Oq&OOi!fB61~-ddHhPm!T!Y&=qXbh(gFN94Mxv@YB4Vth7+Zt-knX ztFu}sGps(Qk>YZ?==hBTdwI;!gA8trorW$VjzU_`<~;+MHVw~oPDsi5BV*x$cQQlD zgCq+lRNscqLN~408!NC|yK}L-c6&6;%@SExk#}Hf zL8O|f*hF!ux}WWs;6NP7O$vKuKxh_aTx44)|7B z0&y01kwD}THl={<>m7z|e zGN$51Jy76*g?dGD{N#(bt$qdRtSTZ1DZ5LsJKI|#8Er)xJq1Zfp97uZDk#ihCYAVp zYVL~dvNjMY*1#gSzsZC%ZvDnXuJ83bau0)t#JaTO*(3O{%|`%H3|VOYq-}(TID)up z4oHxuI6I|`jX2q}&e+CqGmPeC!S2jM&=Iz}u*2~ei`_iFGe+eQfk0A3v^p&&dp}ob z3=9j`(0W)T-JO3d)tUWA?@nQ%%*&VAX~AzQm=uKL4-6fP%w8>6C5&>&Ql zEF7-QxQrS)*`O9@-V1}PEaSA^!K6)=m!xI4DB~f;1pYfH20|>ut2k5#+S(F2z~1ei zdF?Qtz0^Jfv7(s!I^jmVEDFrA+V&;G%!v8YktkB2w5fzd40njDt{P8)oq?RF&&0QS zpJL!>ACHQqyG5);O-45~p(W-*Jw`q*3p*=tsyT*7%e9skBAx1Z;EbD^& zC9nD{uE6H%V63%pE1jD~fx=0ArKySoXoSWXIf_!2IdHfXm=XlCv(tPBL6;Pd^hm$L zQ|e=fLc(b`9%fXHF4*NGk?A9VR>G#G^SH?tYT&a{^I-3iYri0i%leGnY>GS(k;(xw z^((6`X`!dNlE$EBMik8{8o2|6gZfzf*9LrUqlP6TFcC?jpI9E5mh_i##Tj`}vy7`y zM7XSoT|#`d;=}!sdC#F)Prf;+Pl&x@NhZOl2NV97C-__6&SlcpDg>1FCIpGjqE9}?m zR7!pk)E88e`A;ozL9?w*?A9)qHJfyno17gVrV`f*1s^7W{WDlpJ2<#cC89{g=JZ=8 z33TL;v`F%;I>1AmlAtrBS@EE12OLPq#$ppLax#z)nWqHi{Cq?!5E%sif;Iz6$!@PW zF%BcrK_MVKVXEaKkGLy@woM!GbKHEM;Iufe>3^{+^a+L_w87_XT_duPPL;I zXAqPIa~Nlwpyr^IDI`>RBAs>ENhCqiy;J@;D(d)*a^en#Id_qjsW4Ps7zg^X>>PE> zW+fsx7!9pOZa(3nCj!`YO9)?1YKOLiOHM(d-l7?&LIl;RluS42qp2KSEp@?UEvrd;1j{5pNtXbns@~J)=LZK(99t+7`vN)G5`8K%4 zc*5srM8_!L5c8?-CFsFr$oU0uY|&>pbUZ^mDRSW3%pSq$GJ=hoXINzc^%-qAE3r&j zXYRZ@zKZY(EJp0=uIC1TZP0V*i72x^hpA??L|8bj3oPF5>@O9EFmDz&`um1F1(49ZYp&Oil@MA1ccb3EeY*bL5R6Y z{(8+VqEpNfc*#}~F{+fzA__NV|B1~LZI;bdSm7#q#CKT;iln|+@x30YT$kQxyk`^B zcE^so$reQzW3L8S0>&s}dwK0W0-&}9n-0X;C>S;?AgO)~TxJLwC67Fh3X%>_pMMy> z&jiP@T1^yWM!{2>J&ZrWk)S7Rmb8rI{WWcnmWj|y#TOFBs*w-cevrr{Q+Q^HltqFk z{tm0=oi$>pP+oH(07O)qd7N~p0Rh15gM>0U86;5F)`f_R=fiOhDoBvkN0NOj7;{03K;;Mn7jk0WYFU+2u1_!F zLYB-UDX)=&^=;(q2dJNa%~lzWn`L;hyr92G;Lug=OD7+PAu9S!Bo48QL1&dK8NKio z1T3-gBC4@3O3E^{2pm$Q5&Y;5D%bfwWqCc(_HxMY*=_>W7UO1!V7R>2MbnH*mnyOw$8F!UKaX1mjuJdbOix#Rr*as0qCVlbwzxi#O2;ztIKA3dSX6 zhV#>xFDNotr!8&PCh+;&&KX7^S3m@kJGdDw90X2-4kE?0gMmTTI)#)<h+EJ_B6u~@pby21N1bn5s#!JFW@yWqry7$_hb!W|-^t&^q=o%RCaz4biNb&j z1>6|cn*WOJR{B~oIce8-O0-ViYL5jV$uV3L;xveHJdyXk{Flh5gry=((2{hctp!#{NoN-4=$Fr=&Bhf^x%0s{yECEFG&0pTCRl8O zH;yUm1)bPuwlJIvjGct9g-b-%BiCx0B|E$=x~D_T(Yy34KQaT>WLO2V5S<9@SC3f1 z81;(>KK6aUv~|oC-^vkj7SSDi!n!BX$Bmg6LZhvxh76cD1lM4v=n*PdnhrH z6}EfJW#`G1efi#0)QV0QSwx<+nMB?eT)W}aFT*reSt#yNTmk95@T#sb_z4$GwRM;) z!WitkWe6Y@bg>VJD3taI=}5VS0Y(xeCmb_znpTBX!X=qr1I9He*u#aq{a1AYDRLJV zb+}WAy>qP}Hp0JD@CVstO4vfNLADizjh*MTn@$%BadaT@Pf$xP8s#?m9rUCRLfU=-yAa%PgaQB3Q@;Owv*h3sGXCrP4)SY`k30R33JV*MQk&zkmKm2MKruc zdwK{4gPsB_00uwx6SbcLQyWM26P5eW>xZx6+{yk+uF>?m?GWSB%OmK?C(wD5POj!i zg$`uLo_4mkK^bzmyM?*E=!ud-J$h{+0&&#=4nIvhF2O=DBmSi1y#7l@`gpQufn;4a zB`f8*g+R0TjfAPNH-roY)8Qpuh_v}`em9a8z{2WduovwU)rCM$fD3-W^lkHqKExZc zx4n`S)uOVI5>^Qz&r0f4+20d&$_x6?AT9kzy*GdprScHCIEG)MS2Sb=R-~Pq-qbTSJLt z%^i-S2lh6xDv-|ZxEC_(gG?PZi>5f}?As{F1lBP)9daS^Pk zNS=}@s;1@9DteAN669tH%P7^11NyFK>QA9aRzR{7BBmt?r7e9hk*ygW+9dm*PJY3i z5#~Q!_)KR9;H%gIkS#_Pp0wjv0q74-7t4GeE@qQYcHRADD@uHP=p7mk(*UVn5~g&T zm{W{7h9$frm?`eKpjH<2VuTg_bUnTaCrBhExq?Jx?_@j>Vq~Oqe+8=-s~%74nwxwd z#xlu0GI_;uV}6aUl+3nS;_wbr5q+a6A~qdubi$&} z@e=BYq(dx+nn3w4IdFZSqLj}-CZvl4$B!Isgd8FFIR*?FBqvL}6KeJPthqjKuAk8u z0*{&k(x%Tb7vSFk7QgJFRM3$CnW&Iw1@d(!cBRhlTxK?}L~YL66O80-rMinm(7aq2 zO59w%Q*@=#5-u9swr!_l+eyc^ZQHgwwr$%T+qUhS-g}R8@40X5^&e|ieX3b=ityO- zG6p5@3WyvSi`dBw92)XZxWLLnB)`?72+>kJP50S~IXr{Y3YTWtZgp>0S{tj$3};k9 zeIHAPI9#5rVHYg5ZHV(g6$fwH2?7pP zh%Y?k;kg9V69=Q68L*uFfo<}|IKjvSE3c|s+6xd(XId9m& zgQ2&i2UV&B7%-$pYUplB!W&P~^Q!*}_L3o!|Dptx=F1-8rj5hTGd{3OjKuQ?Q^QF( zp{Ot5B1yP6zJ}|_>?RGIWwcM8&pWXX4jI=R79S?X?KSRkV%nAfnjqe-q|YpB$Pv`0 z%Y8?Bu>w{pNpz1wAEu6F)h&z>3GvZK4*BS<-d_q4xWIu@f;cif=_p96HRCU+-IEB1 zSwQ!cxx(^KYB$pUu_V#ydTf*nkM>+isTS+iONx#7!wBKY#KM@~fy%2~B{zI14rbf$ zsxt6xmcmx-_#$OsfvN#GEbnd!`gmz6fD`g@BC~DEX6cxb>RFU4er^uunH!0EUf~!M z+Z;->>=zo#Q+ufc711@}{5GEAG7p>n^h;d!ez{S(T&Tp~9?Mxb;9EiTOsx;T++HE# zKvSXNn!;LxSXjOiA`Z^3mt03p#m?3%PYV@VAtY6yUW@1>ePTl}9qon;sQcvLXqO$y zg|2d63!!0S%32{Kg0}gUJCwWrwh^kxHL&S)XV%#Pa25zEzpV+-)#BnG zixvI2);I%8$4SLY}AI-adTh)s!rZJ zsv;;zhJ+tUfRacbd1EPj3?~i_<^KeQAee|&hi*}-_JSsRhNaM&jV#1Nvy{q1U4pIQj@$QYkfI6KA3Y( z7a^}7iAd{cpC(O79evWvL=vR*wWsEqU7Lx-Pcq9rU`s_I-HMEx9q0zc9=aJWzCyQ*-LT^D8+~%-DYCS>s?;=HCu)XUgCW$uU8I+^Y;9VDL1KY|qjPt&&R!(H{1ml6 zxU`DBHQQbbLFU~2s$aoz7GccPPW)*&AA$p(OQ*H)5b5z0Zt_IsR4&#=!?RvSa-^H40QkV3%CxS%UR* zQe*<-ObK!KD8q?1N{}aDZ-F9}#ZJPA2Hx2+Vl<>H+TE=JbWgC0*lFS>t}2Uj^<&nA zNNY6t7mTnB{OXiIZ%K{Q2aEci?cJtSEOZSK^td_&U=ola%HFgg_9p*6VLum?!MUhr z;f8S53TvihK;*7b%Xzs>X%2n+FLCY!?<0qivo+P7LUh&1Vrn1>iPuuW<)6J5 zYcWO$Nm)7&2w;!M;2^6LQ1ky##0tA%;uKz=ppQxN#;;Iafb8`zV22WiYME!6Q4bHK z;t4u2#5ZdyE95YXHr|uyl+zN_ONuK9lrKo6c>KKEk-W5jmH@^-3mZH-3NiDE6*O&w z*BE~*03_XA8QhqqKuk!@Yen}Uc0tjui9WU>hU>C@>~A)4y~re>@}eeR&@}zt(gR zeCDpPziJ~Yd(sGGyfq`yYCmBD-4eE=g{g>nTiDVlyzLGydNm6ne{89dlEZ7T z@Gg0f+8r5+Go+PK^zT#Rtmi$2u-G8YF=sA>gA_tKP_L26gNAtnPHl;jl2G8vuq3_9 zo#2$va@fdu_EMn~)=6QsB6B|V8?{#`)Qo3v`CL}5&PyQi7`SObSd93p3S&ni)geg$ z)YOF0sznSUU}h*!iEZftxA(>fYN!V_R4v|xn%5@hzWfo854_C%sV%8*-Tzas*vt-w%&bpYVj%*B6lNl}eJ})T6w?~^c@8kBOQ=Xc(Aa3T|KDT{g-v&>I$V*TexrMJ27hj;z zXBy#099s-MV$qDP4Wf`uUuU10QgCP@!dxu$)@>bwew^#P0NrlbpQj(60xf^FPi&4- zX-3(M-B=!5Z}l-_OM9ze+xds8%42yOnd@^H*Tu@2+3;zlv>ZqTk;h_jNTu!av0nyH z7N4j|xX8rJ?iC$2hRg;=WwTtQ4L%oM?o8*|cRxGzqF7{qJ_?VE?>3+`WO)CRigs$viRp&g!4?W>Z*XkNeK&RIt^O}Ra)_n}fyTnt+{a9hhpSgw*SAh-%=vrn8 z)cGBKyABb}3QH#+;crGlk#zv^I1bhP2_or6x)lD%!`KrG$eDTHtx0^L>^QS#%KR_D4CQ>w!-&6;2}fqGM$TVE{mcK^Prt^row zyga7s4Qj+mo;$SmEy?+M2D^y3Gr1*Q_u;;@1yvdrlqig`aP0RD@NZH?iTRb9K)_@} z4v*UFIMo}oXFdP?%_ZHFr<@-Itp|6jHXFt}Fc>4t@`f+0X-gtn3hYKWzYy3m)4ebp zrN(bmMbEWlWNh&swR9mL+t$v*+Cf#DvAhYLmiE(v;5niG8zA;0oVyxVn^dn!k!OHE z!gMx)xmCqMpuFH;XzzUB?b1!_9{lK?LneOi?YZ!Wd0bs2u7b zRhaG}L>4^nghuVRAK*l;zNtoJDBj~%lUnawEP8vlXbNa~)-SwJch6P1Oi09)+Bj|oq!vs~oydb%X+8*wl`JO2nn}mq z+HmDZ@BpZVFQ{1g-kitJZaY zgkyfyL40?S`;ch0fX{e*1Od4cc;u_zbb*8~7QB|@A|_^Rdee0y_0gO1@m&=VqQPao znKj5dO2q2w725TG(4{^h>)t_OliN3RRFK6Pvqg9FoX{Eg`Y)s>3oGT3@thr(T$*mU zX{9e_-2(7PWEGsut4u#-OZXUb2%ehYZ2F$hGYuQW)%GO0SDf6k$#E8?PQ6@)mN|hs za=^3)A?z^>W&daNbc?Hqo1j*#4QpC_+;mpf9Q z>`c{&3vOkqYQaBoLMDCOy3DL|5SdM(YLB0|z zVmOac45*Oa^M`1NjY8@PZ1EYjd-u#o)8FiJ(ZU~m3Z6aPts^pJ`^q3piY`Km?ufx5 z2l+)G!#Ttj6*2-(`R-BM4}tQ2t!=fo-*@M!?T`j!0O~Xf$E4aFPiLSm0DgY6FmRq@qD^Qx1h^m z--w2mcyj&MUL|BXc(UjARdQ5#;$OU}TM>-CuI|ONbz8>97HIO?)o2%xsMziy=4?5c z>n7M48)O5r26u*_i-yId^`;w(9QqWSSX>rI)PZ_scy^S%wZr2Y&Z(>(sHzd=N-mB^ zK`@;XlGD)Jwq}bLPh7l*y$;tE|FCl5=eXX(=E^*gta4}6v&(0pfMDtNHgIpPy+ zAR^Ou+q$w73pE~$pAgf5e=_r7Bqep-c||VGdB6%g)`$9ghuQd;LJ4)V<&cT5Vz2n%FKV44T0Dj_7r!d zM|12&BmP_CW>+uU(L+&-rl^W6Cisfqb;)B$o8QH=zPGqA_Y)Onl1c6eXmAhjY*d=N zOPTj6F+Xnj{M?e?3*^9{xw?<9R{jUBOotPntX09`=zB1PE~ae{wB?S;k+m;5$1wFmAh{$hrB<;KE9BGN$ue~l@V^3)v>jfI^NR)6}bmq zyJ_38>1t)>>-zOa&CT0N+b->i$#{rs`3w z#oBaFnjjm*~mT+RrJ|Xv$>T%@V?IjZ=g)?k3(;^ za+N~cS8Elo0S$I~U+#g@HKi~hY>VK-1^6{#YU6<3Z}D=26qRD$u+N(r<}$l&b>UC~ zSSXwL6E)4*b!fIGK)ivHFL{S8Tpjf5QO7x&XJ-?oH~Z1q`$O`xX< z(p2b;Dz5;bb})z~CDNc0PI+J&LY$4-{v7&922o{kY&E37&)Z0&0m*G%_fH;w1T_#6 z!+(7TDaC9V%JBk&;A!X6v1X_3#QX-$4#BkKI0Z89U7y_gEP|#MS`7AYPCS>>>eOnV zjp92iCH!^BS~@S-lSq7x_>fTh70OC4cCKC;vU%Lai>K1no59e2t`eDdF6egK60s1-9<tC!8!tz&*mI>6B zN%(7$n2Cm?JGW!gO`p)_CkPY#K4LR0G5kKhb@5M#kK4=03*BRDEV!h+&@Az@M+B?n zXNAL*;n(}EQK`$Mip=ly4|0W(O!Ji7JU4)6CHmS>ouSO%psMl85JkF%YFoJSEA~bd z*BX76+Ni_7Gkr+elpX24lo9>$c}^U?@~2h*h)!cHl-K4+d9^lq*FCYBN?p_Y8E9!g zAEJ_7#3$z1wD^9m=aKLv$0Pga2#DLo-O|>x*(-+4kCK!k);KApMQl}*7*i!rj-OuN zyqkA%?EBLM1X^J2Oyp>Njclw%iM3rE2?k$N*~*zIO* z5l{45egDxDwlN<;nePvJPbP8Nd1ybTA*~7B8hK2S%#ZR1jp9zQ9SR0msw_k8Y=&OJ zQMpNjdd;oEs4jur3{9-L)Sa|yF;vT+P#ZEW5jd zi*epcyEq@_XgYK9pN*DzuL3mityMJ_zu#JXPY3ARBEYC`_kq%GqaOyZmPbQg9NJPJ zJ|MheA4)I=#Xu9%@qw&S>f(`5?!<#Owa*8SR6CQnkBl@RD{f~^Wcb!`<})lmUY_ol z1-q*{{wBuf9`=HWH8=XatC3lMIk!#l`zWkB7t)AJ$iIQ=i;!MNm5KQ4u_Hn^_p0bU z-X`Tje=I^Ga=`R8MPPS)+*DaVWZ6bNtNL*&Fyr&ChEY{GS&tw%v-1$*zCEU@BI$)p zhy5CxE{_N|O$AFKng|{s|VSb(Y(>bxtfTv#1h-z(#DDFeQzOt0;+-UYQU~nt=tEKaoIW z@1Zk!o=p`7kz69lOX>4D26Vw9*B4zOhuS%kAZK*0Bm!6NR^GdIr34y|Du*h~{5c`}EKb{3rD-1Fv4aV(R*1to+@jwQy@4AN@T^ zE`2R1$A?d@sF_~NdE~$zXg)n}+TO2UzpnayCf6S=vv@`aY$0ow|0b_Lc0?}wv|tAv ztZ!&A)vO>c0^4;X3A!8~)Nv!*{!ou@ll_NiaijQ-Ok#2RI^CMyN~!mS{ien46M3Fu%8X^ZKFd1EUGy zD??(q(5gtbKX>dM!AH@;90@MQ`*@oSD4w=OtoSvTvBT-RPMZL>e>uo-AOM<=;?M}z z3HDkOBW3%3pK_3C-;b8c3Bj^Nx>+_0;mS$xBj7K)vgy=^eY zIJkhGmd{P$=-BG7C_ey|ENVdd$&$}K0{SAyLywXJRv-_-11%bq$H6CRWzO+*@28t1r zerMM)IJ*JE`9kAoZT9-v@!^_1Yee}z`GhWZ*smJFt=!oQyiq~z5^{)dpFOZx53Qh__ke@9LBte$6xA}6{bB0#|Y4txPCZzMsOOWDevA; z(-Iy2Ej;j0g2fFs;(gn=S0#M@mSjFQ%X1fbs9BI)%*Qd%;`+vj*NH*U#)%poMscBw zN=+o7PD#j)C7n1hX*2{w*5^kPEP@tW3Mh;ecxUN#!n21^vKBDm z7{LYwr-M5s8f=_nfE^c#=`6p@95nyU(I!(yj6ZQJ5QD^NPbMw?$VF7)TAWS;P*)xn;qYPt za$;Pp4|jj@RjfwUh*)Jr7glBGHAvnZaJyY{t>gQhdBi@|v-j;g`R%)Y@(p&v$J(>M z&6n`r^6{m_e5gDBaXsa0(Y^P*&HfGF_WiZKegB-3;d^xLYyNfKv&H%?c5i*pm+{^5 zx@lWodf!v}-C?r)QRDlme82rYWjpp6dzACN==-+qBlZdZ{nFw4LES@TYqr}m#rJ*G z^LgYtW&6GRZS!?+`*m#lC3U~Z_n~_CjZXS~{4KVs*(+w>8T;Mfnc8u1l^`VuafJ}j z(ZL1cx{Rdt^FzwsHMF_41KpMS3N7N^m#@Rs|7rf|{e9p(D;?MU2y=BceRY-NvR1iF zPagS48-s>dU&lfSC*Y=?MECxLHJ!7Nif5$U3u zR%znFPUZksHMMeJkyh|gY>r6|r^uEpwWH~@9PzsZSyE9p!soovSOwA>BMUG8lXH90 zNAb>oRHgL|3F%b4a>$wXYnu45Fe!|_nBJVM$V#U?G-=VPOcGTshvmm$;j_IjeThp%R8_Mf|hfcw1mb39MMAo!}5_qeO&gQyA(pR;pJ}qE7Cb)u~^# zN^+YTE$Z?d)VJ{olU!si8d>83rY7Dx&~4*_236i| z&Ywhw+=WV8^F33Q7ID%R&Z+I|Zy?A#L?-!HjUp{C3H3$`kuBkty_5Jj?lE6o{JRsO z7)WI`Qc^9&uSh(?(VO5+G~>sntL8t$+*TY>=874$p_K3aX0y7djb9L!=0=f`sIIB; z6?P63pNaH?5AtYphdrqHw%5jMgNGdzktrCd8`q-ih2`9D)RvMCnb@0!BTyrc43u;Y zJNE;8VS&7xxSLXUbP77TUU^qjp{z=G_`WWUgi)--k6dPjMQSLDuZmxV6qR z8i*=uH#P=2#W|eP?k7AyumtM4Ucc{I?xinV_*4;2BsiU zO8bz6CdjQ-q1ili--~nM;HP?&QhU%t(ly1e9y1g-S{9Y7R487+b$>NN_*Q?G-2)f{ zf@V1EU4fC?$Z7}?xM;un$$;K2$85&%VEEQ-#?YeaAF7)w`|JRa8(R;JpnvoN%A&5@ zIqE-$0@zi^9}ElV;C$?1F#_Ae_M^en{pQ{q7V2?3DTynO%SV=SHy9imDc=(U`r_pG zZ+s6D{iRLXPs&K*Ul=3>HU?=84obuhYFG2OSE@5I>EzvZnxsI4xOyr%S%W~JXdGn%G1S{C z5JbM9ny4T|;)+ zox^&Yjd_=$a~dqdzhSqVu&q4<%wa(U>M_9h=LKPc4VZ&Ez(@JTpRhxTdOk=8uVY|H zQQP|iMK3YMEHPy-G5IesA%06RU0n=VmL_Z(x z^H|}}W}oY4kB=qLc&0yjp#A{M)Q8q@?q^$p;}Z8IHzEFT5dg1t9l%?G&fCC6+lLzy zdp%HnZAy$dpocof5&vh5_sw45>8O8O)d~$pC7UmCW=LWr!fJcwxOV&td@1sa7 zNa`*WQw%m~%1}Zj^IcnwL51N?tA1e(djIf5@wx zxOuqSx7DrgNsS(Cs_M(g@wP0%+iTVl$>H`-)XEo{qWEwD@efO7v;e>e71ug(hi`!0Y3c)!3!ChTHaabKce6Kc3Yb(9;whB@J~I5#_rooZ(mHT%TGTx$dAmwoIO(o`A12B(sUZ!tj6x#8`Q z)8nJSgaiPQqVMc5zZ6GQ4r?@(0qlux9ry7d1Q1~A2tYXM2!B7v$fTq0;HA3VK5&Z9 zD0@|FkH*#i8aJDl-0C#W@@s{B^oZi=Ni`(u>XxhwEhC9TNjRMYFH#+Irkn?(0=1vK zV}49_kdeSDvx5&@D8&8ijO8ZfnbJ*4dv!{{W3%OD)SDe&n@+&|X6#=X2U{-$_bcd& zCoCtiwT*!Nr+nhz?}Pv;AcEtFr;Gd3ez0PYe0u01r2JRC%A>bbniki~Ts%A%bxg@BU4P>~%9bboeU0Mm!HW7*?V*ZVBvxiK zgX_UBcOrsUo@;13$vcDoCg6(!0IZMT{=DSM0;_iB$iN8)h^YiSgabC9AEa>n@IHt+ z^k{|wtY~2v&l*#|HYmQB>fYm6BT+}Ll#Dzt|ETBRxEmnDz8 zw%CijiG4yWKCpi41#o6) z`@2cZfCT}IL>~)XcuH&)VwD%x4J?Zg5EA$D9cDZQW0&rtN+7G3l9yeRqj;T$T-IX9!%lb7I3iT*4}oLfT95 zwNnLelyg!Oj}h_vUw`}(M}L8qz^Zd&$2)@k6?7dx#JM_toZVyN9A((ZTYra)f6_->V*Wyf7ZEJf-Whmdx zyz5Kw1{SzJY81hIiJp19{9Rm-DQdPp?!W}ZkGb)p@}*=w4jk1bNwWx zY@@&=T@A)}e%c~kRF~jt4)0>zApV%hP{GN=;)HBE?KJ!Dqs1$jG6y65=+9&b4%bTn zx90}~?hXk0ix7Z)K1=$i)Ejr|3_C(g#qdUKTPmTWsPudM6IN7aQficDK|D4z2Vsab z=Cp>g6|^_dvONTPC@Sbw9M44SHQQ-}J2ZpXP{XA1E$#hpph!*9#!1z1h#ZUr1a?Xj zrU{_rjrzFNvXe!HqFSfll!T~30u~T0G>YaBIcRf;i#cyd<{iq z;|A&xT$Yw`Q}q|24!YI#$b8`T$O$cf(h^3rQcxGNl@EunE1KtOCpd-iCaC1R)1GS= zlynNJi?l1{U*mFeet|L^t}4#dE20Xj=vPPbD~tyEGE%^i=8`1U|57%eu$bm)5lt32 zu9uIwIm`q4{ZN<~k&JxpO?&Rba`qfk@lSX8R6U^ zn@t1xTjNEf0g2fAfNagdy84`7yA=FUV5vAb4#~8@LT^?09=&5D zwqE5fQcNe!!VFR=I&L0&CEW0{sgQ;=GGs62M{I;bqCHRYy?5UJx~8C|>q z_DS9(#^ilXTBG>yoLu8j4el;`;`37)Zf*g&4f*6>f=?;*jSfMSLn`BC*sONPO<)g= z=D`Q>uA6IE?;U94b#!0QpXc(-$@As-CRCC)X7n@9Y*(wn5L^g;R(J>D0y$j62J186 zi1vzOfEEb6)iS0T>f_uF4}dsjK_u!iN&A-(oQ``evp8kTwho*u#&Ul~>5@(YxKZ_}Z*W^|g`(i2YdUD4(f4RLh{vxd zC|z1xb5?zhSNuf?p$h+YL(|1Mtyb)dxpLuJ-+94dVcwR)83uC%HhnTRocer-oH2Cf zJE#Aehc9G_nE6#n%wmncS?X;HQ8a8$I zocgt!>>s7V?c_ym%-HVQKl)jcXK$4r;UB6uSTTFg!w#}tLwMG&+Fit5eBtkSyn5ee z9CF!}XUI=h1n06jx9>o@wCE>>(-pR@$Uz^v4~>CRk_{0y=t(xo$DNqV2B@D?&b8hr zXcBGQi}ar37bACb(QRMgmr(5!o+TC8-JRUFp*0lv=S^w63QIKBg>}&^7biQ=*fT$q z2;jfkx-BY;#kZz>MuYLbUL^35{Z5;=!cLEkFNmL4T@J>&?g}pW&t;YryYBh7_~)*{ z_~RBkbpsd;1t83aL*&DN?Iq~(P6tCl;t-Go48#o%Wf~W`N|N03qcUyFj8xM1w~o5I zWGFX_aV9zZ8;cH>xLUXST#jw8SSiVu(j?^iot1s|% zC3(E0<)L=&W3{AQ24WvsHjlO9U7q*_jC z!cs{&%5qVajWXD{AO{6JYA(@l!R9DS;>sgVCF5%2ssbqYiPlG}v6iJFIwocRKcADL-em5Kq@hyn{OOhk&h_kvHkbCSKLg$_ZuP zb5T}+7XKx5i@3)ktf&pbr3(v++yAoss`~5~zsFv_wELd?ZSP>V8Z$0Md=npI>opuc zDX#mNoGJ?x4{_}nQ5T#EW)-a|#&L{|k$}iAQ=B8WGyr6MBz^J$lr*UMnLO%K>5(ty zNxyUkXp;e)H0XOhUK+pupQ43Q8NgDrOm-EnS>(JpFJs0Gwd(CgWQ+Gfd3^^}Izs8$ zd%}JaH{oR4g0eaCfVL8GEjzXj+14BvTY@RDPcLa!`U^=r?M`i`%oW!&|0a7`|5fIK ztg@u@gy2fg^km{|+tk%}|sTERSOzfQ2F9q#u(3D9TV3hdjf-D>JxbA@~b$lWMfA*N!hlTtCV#C`^O zCAW*oE%pU{4o&anX#YwH87-O5yLNY6IY}*rd5$-o*Jzsrfc=b_S3MqY>&kMLw^aXn zdARSp?9Ne)d?5XrJ2F-PHH8~)(--M%yXews$uvaye-yqnB={m|(X!pWS<~iO_d94kYc`(ncRtjryZ_XmlLXqt_~exE!aK3JNuTCgw_r0EdWDKOD+X+ zx?V)g>8$b1uaCF5dLIQg4)HjG+|#^p`Yx$D0N8Ga`TSbG#o{Ta{S4E7D&`N#1^*Uv z_T5;q?10HIcn|V3%vI(LQ$iLH+ulQ9Ll7T1LuiVRMb1?*YzEWxz7HVX8;Duz%rO&F zHNW#iTSVngE!n(`W+SW5Ln^U*1F?qYrItO@e%K-(!yVzLx$fd^JVPqMdj(K{j|njx z5*MEkw2!>)YCOQct~+1!XooTdB)lAblD~`FyblV%FA3Xwg2W0OY0s5RU=1QW#kmT} z&F-hmX~}F+YdsZy=l?DNqQ9uqt^n+n~coUsb)5wa$mZ5p5m5-(XwicDJ*5Et{ z{fIqXmleBE~x2e3&$O&YAD z9^GW%Yb^j;Kam>DPr2Bq_Bp5lQrl~SR@Bw_H`V?{E3OKKJuoNs$=pHLwD7QBDzJ+* zVo&HqPGp_mZcV9|v6-qc+Ae837I@oKNSu=2~sA^_eW6SK+m8q~6>yCnTLAWlT zJx=$;vB7-DnltAzf9`fECjrVNn&#jA~>kiJdDGC!d;U#p4 zUrf$E!R?)r-8HLB=9pve&f~ja8$p_O*jK&ycK>*wrp%+?4ZL-FlUOs&nxUr3WjJl- z6H1Ti4USH)lpAP`z|(eTpBMBjf#C1PoV%Gg|eF~z=RM1gs3)k z3_=8KOoD`PgTZbH_(=SM;vnIKkR-uIaX5;#0Evo5tHv-VzxAIkG8&27bQSmU;mjct z(dP8!;4uk^jRGd)K|Ssn|St-W8gM#GfDX z07kgWn&6;qbRfaIXnC%=N{B`%Mci9Te?8rnt`1g}C-L$l)*Tf`9)e$zNjjreT@Z>< zmIvH@Qio}PjRo$WLNwH*d6I-i?&JY^3o!74ab2+euAOLf&I zyBb($y9(&X+-~i+tP2g`yRLB5>z4%+70D(%E;p<-!!psCG&`AGN|wN*QENcjJk$@6 zDuH3v_%!QW+Qz`A8Gn`^Mt zYCq?HCeV#3B-P{6+_hY1LC*HXP_FRJVRJe=2Ui623%<=}aa%_o+pp69NpOweK(ZU$ z5U$Uf0!HY_ZW56J=~>~af0S0RgK2(?p9{;Hz8v(c~50T7$E+?uj^ywF^`!dvz4~|2Gzb?R?XaUC^?A*y`?VpU z5&BZwlA;;X`4`o~q#&Dse$~_KEI}1+sP4H0dzzzO)w#359DA@!sLnMb_)=R1 zUOqushw@}LBfG3pTXxJE!e0b?*KX?syU3$vO?HzeXqS(Dvu;|Q`Ds6esFZkFnt?}q zrafk-aqg|gd@|q&@Tm*^ig1VFWdi4s^&qd!2~x7d;>_)7{M@dSBj3WTo>nwHzEE!a zwq%mkmw{-3-njoUd!Hukf@@V7YY^!p&|Eil&iTfv6Waw=GVLZH=+9d#vF*J>&-r%f zHUi&o0Py;Wq5*TM!FxWV zW}#DG`{^?ud>EjkLWMu*dq6Ub-@*enD{%NQpJ_F8(FP=&ctZrbl`wNkN@tKh5P2H@Qh@ zYoJ5IIZ7OoqQHM>tB`wPuv0f~qn=Bm<1tqK9s+xpttTz8QIK@dnDonkqsae)VhFcr zJFfZdK)b&z9CP&+*1_F;`nIs~Ghk~0iFN8+AM1wK0JwR`P9bzNsQJ0rPN8@+$Q}Z=C&1o$_zz-# z0k*5xXz$2ge}Y4Ts7bitBqki7gzG#8n2-So49EgKmMH%^2Dl$| zh!BujA8qnK*8{qKRMk-2-gkxMzE(H zK3=bo8%XRfBzN%t!Jb{%&R{b)aNmB<7XbWSWUmnVn;$^~y%7(9J;vnkzUX8I_$evOCpzgYburyumlXvfc~qrXOJ}d z?f)H!yr^~i7 zTAy#v(UFVkmp^B!_)Jvy&$GWqFKkDXy1Icsz;Xk*3trF?83N5zkxz-i4LKkDqXN}T z`+5JD%Dwgq+{G#43%5TQ56al!T1^^@8nSYsSZQyqie{8ZFl3IEUJ#80~d zwGK*|h?kkT)cc%cRGc`Ed+b-(2rX!37qhpGnY-fvQuZ;5xIk?8;$g??nGMke9HFQp z@G(?FPI#wDpg*VaowcU%Mz}VSpiZc{gyI^u6v07O>q_^Ff*egNMRk@oz?1xc+By$+ zw)-~hx74WJW$#hcrYN{VN3i`8JB5j~1y1LY_)pmAxCiHwfYzFdcG~ z+%nKucPLVh@zh(+o4i|9>Z$nY;pRZHF^NOR_XkeWWi-+U4xwk`9{!G$epmL-Tc6yn%bN=g^L!R~!?>+0A=BGL} zT!$>Gz@4{K^iDh=8A%NnC#Hl6X5(~y*4~Da1k-+P+FI~5mE1_rtLha+vBNq~5#RCK zpa-4u!rPgj8@{lHO3uBvXy}jgffehmGuto9KwWh&=Tt!hCeiXR_l+E6y#fA8h*kSJk;Z{p*Wgb;`cd z-4YCW^pYO7!5`xY`yRkc9F?@wV0rX++k~fco-VP!$H|Y`2B~E!uEvx4{3X_!85bFf z+Jeb+X(NB> zgtP2fh`P*EKH5zIS2-0H?f%G*k)w24l_fhjdx@rb%XeP!gyRSn-2%-bJ7UwVCy6|p z{h=o0VEJ9-N#fIlwK+RYuakFTiqd?D`UN;ci^!YrygK|(4e7-cM1EnqmvlhKtwX*b6mzt*3QBfm)fGr-Rv}st`p#yi;UgIL>&$ zsmM*)`-Sn?%_AbKmCjrVm=J85bBEeP9Kk*L+M`Se!HB7Y8ayih*k9e?C}jVsGVRaH zBFiikEzIwbCM(QH1I6~Wfi}Ud{;G2Ben<-@IiP@bKACHJ?YHwl0>|!S#pQN{8A`1x za-MDV@+WkaoyT&P^5R}#?Esdgq+RQqUUjwY_S^f^%aj2u*3=fcAZek~chtK}JFGA; zLloM3p9iLdu1T!#to|S$@Yy_1EI#Bt)2#C8Vg3i7rUO18sZBpd+1BAHl6U8t!LiqS zsajN*P+&~F;@y>+CC(isuO9>IO{YoM{x9r8d=@Gz zx2_Aj+oyl?Tl9Q)&@)Q!A*ELJiYyK_l=@Yn?CQ;lt5T2mMm*|1Qe7kuo>)i?3+L7s zR~xRTNw@d@&IlaUF)z)1Rs-%(lcZ1b$XRQ1D%IK0tD1Pc7AlKcq=J6J$?`behsG(G zS>r#viRZ=Ngswb9$U6D5t6tvnQ4Zfnhg?3diWlo_Nk;+Gy-Tz06Wg=WM{;!JHeAy=_4ox1_xgoVVy!3>k`-0OxD_9>DS^p&l%5+SLIO*;nPEpDwz;HM4_po{ZOdR58qn5LRk?8{xQ!L-FhPAy-{Nin?t1Uup8* zq#WhSFyZbFIo&Z72!!i>6)jzs$-`&cKg6&G_+)rgIVZvO(6X_TxzyfCQVi?Q8TbZ! zgEs<)3>U;|NCofXZY4F)(c4;6>DFu%i$H_@1gD1yWSXZ{aipjb8AI~&OQB>jH|Kj> z1D}syKIV9iSPy9=Wh;T0&kV@7MOtW{o-9jKhwGjsds@im&-#(gmY>El#N)>T7e7sBKH?|l_=XNCwyb(KC<2?y+@#J~ zXNyGTv&X*2C6piA18#bM5?}9pc{sn{uE8P5FZ-(364MGQpshe~h4F7yIir?EciU9Y z!HS!8)05SEy`6}_yuj96yeAuz?e?|h@GWK9+tc`j-)Vu-HP$!peRF@dj)rTVv(>TE z8arv`!kcBY#G)+$n(@JPSJX$%Tp1`I2}ACkG_FJsUx}~*YxvLSg z>n0E4&0wa`43JQFU^1K=xTn4WQf`*mmsr?eb!sI3X52z6bgFO=DYfP%j#P}(-XRTg z*C;7wf=OZM_-#&ET(SbYIPDeAIRi-%kro;`QjXf8)n@G9<~8OL?T=kFavy`|Q#lse z&w{tL=W!#PAiO}E(=ppfl$cG}hJ<6<)o?Ba96Z)17s~p8Zb<9NRPT*h%KNycTpRv`>SZx| zLa;$=`{jxQ(q8ldbmXE0;vX;4nosw;JNS*yNQ`>itKn=)aI3)<2ZC?!XVaAj0A;s3< z$&{Aj0=vpZ$(S%+X6Ts_jjK0q%YDF#eV9a#^+`%?FBwoUFmvv{ zy5X3eEIEceFLCs938J3{hzOCjJFFiw!f$V;W#o@&O|K-oVO9y}8^=Z*4H{CO%~H=w zT6vYTBBl8yDbQ5sFr54GZ|~)FmOQXbNHV`MiAq-u!bu#|#de8)5lUfk>kN+l~qbBti&H6eF@K{3^F*sJeMMj(nhD?c+_O5Cu zpLei5CqBMv73xRv4|VT?E)MN4Hz|HO=F{bPCWj9b452rx6n!u-Q)COPvBACsYPGS- z^ev0b*i}l$#qzPq-mfmj;uQyuEY0B-M@iZ=Ia{)c-PcGlnNY4Een2#wsZ|Al|5BJE z^ddv9Zlz^BZ|ARoZ&_hP_ZcE-t{=U4r=MF?fvLV4&a#Y%!NtoR({0<83B4B$*$~G^sXJ{&+*BsQIrJX_6Z*6u z94jxl%`6x{;9eu6AG<|M%5UN=G{jmFzyX(0C;{zt+d3 zHFGahNcFs(D>7!nh-cv2%kcz28^qUaJ{2X4yhut*-7TjxLoW_6BdhrK zbCr*&6tS9Rm)|AeERt^G9|KCP0m!KizfJu>ebiY_?v^USddLCcfhhI|6A_~1>HnCC z2XiKAcLNX!?Xp#N;0qB<|MzAuj*p;+&>06NS*Hic>e^47SLlvtxyzYE#A674>w$J? z<+dVlEiQ(($_Sb&<=SU8_vVIexZdKID}I;usx(~u3i#r)++}4{R(22-mi9Rzl0#42y07T)E-q=XfPmRE zRZiPn{>)a!y3;Sz{Tp^brSvs&YQ+HS5$LxgYu0%U!kBGU_lY6(=Jw1p@gw!?yCf2n zw)FkNE7s~lAI<);u41eOeWG8;dy}G0b5E`<3@wQvVne;tj2$l=5#K&c*cpBZ^U^V$ z1A>P1F|pas7J3qMATmXk)^vXN|7UgSbe607mR*vvP^wp%JXLFt1|qnru(Il-T#rEqPVvO(IJ!idI$s z&1GwolVktamT^BEK^+Y4gBQBr;lIeRotL17(92pYbBz-$s*F};Uj<1U-cxLm9KzkU zro^v&5mzgHBy(dCeA|g}oiK>X2@WPV$A^z|B4P$*?d@w4KM+E`Tv#2yjX|XLL4s#$ zj50|HP?6eOJ_t|sH;aIT$gKY_Ch|2%&l(dXOutv2?;Rr&Mm(7e# zTo`{|%!g7f()v*zO526|Crr2spR>ObxQGc8>i4BNNu#D1Tas&kmvOnc8R1B6J}R5i zcpr5%vH=&m+SgF}i6S{UVGcob3w4m~+iq8e87i`SJ)VaO?f;RheBR%M(!v@Bpb$Bk z!3EJ5Ji**BXF^RP{vd?$>X@rR38}gcUzZzR&z=9hkrQU^aLlJ?ZOC{A{=I9zwrA>V z5E1t?COM0BQO>70r;5a9x;IzRM^Oci%akPgwFqh0w52}H?+mus>Ro!6;^W3@_h4&| z_*)2T?cmd%7Dv(2P)NdLS~m_I1cRB|#?xxo5P5p1?IZ zfXXO?c<)Po#Vqw<=H~*3^hpJeGTj24`hLbm!A_wD?-aRs)c|Lq!V(z5$5fn(p!iw%DDB#}jFilO95Uo@O*4lK zb$7Du9|{=UUDiS@^=2uSay30=PB7eoOobM~on9DnUFkC%z}mPxwTR z9`}fm_Kpf%TK@@xP)M?Lv|hivYi!G`Hy~n;%`aMhsZ4e};Y{aoA4b9WeT*i_`wG0} zt>qyKQ%4!jF-t4kBs>`0sz6^_jb1l%@A1(5-vnj;vkLQ9mE&@;q3^-hZdGA#To`e z#7^*um+4q#_Ps6HdP37q2bLZY;B8L|gI<&;>FDi!)-7r7tBsbVt0s$x-169wL#;>Z8k8g$AKoB_HRk|7)RaO5A7x|QkLDoR!|;=$@#() zCp|@S!MJO3wDAu$B|;7ooJTxmx5(CB3CIx}_Uk1kVHpYi4W9U9n6$>Ernd~Bn^7&{ z^B8-tG!9M9gJZKQOoWwxIr*XB-M^wt9~LU~-g)JSvCB&VH&K?+Co$;&2U}gGIq~uz z55;s;ABL^Q6nwnnWcKBmM+`?i?r*7yOz*eyFF0iP&Pil{Oy?bK(A}|x@pDZ)eC+%Wu07Oj}6iipGg1eA$ob>bwp)LLBB2JZ1Q6$Hm4fYzQ2*L z(xUez`0Roe@@O&DmqC1+`zkdak6UG5k||Jj$MQl9KL?jADgPAcLNEBE-%>mYV3Kb(ruRWTmX@0VY~z<&`;-v)9RUS#Xbd7 zMyi>hFZs-7e>0xj2AJp)^_M{_XKJKSsPA9)EbgJkrr9EmNDj_fu?+;4FmN#l6LVhD z=e`2czoIQ--9Oxsho4wvvE+o9(m1R~zH*<+mpD?ff=1!-bd;8t*_!!=?s8(WzT^Sj zjP0C3(6=pg%Z{Re%tuda7^Kni>SE4>waw18q_U~J8#fl8$wZ*y?!%NX& zp{N#4`3!Y{Syar_hB(6oXr`;g;(AMg%g$O{{m{3M`z`EeUrMv86c`*vwkTYiYU%B& zOg_3FU8;5h81hG;ao6O;)RCGlU#^1BGq0w!M+NZgiOy{nD+7 zt|2A@)!&~{e`g7lC~&P+dYdlmiq#0EuYHNPKVN4Cdi5rP^8D`O#NKcZfYR$=d9Ke( z8obKwp;mo)mqnuRhnMD!z!EPxEL}$x=*PH0=gvMgN<^qGm|L!8{w+UTVF;w;F@vfd zX-)C7&&RgCZ#=qax88S&&1Gpl<`|mI$*-67*6)66kpeI~N|(1>ADr)MGMOFY+UU=d zK{w$!=DPhYM;iCsdf_rP;lGRV?anO2Z4O6^=5%Kw%T|Nt%Za|c*jRwSpwLm)tHkpp z-yoNqlOMA0!22fo=NDGsur35|XT3`xKn$A~cUIIgpq5r&C;2@Y)KFS^0b+W1Uxedt zD3>)Jx>;_9xZ6_e{UBxXmz?V?)Y*GZpYpZ#<2NMAExj*XvA}!UU6Z8P#$Pl#oI;|P z1%adu8|MPGK*{v2cOcD)N0IQnIQ(N1XRP_$AM^8qhAYjhy3v5k;c1TKV;#$dos%lM zHMojm#h*5=wzg6|BquT~ZYsM~J+ z`cBCLJQ78$84voCHpvj^B#(w24xQa&)0bQK=ojY@cev09b7(bG>#Q%mgtFLd_GR&c zg{$L6Du#7Uzkx8PK@eKr_PpG42q%PgeNMsf1a;UHFw`3-c9z`8g{lBEw!S?{8$hgG zn6l3YShf6lHbJPJ_6V21og;4wqzExLc+I{A|H*2eZ`pS8e1Gx$b-syx8TN%60e`pp(he;9RIXxU|2@2@=09*PMsxpuiG>hNgxZ znyFsW8Ss0*)woV3tf;#(pXWSBKV?NbLu8m;(|9tJ&^^` zl~f>=HgBd54o2MT2~8!hy=_|o%083(%-}e7EQef|IbJ9!;D?j=NBWJ6AQZH$kXa!q zohV+kA@|i?*PpdhJV!EhtnI55a;q0YA=C8xQQpV2>-iCr{UM<@EeYeJIKmR|9`_l^ z-mEjo#X3eZkufrNq>rQjXrl_3l8jO89l`B>3dj(&pH=T}5<^}n zxhNDSY;Lwc6)6T;KgBqsU;879+dWdI^bO68^5bTINhGxXth*ref)AvIv6P1# z+($xMAu;innST|AJcg4(+vn2 zVuT%**rEcfDrxU9TP*1>vInSRf9{hdbQ`zc33SR?W;H>clhwlM1-hOrv#lbYVk{jH zPaB&qPchRQ?17!-ZNwuDeJU#?TtbX5xv{Dme#WX>192Npyz`P4h6x z^9L~p^H#GLEy2mwgcV<#S?>D4vbtDEpMvW3T3@mgdjvxMb?sPb4 zL8PS>=;joc%+T>w>GmytuegL-Y=X4xuu4B=361uFAw{iKK9w=XO;>(Ub-$<`HoUfI zL{Vk@KLuqrNm3)mS)D1B@eAGq4+e4-{4E&rF3 z5Wqp8Vz*!Ce>P8h7^~_faGme--Lp?#K`y(FDpQ}4!OOKX!^?nw5z%G_od6V=V?F2ucDMM|<9TtxPRU zI_V&yh8D~f$wbj>^N7%;7pLeN7bnG;GLo&@61fv-1xZ4tnj~HEty#Y}On!ZAQ-&Cu zHRIg#Hj~)fmK_#FQbR}MnJC7+YiCNNYs)08*-rr@zzQw38codJ)D2hyKgF_e(f0ch=-#5(~LHv!}7&vo4Z79y2vw@B$pk>T2tG# zuR=(g$~~#8dZ|}tA6KTg34uPE8&Hhw`ou*pr{f0|$C{o1bX{zkjDiS1pmcMLS7`%Z=2~;(HnZl?JDToZD zc5(aHOof)%ArIZ! zGSFau$ALu#yr=ileb;h>D$6C>>q}r2@^G7I5-vKHznCd?kbRuRif!UwWcnPhbN+c- zWXyYZkE@LVw&Bl>zcUb->ib|j{UGX8x~RCBpIB(xNR%*OdM@T-9}12ek0SIxFo8jD z7J4IK7g1<^-Rwf;_(N@TJggpZq!(&9hf;Lu`ZKwlk>6g6O|OUfs4JqTr9AT_HY3<` zB*&gGXC)VqNd4P=P!q+kONb7~FZP@Y(0U!IDM1qvo>QR|He%5oba!daq2k>z<68@V z>kkRmH@7Q!F-9}G>P$%?c8(Ims)2a$ktNJ8v_l&+0}aq0DkXYRoG(NY;snQL1&3mg zlT=b!hsIBmEKF$5ive5}-&PrT^!^l9!=l!v^E-hedm2Mewxc#kZOhfE%b1SiTQ4-4 zJt9|`!gJ0R<8S4&s~+2RL;=b9I^>J_LBiY2j`-}BKC;DubA#$AoWG^g_Q_zK;z0-e z8Ws#Ce4G)ToBH8tUtN-%28(A#sj^cL561wEKmwKUyG^I&(QfNGL(sA8cMifo*V+OKj5HTwF!RaGJ@ClJ!&hziFD)EBSPhCd&30U9?PMa z{I{AM_Qgp8jguv)OUTSbBuB59Ktw?u&(`b@CE&7Jc@}@D@Xn-W!W5Me6W#Fi@~@k` zIOYtJGqcVD+p(tZv^5IT7*U{MB}ITOEbpsG{84+D)rYG$hGxT$Wdf_~Nkitu^Iyfb z{AXCoA!qq2r?tU%((7?{<1ptslr9VI6UqZ~O7dWCq;nSf|36Puno9z#5r5GNh~OjY zu3n}`lpEo>+rdexwSGq728L!iZU;p2R!{f?H#}p|%~S-1><)snfNeG8`SlF~8{A$x3 zeCzD+s-&$s&{4c!b!xKkM*eAup4o7nH^=bz=e%7{4zWP|egQPq+55t9MQf3D>dw{I z;DY4-qe9**o&leXhbfmu2_;>C0SD#Z{^+nW)ZHr{1S|(?cov~lk{}jtbfHfQGLL{< zYJz8-`oyF!z`ySx`WW2=6xQe7yef?mj0GS8QxT*;(&+}PPqOwPKB;F@u03>DC)6qEYPW#v{za3-HnQ85apAD)P2SZukIV;|USjU%;<#jqf{290@HS~vz<+_u1Ml!y&&yZC zot!9?^Ao87^6rs;JUP191FoK0R3F|gex}F$9$_nryQcw~zbysGd|}+aRF|8w!#3%C z-==0)dmYcDheAd2@wzdU?k$-eBuF$@$PUexY2M6;_Kb<}Hk*)e)ViHJpYre#_3GI} zg^r1u(ZNvO zlER~cpFP#mz>f_3=*mD1k$BCiUJ+&U6X^hA#Y-*vuCjeL>GikEjZU!4}DOf7{VwWl^5g`YWZn|wGFy4_v?|55h!wWqD_ zkEJi^E17)ZvEDk(O(U6sNfJ8Rkc=;t1Ui|s%d$1eua0~OXh}0fe8%Ms{XHxUTuaDfSEd8y;Qw*`J;c(ccjS z6pvYrCrPS^#a`xp$uHsNyJrU9;9uJ6GuDd*K^+!0k|nmmj_@{-WRV?6rFdBQ6x~fX z@@aaey+TDF6-2`3Z^7n=A=Dv6P=7un8T4BI7mq!?R?BFHZ_H&?J=Ae1Oi|gYJ7F=d z_1wg;)m#dZ@jBmxf#aAzc8Tr}PXPZ;J#e%^?*1+lYe^7Sx$Lp3m30!rXmh|f%;AIN zcDe#}cWA#E{o_@&H^3^ZQS=3jNQzp{8OV7^N|Nz|ibm9fNsaaFqU3YWI?A1PHRzfb zSuLQaje}dJOAe!5u5t#N??E_bNp8q3=S^v6Mpct*U-j$t#q=n5oF!vI+ILk#8@wUL?%B5_-^!8P$EH&GmaFnDS^6bI<*nC(L+frfzw$5E9<8N`31-Vr}#&<=kc%!+G^us<^Dvg z%E9o7A*6=+4PaR0XFJs2XSlrm{MDDk(o>@M~W?e_wziwDqj}823#Y#2@2^+vfl=EgJ`TCmV`|54=UynZr~F zSA-JiKG1)OTWTGNM4Budr{7Mkp_MYf1X9GI6tww}!viQT2Uk_4=us8WlEW=Hd%=wP zemqph_8XcUI9_2l#4%gR#_3cBOPJYT5LMasKf{0g7G&#o1NN#@Lhxsdlrwzk{*W(4 z%@TclCiv%VM4?fc<@5asn7sTjXa8uCiBdk-#qQD3QK2QO<2f*!gJIX}#5@xNgI^y7 zt}T{cAhi`AzWkl4Xlr6Wt!6`{;U|-h?A^nb@d{W{kEF zSbqtO-#p^mC(M6b@p4GR&kEtj*nO7*r@*|FYXRj=!^OsIQ9eZJW2px>dko-{=?y(4SwweQrPy_R#LYw{^Hz zKjOv3nJPTZD1^>Fk-WxRUMG{PgbEF_t|uBCp-+hyj{jC#>&R;BSo-(ET7&M#$B=_S zGsE3!<`Moi^R>H;}>6Ki&EdrdK#_TRXBXdF2M)-X9YAxCn%2Te_cG6OwndO zN1I7{(~&W9n~koS?2dXaBlr${M@Pt{6L^3Z+{aI5+!vkuePn5{bB@P!qD6scZS&D< zhNZiQyV~~t?ylrporwmY9ga#Fb_xCLrluypk)N-6KJ(X#nC@nME}^9N{F+Qgyf!$) zsmlnO2S8so#1<5kCDQMmiUE|nydI?1JWQnagoZW1>PwdEX(387rz2q_tv!lPlQrgL zLMTVA_)cEWSSederQ^$Wo2^j^yedDkx#8|owYhze%vr@FAZbioKL`hqz8C7f=LP;$ z1mIB1x}&HVb$qj26Jip$;q`32JsiiY!aFT`V2kFcvj|`ap=14j3Wz-7Sri|3y@4B9 z;)b_BDq3V0<}3;hcm?rc!!e}OlTRO8vDfk@&jR=={&Cb=jY$kw+*N{m+!^JcqUb`) z*m&ec0F|EMe5PKcPF|8m!z#^0Em1NHI{T=2z>{$~)u{N2_LwXx9GVp-)k32PiR`vS zC0sJ)aT(wzKMp>50B3$VE#$12D)t{Kd)pdPx%n^;l_tocew?7XD-Xg4PyBK{JKp?2 z+FB7#*NyY-LzCl$tEJ&Ml%%tU#W2WfJ&6kP>*Qu6c`?M|9Af&AOZANYd&x4JFk3Bu zm)cyyIJ!AgLy?2z7l(Rm0()<(rO13H4BXx9tMgoWUGhc^H#evjg2mCftsp<0fAF9X zf*_NzfXrLHr&cyL)(EyZ`Q zk!R?$hDVHc#m_9DbG4Y-Zm7~wPK9W5U{EA)`nk?_1;^VfSKRF>cg9!p=RX3s$MwSA z^U1ZgwqABG6;_@*m%=Fj=;s@0o&1A9K2z6uR$7&)*ZTw3BS%^EJjYRgUCr@p8u8(4 z3ozhzLD-AFS5I0BOkSG#EkLt1d=JZFyh+0{T&%2^L_t&Qwglq!;#*mLfoYQ_d2Mow zO8HRBvx0yJrx($TivgiticQ{Xu0Z|Wk5$Dh@&48Mu%zDr|Fm^lGw&TD8{F~IN|l() z(mDNS1Cg%N>RGqQBx#c>htEDXaCpYQSKL0ojTVQ<5i1(1qNf9X+Gb8 zo@3qW#=wWEtyO3Vw-;zk7G7a1Ww+NMwIg(CgGhbkMDcqLgt{ybZ9k}V1aUc1lodVU zXeTi-G1-8pZdy^z*hYY(?jL7D<5o+Vp#d!h&;ecyTX zN26#;g==Wuv0evIwBnjlxg~({9G~Sm`)t6-Vdh)Ve56-#8Sh@_PvqiRLH|K9Hv>I_ zE#9#C-U-bvR)&HGMT5Z6AkifW(yx-C?nbNMYr`#h#y#B-gh#s#q3P#_9#zLrKu~VH zO>NtN9@GL9W+MbTOtwN&zlJ4;no(j%vhPyH;*2uECimqkU)ei2+UVp)26-XaHSIL` z-)N$H1D34PZ=I`;_5sTVJ4OJ~HRHK2J-H19wiMJ9V*zqMaA{Rvh-{g!)5YB0zL?P+1f^<@dQukGo~rqER<&_BRYSLBzchx$q&eH~$bQjT zvYxS2qJG0_GRBQ;z=58^4QmJYi5k1!%bl?MW89~$Giyu5wYCyF0?XA#%xw7Jx#M4$=}n;)Eg1|5mZzO7BQOh*}&iwXlPiW({ps-p66Jsj1xEdj(m52J!$9+N=qi zK)GNf#{^S8^-S|0kOS-%7_H0Yb=L10IK6Q)e{^3@%QO6818=OLgRKK7h z@}$P?FCo9q3EL-rN4Bx4@K2=e`+NX_TQ)@BsAt-ogBw@pS;_1ciEX=KxVK?#PRlUs zHlE2Kt<=5GAoNP$wZ&R3tnIMI5>1i5J%5(8+E`**>sC7(rk$~=30$9&o=})bHECfQ zx(?|GD`rpCS?NTB-n1?INt`UkBVONg>k@T3M?Rw}8hwe}|SViTB68yNiv)Vo4JZuoEe+Z~m4qUkFN2gqf@EO4FhT`UtE037eog3wsFpI&aX`|Yu zx)VKPkJ4N$WgNK7c(CpNfSd<+#xGPpKCP78d}Omp6hu&SL{%s~%Zd{*VAQ6FOoDjV z7fdJMlFT$GU!>%8(VfjU-h-~2LyO}TV#1DJ=lGHLJ6i(NV=#)gH)=J#QJC~hkh9*B z%Nz4!jyk7Sek1J8*HNAd0i;RIG+^(YYn>7Xzz2gWNhq5qgBMklg9^^=5++b_{KMxufL~l zqDX?imjIm~9f)NzlAId=+qG91o&8_r8ob_zo}-E#&J#eM@<}O%T*Eh`<8>738V#xa zkKZG+N8yNlUVxIqYnDGRq&~%)%6MiQtX}F5rv+ET6b|1tYTP4E2(j4IZ2Y*@TF{q$ zbAxfCBURtQ$QIt@%?q1V-20C-DEWDhoU08I>2?Lzs(bh^8KjU7-1Ym>poYiVg@4(5 zB4#CqF8eP}lbNm~A zrjypp+?eJW!chw7D4EZ5GTdCTsntn@a{ZSh8+iVYsrKj_iscc3@jPrNo@YJLy9yFZf^4@{X#7=`Vr%|Q14t!uvK`*{EM(EEOpFdw2)Dt%2STcur zA$lHR{oqNuf_j|BM#GMmeg9SD86Oo22(lDXegqU+JO|myHuFb#HzTx!f$kq~Xc7%{tXX1*iYr4z+7%1F#C<>oMYn!=!82AQ{K~O<_1HI`^%@Jh zB!A5)K*U-C@_ofN=%$S*Uw~^JcdfE?P2EPZ@Js`92&!$8(%0(t8;BT)a%DUIjrQH- zEt1q9;E31+L>Vb%P*Xc0jPuABXs)k=-k~h+{ZF5(A5~3%GGC0_7)Thk3w{o;y<}|vj(VV|M5bR(yxQ%O^u2ypsBy)L&aSn2sIRl zVL1s>KvKJ-{yR79{W^qagD0uac$h#DagUfp`-wu%JqGBcVu(YZt`aC$*j>sBOy!vN zm`Y7xp@Ph-0iw!FgQUzBsJwEoiRW8>3&|joag~y95J-C4LSh-Fd$SQeblb0*F1VPq zOTgyX>EFjVC2%K!?)@!;cI1S3v|vqJf&OD);j^VD>?By5)~8z+U#42)oi8OeyKsYf z*0av3qbfM;M$DT9*5>$+j0`C)3J^D7!w*`sV&|;U13h}Cc%9>_)v^%~gfQk|e6$fZ zAV6z~!5TKPQ?T4y;ruS8T38SJA!Nz-L31WuU>9kd)bizE7_x|VM$l? zI(4CFgkb?jCa1(+#{MDe?|qmp@08@mAiPj*ciZc;B5<$s^K@5L3xBfh{C6y`GV0x% zT{wM(&(IL=deDhfNi`9+Tz_bS1s=5ku$_S!(F%kN#U=MMaVQQ^-GN+Fjc3Iq_Y|** zEKOl?R-ftz$tCI(A2pljWa+G==Ulk-EPP`2sWAH8Z}b?bF&`+?b*0SGh@KUh(Iz3R zF9M?6kF#N)iyJs2I^)q#epNS zhiFBF1wVBT>otM6iJ8ecEnSxrP61XlD~N8#Lge`!(73%%HxI%Bu9g0Whx#^$4|#l~ zrKnQ7dr~Go@!jqG3ygT{?XvBfN4pE?eQ{RUg~2H#LSb{R%|xqLlY?VZtep2-dnufz2&+@g zz3@C5Xg;}WLDQLsWCF5|gLbLxF=B9qb%+CAV+xw94$HSe5#wdNAxORMbf^SRf%*Wd zn`r$HL+`F>4LnJ^Df$+3@xRj~;9XOLI_~LWbOM=@1lX^9n-_{FdH%;S&Hz{jI$E{_APaI_ z+T;OAY(D^;jIxgpuumrhE9xCz5?Er>`hx*9p<3kzV;}7iSKmCuL;!0F0d_$NZ~Mf$ zYW}rCR{6&{Y&l$p0BoS!>O}CNa^R(@=yBg>kbq0+)w(kUvAM)P#U65tM+HwOL*#W<|u^2LT2?&Obw)mHs=#1K>Jziv=>L}hTa6Mzp#{H+z{y$htr z3^-E$EqP3QDY)}!PE>v6y>X_dFf%`hLtI|DW!BvPya}5Y)Wvk=%F57=uq``ACyhv> zr2oBWKgupZSMYwzs(QJFGe!nCeiL?UZY_VKL23CFfy>1PA+7I$Hn-UQZ;WPjbt&w9 z0BKBMcVF4EfuQuP7?+1KD}O~S2U#6CLOrLd8yx4ntKoy*;%*n4e2x-8suXui!05fz zh49yHjmtrtV8q|Nz=KXu#F{SD?IA>D>6e~0^SdalBA-k35b;ql&+`sHX!E0@M<|dY zmFV)@D^`0X7?IhxeJjt~PV{1v)eB_&q6FBERh8h45rGo}VG{lw5@Q#^+YK@8wO6Mo z!JuAY#P}@-g2LVycS`eHwav_+h+)?wAwd;W5YFzt{=HyaZeT>G7HjZbWP{q~!rrl} z^yeq$upxckXxW#~jMUw~hahcdRm^A%eOP z;qd9SdG`NrtdLzwQlb=~pF@=SoJpVReS(A~t3&ST;w|DV8;|POj;!ge`(XL9pp`&U za?w@WR@~CR!s@j^{`3*ileQ2d8`fU0CFC@4Ugw}9eE^-M3zh!}fQX{(LA1Mxz6La!si23^@h-jz}(6O6#;8 z&(Die?CGyu`#TlXeKJ2RPJYiK$^Sr0Ff(8ECVJ78vsy2}c}V2<%`Zz13rNnw@_e4Q z{z~0A@V!rBGuD3msmU4@Wmn~uYk;Bx^uTOU)eqrDff7~T(9OA#-e1rA?x^ad`dUO^ zts4vFJ?53Ds25eXeF;=oj}G*8I2*MR*fo?ZTIcI+OLipa_&YlI^?c6g>XDB0nV@9x zqw;B#H#Wm29CT0c)_Y+9T2jS?>Zg7BR=p@!=AY^7GnSlG0Ke*2VhB%JhQJ63f< z#Nfis)lje`NLh$x#p*yk+3FAaUMg5dP8aa90GHVC=6~%-4WX+X9c%401D?5ffLYP$fVrgZ=PM$cPZ~u1uj#%|uL&`@q2-!jm(VK=hzg2q12yBIxe%<_z9a0^5 zFI24MPv6s& zYZojI-uZe{4vZjdsYk{P4v}%CBSl{^0E4Im^~jA><*}ydRCS>^)*9A6mgz2IQoQl? zoW()>63P#1LKT^1hOrA=6Dh3#Ce%#Px~BoQXz31o6ftv} zv3m~NB{vgatQ`#|uh$gPIMzT7VY&oP?G*s7MXjV^@TOz?A&zBDad`=q^a)*nO-2_^YUALxSwd zM8{zX<1>)D$sn<$&}+*)0(+dv_7C8`UT^qp-|}`f2g&rt^o5sZ3=x%l!pa$LYXxqXGO2^+n|`fNI#-XVagrgA@ukM6 z=Qsq%OlZ(cQ)vIrWQ|#X!(9BVn2oHN#V`bM6JnLIF7|h(O|p(~ov)sY=?s_=JgRp~ z+_&OI$vwub+Pft5SU^yG$glDBSH{+soU9m2@s~d- z?Y1gcdC;HB%>ty-uhmm~+}Q4_iWRp71bIqcwfR%Yb^tc>fiRh09_Mkx#(WNECHK3? zJzgIZiur9#MJ0HyfG!_aG)8cyt>nwWJVP!ysmDoxZg1et?Y}{oQq>FhbKAA)eA_1T z_M!sE`R%^me{aB-gz$S+S8Ed31x7R#DSuJE*m>n(LaD|8|L+Yd$|JKJ>C@N<2j#DXUI0dvU`ztDb$5Hi%i1LMoE1TvC2 zwkN!X1^JIE1o=`0d1@7SJmN~qF6>d<2A@1lUvboUHURJ3C=2f1a3xb7G%n1kZb0by z^PjznrolDL;uvqZ525o|D1~k%gHc2*SVto1Yu?tM65pK}Eq_U1k2p-qovp=(yg^GP zuCsErp*3HBZoEP{yf>H7XjkK-40R;aY*6$}ZMD*3nrPjmdt}4v!M5JTy*M-4?R>+#9O~J`*1CuMV6!^W`Zur1&8ln#o)q66x-X^H3yKi= zIvhkZV(VzA;knOht$ce+#qJj>p}oQkgDcb>%gF5Coy9AZ%knH{bk)OTAPqnA`WqbN zhUER|d+YaEo*=2?+HfZ!lro_}M0Z8f$mpGVX5R%zIyWAQGOZI8nC5?<{<{m&Jn`J+ zjLfbl`BGi8!G>zjGrzLJ=I1u%&1Y;_x5~094=+%3NDW`MYV-OUxDxZiqtc{~{+h?) zW`jnJm7@YP*`qu^E4dIg_4dQYvZG7pP5g#A-)D6cy1IQMsdl~ ztPCV8HmVVSILG)so4HY+sz|<$;q1F%^;mulvUHUkQ5Lgh>gzP@Jny~5b)CQo^D*D7 z(is)5Q%NpI$Sk(|;q=^snL<_^6;G~Dm)GTv|ZkdRHzK^Uja|DIy-g( zn2j{B?-s6-oFUIWltqo6ye5MP$uf8AXdKO>9;~ezZo|MkfJkobbC6otfU;Nuk=J+h zl7I311as}60W(pzVsdyh3#W_V-HqX%OpDBq@}*M%I{)P!wW;;6Q(8G;%`rR18RdEd zM~=ysX&aK#i{>t}&T_ie3n@cx4*@B|E#b)ShO}Wm~&y4o`x0yD$Tt{d=8n<$5>r%~x@M_(m;~iY--m57?L5MofMEKfM zziEC`gT(M;N>I_xic(8EN^Xl{cFmD9g8P$px{tvdy`3jsbZ$<4dJQc_@mW9HpvIC- zN-?^4dzoXsMN5PJ5il*EPZ%mJFt4z1H=H>-9(4$~oS{*^%!H5|Jv{W?9nGXlt8%ua zG;zJvVP2b__0;_L&OwtuOlNw>e)w$O*zu$CI(>W?gw$gQY3LJB(HU|WfT(AOLJ>Ag zoQ2LvL-@3w^aF^Wv98?OP*R%D$v*P;d}ICV4&(F{1)39DqoS9DyC^zyb4a+X5ZdlOjSKB?r zSFIjyVozd%948)!+`LQqmf;hqmI$cz*?9hb?B_k44Hs;8S-2Ndp%{5^*Csn$M6Tuj zkk-irg4u7h!NZ)To2{wkyEnSl00}iqAIM#Noa0un^k&jlg=eZN%>Lo#gwFiRo%PeE zJ9roONf27^4i8}S&@w-IdK`U60SF8E{%sxQZ9ObVo>EpBM`aky?8>Wi3791!(T%skJNd;Uj%T42~c z=>r&8rdw)+DnSRM@4Qhvf>%5AnQct?Y?3mjy=En(g_CQXO3TC@oCIv=?0KH)?YM&F zZPZF*jylgCo2cVcxXl%#Y`WSU#CL77l}wJQ`&Ck?0BhTK^W|=(Lgd5gxes%R2U?C~ zw@tZ`?2I{^JM%3%E<1KTdX81QFYc!Pfq)2)auty1kzjKML_xC?S=e@z)nEg{7PlLn%B-c z+l<&fyQ54u8wnWxV4}X)A8wa)n6PSB#(|ab&p`mV`=k;vIt}Z|Yy2mJYTlxZ)xDlk zk(>>~FB))Vhjyc4XmQ!Et&DlC<0oY_4Y<$k7BVVx<>fS(=-rj@fu;Cpa(nel8vMeE zsl`_fzK3x47WZO9(wsOqIwZmDkUGlJI9NC1KV4igEIe)L^9$-xijcw3V%%eXT^?(2 zmLDA^Ix9>U?jfJY6O%54u-F&RuJZSu^{#T1Dv}BZO_wtJQ$;fnb_+)_ueu-1j5cIL zPx(3)e#Hx;{KCFDoemC!>pP6^sJkDiy>|4s_S4$<472>&C-xOzzF~~z#OAj6gRLr$ zbku*nC-gYde*S0LUd_{$9C3$6w~*{9nweATr#0nn?Eh(K9oqPKQ%tvRX`wx3knn{G zo1e}<^NUoPylpp9mCQCpkgf;C<0n;pQ>>LrFBz2*3oZjVlvb<5DvxC8>h+OL-p3v~ zOmrrz>(3ts(x!HD@XUuR1em2EQjxb1vs1BeN^gfdQv9Xm4t<{QNI+=)7bml01%jd>mZSM}VHyAMGmgEsMHS*qKf zh7u_)q?d5-3S*0EopNIjZQnFGK98bXJ8AH$J62BY)vYdVg5W+IOUH-D=YF*is=>xd zceL}yG(Sakto`IpZ@g2NK1ZKrfp#ZyC^ z@k~M7rUka^_;C(18Qvt@UmhYO;auy>YK%=OSckB}v^PZj-@kBtEB%UR-+>1Y^fsm{6LXj1w7$0gDJV6(U_*3z0YDw?}tI-qGB^YQpfnO2ttXYK^njhx1s!6ESQjr@Fd*Ov?*jrp#k8O5^cQqx`V zqDUKUeD%*%#*Gnf{dhlLYvyP)KYV{(9Ekeh;SkaE&fsMtR-BtVkxMF| zFOFQnU%f-&RFZ~!pZ=^Wj zKi5q6MjA|o;^zIFw!=`bw^Tz|oYR*KG-keUN%+sF<@G4oU)(2^WqYVf*ekW46l+a0 z69RlUFt`AEEy(|${^Rv}XZn{OnT)!X_4>T;1gp{z4R~;)%kokdugN})puWEUDphpU zeeddYIN*J5kZi1M;c%MQ&4y>>D?OeOalQB}Hry#a5k&mB;R^@J1;3nUcIi?gNO=Ev zn}2PP${p4lw_?NTr5|mI6KIDaAy?sJ{K8Uymj5iH{GGSP&Z^qUz)8Ty@wA2~HA*d) z2Le;~Y^hp1Ek`bQrg9=(`2$YY707xH>vXtDo>3YA!}S&V*J7`6yGk9g{%ZIzzW&ez zy6ZX$pwBanel=_nE^WA3ca96~B>YO~(EzpJ)$QZcgu8g-)zzdITX0`DmF#*|_^XDi z&3#M!c8f5qy{UsqwY}yoV4kSoYFWOC6V8WDJmlB$qbkr&7Yu-gI6J(p!FXeuB*RD8|+sH|4BcYEpw= zhEVl8y2aH@+Xf7O7pAaR|xPnEVEa%%`lYI{`%+6tSfDSE)q{pHiq-pHYHpr(X z84ccyxEyMdJ^0ur7U@=uC?{QCz=>kh=iS{dtl&@(oAqMm<&Cp_@&2+6OOjBN`iF6d zub9{WE^>ci^>rK2Jh*!scqig<@b}Om^U0r91=X;hHug<>34Qe%rO1(qYUs}XZ==mx z5ESaUjh~VA>=IAZG4mgPXE1|sThqYJTHx0@G*V+vCh`x&Y`(=DA>xku1m=~G(C46-zlVp4xWs$BYtJSG@=6O9c^cy*dVEqkvDl`fYvx6F=Gp4(MVq*cca&}1i^__V z{pO!p+Up_@7)5cyQ7eK+oGCr5;l}{0#BB%Y7N(4{ERn%jX*vvRG|+PLpBkPyS)%6? zpcR(%#c(Bk)>hmdoO(%M)4wVmGK-(u?FIXk>=D?Yk}Z{E)3IWK;?T(olMXUUFKJX6 zFN}IL{aU2ZMh^|QQEl)CU=LCGDiS*nriC8{xXtS9E)M3NKnSr49b8ukDiS7Y9Ol)i zzA0asbrN>0YQshvZ0_nAplL9E;yoU+Xn0zEkZ~$=FtcBmAHZy$$S={Td`pii0O_#~ z$r4RI(oBrGow`U{Q-i)(fW47X{pC|$p!)z6RDe=$o0NfjSCM)bs01VZADDKvD4!HN zR);x7wJ87S_AniR^ z7VA^MFRo=YygX4Q8AefQ`$3r_wAecu13j1!timmc=s(&!ym z|84(PuM;)z;CT1Dx7nX8R+qQn+{k%&M@g@+$;w9?>0BlnKUo4PguLKFu?R54d=nE+ zNI%fe@FyK<)Efj;e=DoJiNqRS0DHWIIM4d<`K2jf7G0-$1IF(d6wBDHJhM&wbnW2P zJ>c_2-0_85SUBj(DWs%T2#EtO)sEP31-goE1jfu~bu%%tW~T zu=!-XzQfdkY$M>fKuHpgBz0HyXXzDTlAOCoZKwsw)?L-NI6@ToR+E>CRu-q&Pn_Bn zKoJ3mDsNyXIv-Qg!CyX5dZfKCRiX|$($7yzK_{4=X3l6i+t0SH5Zk zBb%t<&yK)It}hsN%cNK&DwwHyC^}=@WB`CJqGMe>aw~y^9+^S&H2P4h`Fp1+7Y@HV zSIMMAN~^q@U+hTUO^u=ytw10yDo@v-sh4^@rI zD9v8pjrd;eFOJ5j5^o@%nJb|ac?GD?6Sdr~9_d%!_rXoV&rZ5Z!Ey8rRbz&bXIK25(89G^VQB(yf5XA2Ayi3*vIWScm^D@&tu(&zLZpxn zjB`ycx>U)p^z&eDedzdJQz46Vuu{zfROOesRgar9zBJE?RQFL`d}S9lGory!R&+FS zxvO0{D&0y?$EoP+>;I36MPiB>6*#rclxMDAW{tuxdG{LZ#w9sYJ-RBsDzu{Z9%;?x zCXsXw+Eiq7)#F&^QHX3v&w5<9il!+1{WpW3+^XFfe#eHzQ>eJn1z!z14MHye1DMbW zjdjjX4cZBA1DvW~Bu-#%?TCa6D%LBC1iQ+psp834)|zH(U(Rr~gzqjZhMzeVIPRiQ zZT!7qFtDktU~#cW(B{fa_$#lNmG{{%p4QKWZahvDfrQ@axH6ibGB0JIXBwzG7Vux= zL93i%gil+Dt+XL_&ROF1q!vPE{pUcu60Fhh6fZhcchE}GDXjN8=vJ^l_C20hRLiw@ zdWrUr^%{*t+Jb~ zxZS7Y&S|wO8xB`mEkWBv(^V6l)&qL=R0RB+;Lc-&rOcm4D+@zSd}kWmd!mz9W6g6z zHG3>0>7Qw5AogHRdI)w*rfx`7uOH`=B8nSYnzVD%_t+0VZ#`y}t(vQs%7MR-yqH>c zHDC3Y=dH#}SPozJbZX1u%D9o|ovd+(eABH3DGAHM@);SEqa7Pv#^F-Drx*GpI=0>2 zdyI>%Wr79%c}H?nE(U7Jnx$^{{Mdg@y3-_SwSHT;A{NPotP;2P>&xaK#>jpPcxo`; z9@Hc4S2g;cyNbp%ieo~&UtQ_d-Az_x1lXa`$;aX#cXR?T8OK`fIQLFv*f;>V$8L$Xro=m+t6jax?|VyLq;LNGV$d+ms`I_==w!h zv%hkmB3;#x9A2XErj=W$Viu`>PnxMR$78lnE5Q5Zi-NMCVfRym5m|oE?Y)kOu{R5SxWV#^wt4VUIE>UKQOnutnGAbD#Wzc=tNBy0QxLO@!P+Dneb03B8 z(sbmGteilSJx=S^oD&EcP40UMkjb%;>NiMNamV}8cyuQ$qk)HqrR^#&*{EfWOtu=g z$g#iP{us(o<>-k#ZufOBNi*wHzSY10a}lDc8%e2&ba;+!jou8lh8j{WdHQ%XwD`^| zU;hq~OJ-#%UIxrP*@R2>Ih(ihHN6J}WX^HI7eahH{u*ulQu(4K>YLhT1Ald6fNh_j zeHHZk%w0dDne(VsN?XcK${w&md*IG1EuLl|0Gz!Hr7tg<|7a~12;3eoP7Lqif7r)j(B!nE-Oc5jA&?u$}+y_a~}zvj&?=j z|5&-xAZMfM`Mx8mqt`6yT0Zz~y`x~YoAq9@qJsWav9-~NEhk?4Dd~f!N5b=n*b8dA zLkBxYmU4%mUEiH^m!I$N7+QLA=)13^tuiVAR9%Y8RL7Ns82Kd0ij+C9HeGEh6Xcgyd*#sj$3=*xvmZnVGR3svf^ z$*ayksXkZW8+7pGt99?L2xz%6XT>`_Vm%mhTSY+s-A>LQn0c~WT^isznfUFoPHDd; zWLykaZTeTg=h!FaO_9;*S?5JGRb?DEC&B?eYC_>tYF81`Nx^h0-A`{PZze_!;E@Sc zo~!l#%Vl>qg#8GyxsS)wI^6nSU)~t>`J~+6YN>tn<;Ww^LG=cIb^Ox&_M$H#78Ayv$;y9O?Mxy$=Grfs^**(ZTNs2Q zpFBX_H*{o9J6(Z9>kkL~g7P@z`#<2hbLc5c?dbBPA*4a`bxZ}9ZC5ghGA?8O6OO15Ni?@e|6>fYWA2*jXrl}w&C#pp4oT8&6o zR$l%EAzRtZa=G5ijow&5zb$$P4AtuR__C%~;a&ZM?F&}_<q+|N*u-lx2g6*x|8 z`}dZ4vDkDdd%G5M>I^CIcDj~;(sxexWLKyb70hJsBH!1L3^p`H&&a6UV=lF$(W18x zrr3*)8N$2TSG3X@{OOZW@JW_KJn6y{8R4tt|>@@ugpu%>qE^_H`rR85x^1EvP#milUpth1IC+qt* z?LLa9cXES3?^bxal>e!ZZsK?UB8u!LUMDEVtweG{BlRP{gyk%uH%e>CJ@HgqL=I#5 zT0*QNM^eG1Updy|9LX7fCHR;>whv(DZ~f3@C40-^qj}YQ^i1`h&;>E=_Kz4-ato5H z`VrUbJ&fyoS>-XLNu?v{g~0kyx!wFW>COK%)`pF@jnA5h=rERU^vunkJ__m&Wp>Z_ z7Te+^RZ*bZmQm`?jene3Gv6-z0QeiG$K0_udAWyrajz-X{_#*(A|q1vvuPU^y!9w; zsHBwJmq_R|`04C%Lade$D)F~qYE_#J`gvlf9Y~vTQ$E;%`|5A`nY~X}?*PMf(PL?~ z1PpGQJK8;pNB!^;GRkI~DW#%eUfzBC^u_E~m6WuUT*AylZ)Atz;mqyRE4tu{xjYdKS$HqC-)hnu!ZUpe^ z$M4!TY7A~q%+Eu{JTg}-d(vgPa(Xw!-GM3>g=c}5Ca$U>x*xmddp(L8TIBGB8WhgW zte{@TrKV7=CdBTGqc>~1az*uJKzr@3r*Na6u;CO)Q>dE5w=yzxJKo z*j)cH*;Grsx#U(pI^b8p&RUZtVt%ni)fZ^l218>|0x!_XZX6;9sAhkh)-S({aKM%Nw2Ipa<P@xfzSN8o_(z2(^`=kKApnr@qhp%#j5R7t|a!Zg&8;uHKDBV3{OyG0HSq$TIzSkd*ONh z#LX8d9yQD|Z2Qt-oU%B~!P_H-FwrSKSNmUiuPRV($`WVCwNOo?{^d!-z25z#fs2QC z(i-Px3KX|3pj)4?!`A?{-;#y`P6wMPy4ejjU+Zvnpn{1d>8^x;ewf#bYA1!k+M zCSG1+W#cuM`9bbG4HaBg&g#w^TRG>4Flqu%q2MRrp@Ei~W3!PLc|?4hdR(;v<%_lt z4H*A!0$XIo#LmmIbo}2r5m0KQ(qGHrT{E@KT0Wl@t~UkKtYrf^KPj-@d{_#L%-#iIcu^J>+kg6r9z5HvJow{)2L|`bB z+nM=8K;VamdEwYQ@K|n*b0TD77+xpt4U#yy@3cIsqwxfG#CH2S5oRxQO!y}ZPb^w^p+C7J>_}G;TG2s z@{V{DV>IlR}Vd-eSH`tzBxz%PYIg#N4?tNO@NYa=TKlp*kNe}oH+*mjEM1q54-T0Eb_q?Y)|{5O z)RW$%8zvQD`WmWNX@3uWx8~8Cj?XZ*@_1%ARV8x`vV@%^<}e((34#$Ae z_L-P7j?`m3+ud^C4w&u?mmdqmtcZqc%3LxwfOg$y;*!ai#;L=*qDW-vH}4 ze;da1OG0Fr)^-Z+uoU!D1kYE4C3MYEn%(yMzq$GVc+a$0Sm?H9!O=}T&{ za>%IYygO1+uJOAb^}6?sChx)5w`Z>3amy1}&VpOIQ?Jur zU@*#C^~~RCUrqaWCSo_5{+6>+tSF7y9CHpkdC+@J&284*5}1B==t*y=4Rchi#QQ|Z zY~WH|TNShS&E2JI*-JL^1DYP=dmsywAjST#}c^N8;Mr>a~!NN8J8_!72c~2P<#LGxG2Znwn*D@;C+p7 z#?6g~hI=-Jv`|l5qI6@a{%VHF6Gk{Zd}#n!PfTa< zpucLE<{z+_2ibd#mM zr3uN{N;jF^y?Cds=CJ!@B(^fyNE7a$dBJ&g-ZZX}F z8Y{NHGjh+V*FLP8OZ7@`3%0Zlb64@#Q;mUK=fB3gBkyqAC``_;m|OSgOhu^7^3|Oy zmb`Dud6C_EeCJaR}eKR>lJzpf?k!uMZQ;s!ZOA`BK+x-blxX^IZql z%~`pWrQ5c5Ra)Ly+@H{xPal+BEMtI=_CczH@DcqbUdPx1!TJfMO)JUg$T+6Rj?=hA z$E%jVc6XT^BGeei>+h|5R*l2m0c)Gr%}eFBKJ`<1=WaP`ZA-c4c`XW-!P(Or;5Rhy z><5L|mgNnZe0e=+^`hKI;)oY;+lNC0_Ex0XpYg~)5)r6zFL4{l`pc|LK?RVKD-Pb0 zshH48lyM}@R5otEs^*@WDOpq7eT05_^4JDpu!z$3zc3!H&)hWV?db%BO$%D%0^Quid zb?y=Re^h;WI8^T&ccu82n97>9NGc+c-ApCfpdtL7zb6w}0=gjBa=RWuId_K>8p65AQY@|%6+o+u8`iLrO zfG6-(c9`72Gm$ot)BY=hs3=jQ8bvVRygX&172Ww=)hSqpbRt zGcQVL+z#i5{`vh;%JE_JbLs^OU2N|OXsa}D}n7VIM_rB;lBRYn^=?1o1Kq)E^xF(lJD>h zH_NxB&a1!YK^NT3lVDECH&{#n-nyPaFA}u(Cx=%X&olD8Gxa+q8!f^xM^hy0apckm z6Hn ze7|9V%WY6} zuV3w98E;ik4A}vytGd6#zZ?(W%Al6X1pJ7`;;JqwGR^~m+*U8E=DpmdIANz0R8EYC zy_Q^+?&OqTJ|<>ymjk4r`@*WnK$ zSLvBIf!8eBy^bHrRt+b2Q&s43`T3Avjl`y>A=O!aI=G*ysrvo#+0tr-;i8U%y0KQC zVK)a)HU0t|oeL|p?FolJSPWJ>T|Th(e)yoZhZo1>5n=I z7CXFcc$Yk?Mec!_CMk;XEn$GXv>-NdOUKU~*#@+C21SBkpNWd&u-7pB->K|fS`!v1 zNc_&^+LiaTQ<_?7Us6SoI{v^$V5ScP*u4!mSaYy8(UR@WaA ze0WJX7fe2GR={S0`Y0GHTclwAvJ@RSe2#d-s`^F=)E9WA{+9JGW{Z$;K&;I#v**e0{szjOXza@7}L_Q_(ct}hLVw?GTlq?r79efiM50~`! zY6(%E4EFfkc%HNYljDJ%GMVbCmDU1@6alm-(dxnrlaY-dSJLJS;sGs@&DA5!U&R zONiH@?F=2NfRN&Uuj^)(yQOaDZE0%VJP0@e5E*=p5+>RPx@qoLWp-W{)B9-ETyDMf zRPEN{Jn5IN^^zp2F(va`>hnz%h-s zQmX9U=ZZKm6ckr$nC0jbi43!QlPU1Kj7#CZ>ubY72k<8-bUo6l>^v&Ya=~yn_IgZO zj6Hsk)3Wc1-@M`e_mel#}~krjOYpN zF!9=d;k72Tl#20ihY9`w^3Z;7zi)!9f=RZRb&IW~L(IE1VTJt9Gd<529~hTNfnY0x zZm=oo7Jy}Qjzg%6P>76q9WR?-$&9hT^~p@vKgrr)dmR7tZQumMMiM_5qCEKaE8w4e z{VE9@QI5;YcQ@R26}#OWza`24>-yWK=a|ZM9m{79l-fKo!SyvHb4SS6YibC9`dUxEKQ)quUY1%Dk1WkjqD~lW zUXzM9pj`ldw`SymiQF7m_b7^juS^T4_;=0GE0e!YQBI;C$i>MiB(e7^SAd#_eR}fu z7&+!8H)3;ogKH{mvG4XtBZZSqx@w z1cTq(0y|D)j~Qs(eg#+*hAPubQ9! zioSmISaL}kC?%gi)1!gi2H-6tYL#7<-_Y20at(TnKHus3pxNU$f&4Ua&N^)>_OdrG z&=%4rbIN+$Ip6}SQtgD!|9 z+{55InjIF;dtU5U4L&`cRWd%eRaf<0U{(o#6x*eo*&AjR_cjOAq)X~wzAdMD1v2qL zeZOU{V6GNKi?B}b8sEl!=-=@pw{SErNBWn%LvEn=uEXMc5|(OD5d#)40`Vu4L}Fvq z$p3~7=gb217 z+lE~imB0TMnNaQGVT{1r_-=)UaE}K^@+7C@-d5xJym@-xJ@wx=7>gq?ELQ>S+S2ZZPwmT)6U7RJm^>&kOw{Yg|^}^&ws@o0~hkUk?wye?f zEy7Gk(QZUwPgkwM*2S@rBB#C@UBAJ|JEthet=rC(u^Y6zv$0fQ23d9eu5iFeTFKkx zfa+RcyFr`4+jO_#1BvZKOxJKWm#Kd1##A{KdKvfhcbsDEMO8<#QvWg*uXZah?Cbz0 zao{WX72DB2aH&c5tU-=%;zLQQPI{;aRF_uyXG1ONCdlH-L}X1D=9z;ZY&MmsVZ3S9 z%;?KB9$UW*s8j8D`KFdj>$5?d3(b^K<T#c zQ;WFJf8hTHQ}OiAq9LkPnSA3&ka*2gD&O@S;e^#U1+o+?FOHQh3>~z|9p#BU ze4?DgS!O%It9zcK067duQMqOEKwy<jctOwTUU-asvd}84D|UikBtAA6h#V_PF6_GL4AdACI1>^D%^|{ z{W*$WGApME_VeNufJs*6@PI&l4gWU2{tka-gKdgd#3DIuM@)TPvQZ-Jyw`Q*R{plL zJLHqd_^_G|l>+SNu;v)clbW7+JlF@^PwF0M@(k-ZG-%vA>wY`TR_@+zi?|L!OaTBQ z|H=H+XtphxW?M9LA)R*GTF;_2hl{E{UNkZE2a=XwxrPfGRUGnnD+(ApPOv-;yC6We zR{u2@b>|i-`>8@xMT!uO8wgC_Xo}J7=LLC3IT#FN13vn0S3XmJ_&H?wSF{ZEYM1@Y zME~cQJ*iqb{iEciSl}`=y~H--KK7l!k)*i#ck(B{Gyd$F79#xB+H4l*RrU?-V$slX zX#pn8mS7mzg(n#{LjYRIY5u@jhi-^B6HYME{vPI~{TzXT^rI>~*}VuMfZ6jFLF z1xKh|3C$-2v9$Uhifx{tw{Y2G*)v%b$y(J&Ny37K5rHNQpOqGg#6Pgk>V&`~lls=B z*CE1}6!*S?NDEiE%c5QhvfY=)D1YBhU$L0}k)9z^T|3dcSY7tL9^YGPNGeg}r&u2>YU4f$-JcfYC8q5hE6Ii^e&qz-gEqMb`a zDRaA1c!W-0T`ixnm42-tFMskXYh6Jyk;%0fH_O&ofJuWiHw ziG+Cc!_c|xJgN9;3l3PQFcfgLLc=>lK<0X+*S`fYw8|ZejT#xF$N4nWy(;T?>q(%F z7{Gt=dELV&S2c9DpW~FLcs^kUWfQ&Jqg$`7gnVq3Kt7n6MpACKKb;U1Y1ePNHJB_*rIm2ds z8@nHVA})~|+-+|R(`8CitU=JdS516L0C87Nde8ns_Qqjg$9ErM@NILUE$YhQO+2pU z1PpZ)R@&D$ER;3jb);UOqc8ndx~aA)e=9xh_9tWrC;u@$hBu8?Sg0!(%+#TlO!|G7 zOUKH|#^*EFO;8N})u1qIzwP2LKuyp-y%H1M;Iup%hFtGtD@n0{t_xe~eZ^7_?nAF7 z#BXs@ygXsqfh+i=6K|#myy*7yMjkiQtl(<@;JrBQ*P4@ zw$vRMcCm!8QETbx&CF;A z)ukP>XHeEgMn{@lKC5KLgwsFIK{IKr-@OB-wvdv!@U!p?GOpV{R55dDVE>a!rN250 z!9jJHNPl@Wbe+b_TD}bzw2Y4bdB(%dpISYE>QHGQ#MGg4hy2@pl~D^($QuL|t0lha zX>w>kUjAAqq%ILHiwIU>ESH=>ZA^jNNh-)z2eJhZBFClSHOP*98rW(8?O?UBto+$U z)`_TTX&$R?@EPW*;~H7T|1$in6-B2@Ct})3Co?DNOdAt2$J+(IC-E{~Vn@D=ZTK<0 zmkD7^*k!QjQ(s@`-XXUxaFb3K)>~EVHnfcMQvJmtUa3I0f0V_z!H^MY(ku-irarlq zk9r=wHkU7d;}v}nbq!<&do=}L$lFHyeV5;F4;ukOzq^CyOjd43^~8X&PMG(&Xjb&C!(sTip6X9j{2{cYML8a43YYCK{1V2V^ z8qurtF=Y}$il@H`q*k~ia|Zeg3rYODx-XE##VAUl>><0X)#}^l9|>zD zd;1jAq{^1picvR**ZC{>eXE4yT>+h~)qJn%1NCRr{@5!VS>nVQ4=<}|SuRZMwZx=b z6*-hi+}k-!u_KA^)afJNW?TOwEiMuc?H0e5{W2IbHEz|2L)jjR0TJ5_YT-V!A?Af9 zR+GcIF-xw9%}Q)Gadohu=>5pt$uG=*CFzR+qiMUiq_Y0ygAZ$(0;07`_>e=9()U)6 z1j#zPk3EsKXF;W`iMKlrNU=s26r%ypfMMO4!ZD&CUu=fama^-F>5CpSnVSY;_?wh8 zvy!Z*3~%V|$<`Iw_2JYz@GfrZuy;3wxLoG7Wzema#%iirP-9pnFw#13nE{ItLC%Lg zltVK~l8~OW3K-7rcwLwhQnC9$rYlR%AR}umr6Bzj+}vyG#7FhNP)Ed}zeu3}ixj|g z-lZ6)y*~u`H*EG%4xgTNfbNCDT^M=fqqRDrJugRGeXVBds;pe(Ah?#eO%}`JG`d1CQ?Wvb>k4{4xQ7^B8u}AY|urDvh8ws6Sx^5cQ2LrKb5Ey<; zQbim^_jLj4sfjYjsNyAcYn`&!hSLOI5}FSjkT&3LCW=WeQ4OH)s&vY4wTiUnr8%C|3X58KOf!!KbCANp6N!kz% z#1n!k^jhj0Df>iRRi7WN?n&#I){}>Qo7eb;V|s%YyJ7@ZljNjTzTYvw5&3Ax|LbR* z<&fJ&%NJqTWN@lmZJ^)g=$bFBoK~@-(QTg+n-u8Kc%$2oxE?!96wOOrdfw?LFR&tT z$TQCRDXNWASYw=c_Y(DpUDF5eZ_EPYEt!dwKKkJZibBHvjGpnM#&WDTIVjqfWw@&R z;rSaIU_|x+(kk;wzkp?5FtAvS85?*A9=mYgUJnZOWLDl88fPt0-oo}PMtF#ih-2H@LNRvx%7OS)9En(>=fK^gX( zM3B}hFl)Ge4jhF-)tj8oT{a#Ei%oCYMzWiV;K6w@Gfl(pDCxFg&OqUuOv6!5}OBJRel|nSbprQFH}J`5TD` zYj@VhvJzp+$iJ4;i7R2NTm3H4nt`-tj_6O8P}7Qoo~vGszcir@(tpj*dcvw6-n!Yy zy7W_8sTMo~IU>L4PIW6ZR@DA~H3X7g3IfA+I)kP;r+*S>EZPGTr5*kh=I^mU#OdGf zGg-Clz#ysOt8RroJ~iX<|Ek$Y)c>=l8*#8=WF+jpM5iLG>WeQ3Tf#>-*2FDt+`GnR z7_l~N|4Pp&ix$#Se_B59`?Ji)OKZ!0_d&BBxp)-z;E?~%3nfd;ltT#zLi~K(3La)D zPs4cPp73UB3jN2VjRFnSySBp%|Bs}ETuVzVv|ERySWthrM)4=}lK{xZAbot%H^eh9~t7r3Y@9}QX(o+HO^Xx$&a!(3EV`dj8~YtCUB zJ%atSAj~3p|GX{LDzU0aO4eh1N0w%36V^KlJcc+uN0uJ;IyHO;p+;eiqcC*Jv{#$S ziXgtcie#yVuHPW1x?K}{deVFp^3RcUT}QQu!$j%7%x@dOc*&LcMT9f!UkqJ(`mI3) zYc)ow3gbGO<1_vy(gVp78mtV@CMeHE6XQ|FVCfMsh zifBz^cI_i}1|N(cCAG^3h#!uujxggy`tQ3E5bo?xYuk*Ei7a#2^h$9(@U^ga1e3yt}_Ei;i?$E2J@~xeE-`2o{^PL z{r#FM=UrQRAANj=kvFR()+)(A%ZE0$+`ec>|auF_IoIx(l zr+2{jrdQ6aZ@qX1$g3&UJA4~1h=X|cELT_a(Tt7o(|f1#`8^X4r=Q7z6ZR~Q*Eb!) zHo!De1g|H9&S@o0?ECQs0dRTPgfnGL=AB4EmuJ@b-5Vt;cD~mVo-taf@juVi4;xAnG11Ll#{Ckyo5PGSLlR~06s zl>%d_=wV8!dIHB!U{QQ4kq@oAPW9tWjbz*;?}U_Vp;HP9okvt_kj(&$88B;giSe!F z2JkDs(f>1ubR(#aiO_p&9A}`Hyk6g`3DLamdGJ>Ao|eku+>6oRM)P3v@phAxLSi}b z7ts^`r@L?5T08*0>JvBqG*4Hph|*M(9Bab=L&S`HZ&dbLEs(Mr#&B7-PwJmD@5GeO z`1nF6y=Tx_^lO z1(;^Bd|j5A_+q>yqT9cl`u-Wy0o4jQ@mEBW zdf85)C$moJOjiP-tC9H$s|@i)#!g`%*je@SSz@d=?w|`cOfMJ;jr6g1gTFA6iD23u zcc2iIVm}2MIcwhZFM2cesagqUc(i+MM}^vj@S3XxaZb6`{@P58q3t^Lc5og_&(Ygs z3icEW7Ge@`YC!XAh1)9FdaXP4|DbQiKCcu%M=UUZPK)1+*^tGl9HnAX_7E1iVD2o^ z*oI66V^`)s+={EDd>qIT{Qv(5@$)#qPz| z1Ga^p{E}9tZ%0eQfHZkzZ5jzFXoauMM>FP6O&?X!qTLSP0isJ(2DytbFNA!f-dMN3 zVh%EEDs}en#%}NUGeAsI8e%~b){G^h3rUO^QY6@1Rhba?3S37q*gRz5`!lQ8K#jKU zF?JKIb#Snx?ZrmG9MeSpaj1X`kV@&-A|yu7LT0Nyvg{`OatMrBCXPdFmOdAxf?SP3 zDIfhr*2B6Y^-3*ksD_c&XQ0T&k|j>SY`GniJduQ0L({tq=p-cNfHiCXcL9SFeb^74 zI26B{g`GAgHf5rj37d`i2#S0kbF9}#-fADo44X{@9gGTq$(=6u86gn$sx_@7kr^%2 zs!EHsc;l*17Ikt^5@u|LHyP-U9)!$@lgQiRzjr1PYg+PJcw#B^k&?Bu5Pdzct<=sPjU-4%nEIQnWfI^eld@YM&QAdi0F;6&1Snx7|O*#W7xoo-S+q`oK} zqjI>#0|Qb=BM)VvSPk?ls5T9s-_eW!C zW0A3Z0r^oIWx5%O;B z`o(d3)LX`QzP*e)I9I;HkG)o#N{B-1DMy6>=Z&n24KA4we2Gp_erJJ@5J({$&jzob z9CV!iF&SUjPpbC5N3JJlA#q2L8an>1u-oYP#~9a1PipA2pX+oLrHaeKcg~l(qwDKd z<1_qL*A0tUjxM(Fn`m2kW_H~&(2x$|MI>$R4XikU7X~RioKP`0^~|uW zy4;hESkzBPn$vXFQQ-mZrBUO}acm%X9kOMQ7FCD7TVVXQIu!X3 zCKMo%x;v{sU7aTe8yy+3jp17@4v=une}&n0l@aS-7@Vo#ezb>q*~H`f!P; zMFb$0G}^@EA!9xTHaVs?p$oXsZ)A7AaI5#k%Vpdev8{0=@Slp@+^fSe&{#s zfkZBF=nZI;{d5%DNB1{$k~FlZaRg{AD`Ozqh?-ZSR=kRFB1#w$M0Pne4b)rhK0rc^ zjiA=c)VB_IUp#lV9syTcfq#ykEOO0MzD_fqXmx*@E&Hi7)ye2fd)^WQ7r4fF1Db^F zqDgCh=3$;oKi6~=sXH(~Ydh9aR#R_=uzu;!@18YR8W^wNAJl~W_fVvS2+yv<<9diW zDx(2`H`Y{!Qzs#J`ADa@n6uUa*2{!FDlw-PIzp7dn7jg;S@{0X2dk@;I4o$7`Y!@9 zLVXx2ZX_7zvWJtR>)gRfC5RbX*M8TS)BE#B=FHN37wmD5ZI4~(5cDYF0ftVWj9k-& zup2v!Dp?@2Qpkt9utzN0s+O1zIM}go*GiZwSDM1V{^0x8E_7qm@qF;R^xS2+D|dNm z93Ke=!Y58&34RYbAyhdwJSOzk=(kZw@y7}0k)*WC6r6xZ7WBSIV;=0qd|LV!8dR(vP>>Ycs`xdP!F6LXJcSa}{5!gO1ycInygFCocP%n2nAY$WbW&J>Y zr{9`I(tCnyV51tQqTnTV0CXSngJVE?UUUU^0CAL701ga?l?5{b9X@DKndtW}EEt-=(e#t6KFQyEmpM(*~DDR*50 zjEB@S+0E-)@!x)<9Ig~^T$I}Km&lH5p?OsL-H}J`>O7V#=FIld#L`|z+lux-hd?}w zmI@}w)}1b*{kmb6S$?i>eAg3*p`{vYOX9QCNwHyJnK|dwhFt!ZZmHwtj zYYXhU_m5H~sCBs>GD6Zp!hzL3kN$~V^P;c#Jn}bqH0txH{HID^-Ici$$#Y1w-I!E+ z{7>;j)?)hOQWrJotmA!Iw7M&9@x8t&m@}J0(@xj1zlKA-)Z(g#-+;z**L*s5MCXUD zO!!=@f8O4Hd)MWeubI#nc*aq!bH?bC{MqwbXY|8TfnyM@LqPnYYm;&9I(%l^`7Ub<78Lgc*jxq zH3C4ptK$1kF{3GRuz(hnrL*=){s;c9N&e7j1pn;m)$Q|pEDZb1%M>=yfYtv+?Bi3% zvt`(5zMYc*&Igs;Yv(|GwNPk!#L*x)>-rtUC%?YzQuQ6p{(+)&P;F_?q4&p-rzud5?gC3 z^uCLj|Aql)Pi7Q8BLvH@e~yvcKLg@NM+gKC0ykE;DW%WIUvbZT6=S)-*skA;5oe*l zo4wU8uy0LZ6Wh0E#GVy?$YR3iv zRyo+D>j@SwE^Tx$b}jA*)_NW~B;WMA?c4e$Zd4vMW8YkM7s2zduPkWxbR|(EB6?WB zW}Pb_c?E3=iOr|qU`~zaE^K#Gr2vf8)6v0GGS#2`d!09UC~o+4@%XHUm8S9k*>b;Hh_)k4{KxHVyGKJ3WTXxWNrZrMHb*k67s} z@#2=Hjb0Kxa;!Gyk#KBZQuUnvuSyfQ03K(>gX;&a2gUK8?|l#N)R`i3}>8s{#6td+bw3*VBqm)N-OWv z?9}IZ8%z_eeL$3hbU=a?0?K7~x5Eg5AA7<(QJ1TP z6a7Kts<^Do;g>j$Z0U6_N*M4|$)$@-FSeGmAqUDuA8b_WZ7Mc2KpI6c?c^16Xc0YP z&h2X%YZbBA^)`ybC5rMm(unmgR$_J|S}iwc>4-n?A;&>=#_fXYdu|lp^RdEH`oyC9 zjV40VO>Tm4>$vZ^sk65jS3~?A;+~n6ScX!}^M+dYz)m5xu3oDBZ*QF<*@&DV`?WrS zwV%y9^m2YIZUuQNNI!eTx375o4mg6rf$R1Mw^POET6aqcLx- zTQS}Z{FDrqpzGmV<_;7mBLGuBr_2Qqy}AOA<3_2*V?6p3nb(tGebV)9hxz4K9tgR? zOWeO{nJ7~hE(T_g=^eXIEr}r<-#^)Ss`~+CAb;6?Z8ogA0$abx!p(dM`*_3&-(8Q} zFv8Z95ct55J|7nib$JU(#E8oJ=>x8YYy%hZhuK2oHps%ko|?%k^<~}!hVH((qd=MT zgynmb*7)j6PbmGkP7e-i_wUEe-iH;*^_5S9{=j;CJ}DqmHaYseE@G}+ zIx%v1jQmX9l%4O69Id4_W9e&#qvi4eBV%((V*T`v_ts>N%DQ31v6x7)XFEzDwUF&k zVyIZ0_17&U)MdY7jGkC&wymFr5coL3rB8c$Rne)j?PrH5o$M(-t+>#&f8m2Cj>Nb* zGJ_`F6wrL7B6+)CqxT1dRTUD8H|6)Qi}+)80wUX^=JAJ58qN9}aK8XcnrdU&%`P-n}Ue+8D=yh z5IU}cKNw1TmNu9_0vNA;edFi4{GV_vq&b?3F@ykurhKFQ+t$tUC9$1U+t4x}!DZUR|$y2!~{(ZOM?-lMD4CLQ|ygv$s zN)|wfjQnRU$cD??jX1j#<`S_$GJys87vV z>!@JSw*L-5s$L%+tyQ}{wcrxVy?UlHZ%eK{TF^YOuau&*tHOFyl z4j5fy(PSg4^o0M{?w1q}(7pKrCIcPves#%@zvLOZvU@84Y&510fZGt>J1hl zugebdkj=dN$gFMl1pU7>8~CqiJjZJlz``^7%kSyOclP<;CJ4+2ar@7+W`hUuiz2&q8|M##EypxQ)RFVw8a4tJ zJX`mhIN-{Cq@O< zHxRk4-)1m-rTBYTg{SMy0-odDpuZd*x^V;1F5o>7l8KndtVg~V3%rL*V6uMz9C5dm z2Cf^FhL!EhXbz}cqlCy0?feHVNso}6=Zny+HV>z?o`iqhaCe)jc3BU4kd~`fQ^tpG z45=UF`No`s<0^Xc-2(jn~B^5My@=#_kp z?8NH(T1E1$mVoikntxel<=D{|&ARRQkDnfsH8@C*X0{~2i?}+2MW8yE4s7w0X-&U6 zHtpd}NX-D%;rTX4W~Gm7-Gj*T_zvWs#sg2=uCNm`5vVy&c(aK>#9Ynnrdw8VF zMYC41V+X6bv*R)HkVe8B|L^~JHdoarumsXzaAL=8b30z}fwT_T6M0|K0LYb&2~^`@-)og*KhlNh&%h-$*w*94LR z@PzmXbrDp9kIYpYcT$q~Y?&KOzWnn#a@#KRos&}_?{m}^dHrhnquwOH#xR=yQ_*e% zzxx?=q&8Lv6)$lA?Xm3%E{+&N_TQw-1w>LD(F*9+rKz?9lG4WZQv+5%tn%fZqlW*r zmO0aZ+1&2;>j;~f(bx8=3%yr06UFpj97ht*^$ZePtvV{>KbZ`XBfwb3gJPa)6Qt*0 z+A|`#(^IUg;@nY_=sr8k?~Z=i{h}Fs)xeP9Hu%}2izaPAp zhb-+iC_GgRQ@JyzCfO~bJ%?Dz9k{$UgRNnHZ++swP>sIGTvIUstn8$@wZOoN`Gij{ zYf5sKHSSu|wKd7>;}@Q;C5A|!tN#~B_;cmRILC&8mPS#}m;M@H4Hp9Rfp*I7GO!Tp zwVr+KjZ&wnw=orIa>*&951bs;e=~9hvJNdr_NTtLre5QEI-Z%KxFBu9eHvW>3E=sj z?L^uH-%)1X92oh9YYBX;&3Ky+AN8NyV7p)4sC=*hffJfS{NyOcw$P2;sQjwASQTnt z+-Y$J6?an}yZ^e|%b>``jE3G2p8Ls!HCsueO+OzJeNK&npXM`KH%rwTQPY)I+!>08 z%TJx;oiziP(H)gKifR1MQ-V*f(pNVgMKToRabJ+dP+FdmZVKs;0?(C>-jbi@!N4Bx zk=p7z9y?^N4G!2!dpJF0e;e~EjraHNWRZ!d@;21DXy@NI_epJG(LT|Bq9TD!Nlhh^ zLH?vRpX%peMgdCV)U#b>DX^Y+D3&X5ziM*?^= zOHC(n$B26foIRpv+$A$y%{{ux$ZU!1_dbLbWeuQgk-J%MrX*xtd^NJ>$aJUAHw5Ay zQurEo^zAQKT0VgkqV7XFrS`A8UmUIeW`6FCpe5EWvmp9pEAA_8=Z$2SyC6j-;TK+u z=B#;4c{x_bDbNRu_06xDnS*_pdhAg+Q#KcIUD466dH^o*_RO8N zJkCNm`|-C{)n|4WJpxnqdA-3yS{RdT^1Dmq)hiXCSF~eGGGxvVSc!j&X%rr=C9)%2S_Rxq%}s+iNsZdywZL_WrQOkTcOX%0M& zS^WJW&ErNgv}Prq>b^g@-g+@f^vJhJr(GrINu@HMi{2@Vu`z;B@pys0yLg|nZj2r^ z+Dvn1HD=R*H|?7O({sbcMN$qfClS6>F*o+i^?=n2;59+i^$yMzUB9zqJye~OEH11& zd4z8p{}OPpP=LzgW%UHVIKS@yZ$OzpF76UE+o}Ue zGQ60GdiOS3EGaRzBgv07YoN(;clPK+_QNwTFl$HrS8KmAstm_8+jcvZ?r_5Y-1$+# zSLK_t7F+u~HF)p0T7JW8lLd`@d+ovSwGWFRjq5^DZZdk(7d3?Q1*;t>EoOs<3j7vQMHxtUAv% zs$iwc+HlJ1L@rsOlHE4atN)?Nm{YXY7cLVuYAZlxS(Z*~DS2rrR=%z<6x8^3(mBS) zt?+gE0Lo9MHdE=7jjs_(~haj+MPY+2q|gyv8h~K?hkW0zPMX z5%T@MfZDq>mO{dub~Z?R%&~s3_czahx?fp3&k2YAO)KD%b4YCk-tWXV-dWlbWN3no zms!fH5tavDz^sGfNbDQO8m+}yC4mDbfko?l-~mbTfFqW&Vjqw}T|-{eRcC1q5^-Wu*GEbP;~MQHWDZI~oI>m~3l2-e(&=1F z<&lit)A2x9C3$aTvs(@1@&j~I{L|8woX1lB&W57(^>c{iG&Vm!CSnwq>h)uyn*-e~ zawCg^Ken^B)D05>P;~ywXeivNt`@0uzwl{HYdqC6d`|i3z8Iisd?WrtWEOYYQfSrF zML*pvXlwo2G)8iEK~f~(ZwJEMh?V+i_M04bNJpJ-s3Vr;L&_op!xPbJ-fC3G(;4vJ z@A0#%=Tw1X7N@K%cjdhox<{Opw3GG2iq1&q<*0pa&Z+Lhew>>ZU_K|+wFqptA-BNi z;HR?moseL@Hy7Jykk+b%(%=0hlhDMFKPcTze z?!Seh1D~(hB*7aD#X3RDg8^PE1~urAbngzs{JsqJ$}3kBQu#(X^#rbz^}qHlKN)c1 zA4XLiM#{T?B?Mlt2>!SOSezNZ>HCL`64Pb-ZN#hdk;C_{rR_o~nZC#OMLK5ePVb*Q zmtL~me9zI=DfbUgN!~a6rqlI3@k-DiG;Oh<(g$Lnz_1hfPeg)$1Mdqhh?imiAuJ5bWhhAcS)*S>TXntXtssNQWeO}S9 zSrlhKYSiuQovZ2|^eE9sA~wN9zH~cQp+cZ8mcu9Zbp6%7lq%(w;M{`;129{=rzr z%ee%Udy~B18&MTv#600P*j;~y#&eT>`TyZBO2%?5=Mq0?I^TGll#nDV2U1D-bHC?} zqSe@^+>PxGN23FKF)i=-FfVXUM)?+eE$n|cG>iVv8^`xdJ$z5cv>CsY9kdU?87=IP#hHf!+-QTU|D?c8l$3<&2z|*4f^A#{HyaLBcIzk4@Q%M?N}H2 zfqN(hn~1Hi#gW_oJJ}KTh!qJN+m`@h9}?0N8uIebTS4^x%@u}rVpO$OcHQwe|1)2b z4ESrlSCD3+u~C*$-IbKM%jwa$%Nbgte6yXB7h#kXocc=8-=}Bt*Iq5rKmhbd$G6-! zW-nTOY@?Ob%_`z^EAp4x+?E%d1;+ZCe8CFsYK*&#%Q4%%EYEj6be_8}HoBrE4DH$c z3)}3rTvjbwn?@ZI`JV$B(7zT`glO9Nn;X|Pyu^G2*!IJXZH96cI?QG}ZLn{~3A!`S|xi;1ob@t)D9`R_b%NVr2s85HBaej z5G1ERvFkc~{FNW+rh=nlJ#sJ~A}rGXGvmm>i1KXZfdhX$raZ#S<%YnOjLMBsB|@X- z;N)>F-yovpa#{Xc#?mFf+vE8u{r~e|duahlJAo(T(G#)#%@?)a&mTR7dT!>a2uO6N zW?V^;yckx~*$QOFt~5mh)`|J7D*BvSc0;@{eSPNj-ZiV|#%ABcd;x2RpL&}8W89V% zT7pEy2i7ougS^D-@6%?T_M^n|rJ3<I9m8Y8L-BK5m1d;DS*x@*@~pmkV|UI+hId}b+TuOji_hf(^JwmM8* zjup(ewU!x)@cLGbzkeiI)>i_?3 zlO$A&dE(Pbdw<@2m%H;h@E zh70O@Nh9UwqD2cOgtFknn!vHW!cKEr?y6kf+GhfeBpn*YIRCna-q$HwZ|!}fFK5iu z*uD1tP=wL2ntpZ+vtM--Sj-rIk#WFnc^lu(jksKXB`p6>X26T{!?5LJ-21w%O{^yh zm50$4^p*Q^6xiViQA07HrL~52cH$7?*`~(k#>jD#cAfN=R^3=l?fRR-9Ej!TATJf8 zbV)`02>u!{Xib_Kfbdg^z8i+ojG;vU(2 zy*@rcX^qiZ`%O=F1@SP>#n9nU_E$K1b|6#R{$j6NS=4#%)IK3mk+$RkFJywRGi@De z^JiU!*OVME!;Fz=u8af`zA&#{;o!FjmGJ%&CuL-A9GjzmI!W}m=RX0;@(zwG*{O40 zPIayj?{CWY1&|gWm7h7fna3;tYD-8IyTZ9_%aviIlJ4?jy3i3f|ArL*xskOOYsmN) ziXSpAPG52F?yOefey8rQ-EXcx5ES*fKdaMl;4T!chFoyI3a>g2+=F-Con@R9S#5zh zZTt8HNwfQEGW;R}zBr3NQ=Nsf4Wu`(HUb$wcal}hb<~tE!+@;LcpnVGPDb#v2PQ zW2`Io!>3777QXy`zKV}^-T36YXL1{8qw7Ckv}8mGyddZ)pual5(o=WCZ)@~O`Ld%cCLfQ49`!!L zvGIqn0k?T}dt(7X#Z|2O)810JG6S&DyuKd(daV%86l{ptM z@zLt{j&1TD7-hz3*T}1)Ko2A!9#3LAFB5fl$_zlaBd)#`Fi3_BwD3!B6PH9RA3Q>1&4QEA7%-+h16qKSJ@{ z4fYC9{Zqph(WH6*{6|*Lyr#nd)~w@k{6r3OZ=M#REnwlu@+{)ZZ(N=X@d)RLf)!Q* z#tM>x1(9Cjj(;msBM-*&-=<7>Hl;6c0F`v&OyKSqmgo{pz}o?Q@9t zh2fU{Uu-(e|Ga7`%q0s4u2{!>&Sj-RPzHMeRyHw1zlF?)J6@?{;3;9Ve}&4z*MG1VRi)izDO|7u!lF1X zQT?~5yiu(m;|xFJ)kXLcuS@Srko6YOOK~cqWSc*I>0=TB{O2KZ;{`_xDx7#)oTRJn zbe>A#C!*6gk@V*pZK*#@CvEUI=>{4|AFP325!o(`>u?OnH? zAL;QkAVk@Nh!&g4t1M*6D5M4zYhN=Z8QXtop#6v!cL3Adl!d@ zY=l?8EZX$x$9z3m36QHh9pA#gdK27)`HI6CWLEHI5kRF06j`;s=Wg8*dZ-sQ8>&AW za+%(&J`hpObJi{8G`B9a{iyi6@raPBl1N-&s3t9Or|QI53lWBcq-yf0`58T+G-rM2 zrgN7&aR70VwV=h4$LF?}6yDskzYoK*B4u8g20Nc^d{|xU#X`6`oL1*k=SY$LQyNai)v*J->(OShq2BR;U$62L{ zisb|eZAlh^t>im?CdOK~HYMZZMB|*Fq~-W`KlTy@r!TW(2hGZx1R=?i!bgQ zE_I;{M^zH;&Grj@pg1P^^^y;M-e%C#WCwD~0va$;)g}1u^NV|g*0txx^U`4tAVSC* zoBCAWgdkiu^xJqkpQriNUG<YD<1As5T$@v^7lUG|Qt=KnhKrSI?QM+$SB+rw8) zzYXVWDKt^JG#zDRj(DCBs-=7%u1dcT zuPJ5Q(tKh4jQ$}HJuEx^u6C%e?yhLH{XxeQ09IdWyDap%)cQ7313u*uB$e-B0bBBy z`BYq!@*>1{03*2qnou-t;{L~CQt6oIwIf?hi{xKYu-K8eZ}(F;t=CV}mNp7SRVtOd zo)5T~4;ED_hd=j_kdz{_<0UGCK-9cvN7p*&y^hTj%0(m%BejnY%N{D6RA`k0WLKVY zt1~XkpjA`eqGUy(Kk+_i`wV<%%%jfX^uWef@ZkV!)g+ZfQ$pFG6~^cb&&;~M&0!*u zBL^+Hc2ZdZF30y078HiMrgU*_D*<)&cS9*OdDvB z1<$k9afXq?>a}|`=CX3z4~8(PJna5^!;PeU!vkZkuYUL4^=bf@2V0~XmWQ`|qqn4+ zs{P3I@`Ft<)@ed8uj}-IdxO)Q<&UtwzdHn>tf!ZMh*xfWdrJOjiz~HlEZ;#%COUPQ zbws0Nee`jKM5*?QcS}@e4z@3jd|OXnPyMzSFK~7|NM{oRCmPCA<{Be4_GnSHeay{9 zWhv})EqQA}*qO)*N>by((&u)YzRv73X70O`=1t>LHw zrGt*&gR-d5)KM|Fu5)5ve?h_7VP1FGcna>_p^zyXjwx%WHk&J^tB8YErd+4cTva2Q z$~vh!V8meDPJPguLi;k5ikqj-cC&YS*D~z5gA3xi+cE}xS_QU?zYJZaED{XwNI1^i zW)eX93ACC0sB5?(IH2d4^&F#gqhBBHO>j6U|G5q&3HH}-{o^^#vCh+dzfUhnLB+qY?aQQ<$dMc^$nt{OG0(?^!orS(tkqY zrNqq&-iX1ULPSHAm^boL4^j$ynG`l%Z+wZ57PN@hyQsYM)0x$!QLyS;PR`y!%8rKQ zO{wG;7^m9c4DH5vo#vM8OnY)t+r<^W^0CL+A3RU~#UVr!iLl_sk}jTp{q?%Ew3A4Q z4r_&XcCl`nCj9sM>TmaSeS3bVU~Tez(!8~)hrC?QYir#uHl@6e9uIDm{nnl?IZzx^ zW+@ww>h6Fe6)B>y!U&pTzhYbn!iD{*309=TJ1E3$olv0Nh`2{}0)KgUq&HwQBXG%7 zV$x_IG$*kD5a%T$u^a$%j&QuRc7MpZygNW}f$Ulbd~wemcbOUh0n0H|azFQg&rdIo zOCu-`_kk~U;=pS~3qL66K7df~mI7G#tiJWw=f2g)4`pic6A(F@uny-FD(YoC5T@9+ zH%)%CeAg$1s>;n@G1&1Di=VFF^u2@4tC@XO0qWb+-+cW&qI?F`q?%$5@Yo^#U;NgX z%(&sVU;x8S(Vus^h53Xs+~vIhT2Q)h2J=lrk-WzMge$c60ALr!0DT#vH&)oc616S? z(RG0P<^VB(+~{p)-!yRk#&O^7ATafTqvOW>R=@518vX8{tfH#p$W#t90lnjQW*@Tp zd%-*H^wp?*IZeGkHqYhFQ4GJcA|6(>o7CjfBdZ$>!#OI|;dvbPH*c@i_&&C-;svkp zxIdsdx$kXkXS6hw|&mTB6S}tsnh`)E{WvZ{EZZ^#4V- zN)J)6h*ulKH6GuL*q0~AuqN4a56_nG{Pjamdk8Z6?*mB&?BgNhz5G(C`_pmXKKA0r zIS!`{brIYz&~+aG=xZeZBLh)T)e%q{X1_CY1aA&1=g%3w&6Sujz#Rv4aN7z77WxVW zF<;UDy_E{(g(B5j2$=f}u#ax3^pu5&*M~=Om6__{eO;E6ImWNPe-!}sT#lUq--u34 zk{J>8(D`@!k{tQ@pyr^7=qT4g?n-9tBh4_fUQ7QIpUN>(D&AlgJ|Hkp_FgQ`YZzPi zikKIc<_Pd+X|H>QIktH&5nsI*1?mcNGpy|OJh^=OgLE+-v?|n8l2(3rALded7%GAtw^iM~jV5W!Ua8mVnp7Cv?Q+Kyn zWwNMr^A+Oly!TyHrHt2A>%N@5*;px9=156bZLxi+>CZhdX_FgRV9}iJS|!`IK1=RxBl3?#^&Ba$Q$h`uexaQq zS2)hTFcxSNIMS5zc!dLycv#ACIK$RF|F9u~eUtv@u^7nmJ6!E?)92 zZ1;w}MP2Y>{w$kP?dXtGZp_8h4cmlojw|9H(ydxsZP7oSfy0(XEWum1h^S0;pNV|(wB%x zlLZS3uD0v$hlbc7#3NTOdxovHIMoq0`jl=xd|)&4dYgzScD%-P7aa`PAE$JTAKtGGLoj$kzd zjjBeaKILxTdXv?*yEGa-1DD&)9QKQHyoe9KnSo`k$Pm4V%d4?e(JyT_#c_-^tKw=Tf1tg zGBGC~{K=nVch~4Z;ebt4e=^*SxN(fZmhQa&VzI_lWyoM=*Id&WVs0@6K+E<$rOg^B zp2eC&J~7^w=uI=@VFsNHY51k8$6#up`H;|bz5(?c2jT`}&Ia^qdza`5AI;Yv?mxpk zl|1YBbSg+-g@bwxZw@H%RH#8x3*)_A_^R&CsS3mSEAt?>`e@&8eBVs3VD7vj$mQIp zzOrcSxXcG0^c~o_j?sO6dL?JF%}3zOhW*u%f;~5p{@c7iLbt3gF{o0xFUJ@3HZ*Cs zBd{eec4pzc;c~`KdrHfFrEP#xtA+4al6Gem0`4wNUYlr@Zfb-neUg-<@S0Lj|6T5T zxu@^k%?sSKSN#C>nnvC&=?IF+S!?MWa^uP%MIRn$PKL7x{aw2xSSGVIx3{`gRb0`x zvoQ#G&=@M&VB_#xO!o(Q{U{GAXqP9%)*CyJJ5y5str53l$z@f?h9b@q5aj4x`D1j^ zT@9aAbobtQG;>y8g9kbCXkW)m^u6y33I!P)*j0nYd_{9tB3kF3v)@yx8s@FrR9#@m z)p}ohhW@hXWK(48q;H`tO?9{{6mP|UH2*;QG(CbdGki1%l19W!)mFw zafm-2$TsY{sOn6K|9YFgN`s0gn@LFW`2M9t@TK27o*;d$>ONB>bz< zTY4Y-ewq%v722%O7k_^_Pt}^JamP&zd+j@V7PMD*j(dLo zj5Ar~q;LI#>Ochr-KMe{Pn)Gu)|qqAqjk0xNta2L8arCwl|{KO1FNhM7 z6I}`SB#+l*&UJ+DEI%`97K70%&-QJq(7-B_S>9}hd|c%>U&%`rJ+3IQepHcIaZQ=X zY_qp#^BK$Eq6`~A(4+QShM2p1Lo^qfngs7TQ)+1<@lmMrdo8L`Puc}GXX=ylEI5^C zG?-6lH$fBSSNyTMz91>Zn6*IPgJmPEwDTp325a8ksZfo5tLe~Chp*J>)LBlBogTJ1 zmA>1Ow1|ptegpMaX(h?h1a3Z8bXc;5&$ISuB9^Q{T^FZF?K`eSv(9>&}<@ zz`G+u*3>O7wV>aCw0xQpsVlPY(XGVEBPnlvClmhI$A4=1NrFAG_O)g9qpU7+pu57J z{kpYfL2~pflqTJav+M}he;nt$^<1z!-m0r?LJ!I!@pRQy5w@MO9LN z=5bq#h%#N|#>99>1M@7TOi_t~qVdJjI#)DiFn>MVR{ul?mAT>sP)Y~nI#;|&k>6^O z9D94!{3o=C%HD69NC&%QQt`I~<{Gn{OSF-dv=e)~q@e?Wi~J~Yrt6bKe%Sr2`!d@_ z-D)h^I) zNoZ?r{uU?qZcip0#h#&BRZAU5@ci!|efQuwYoh*2wgF3-olFQYD>$?E=4J0@*yyOi zU-=le=EjtEy>bbYdf8#QxAFy9+mY5%0Qp*yvcg;NWIk2#dlTe9TM6i(o5TxN^g8bWqR@ zbd6=^`-i=IkM4UwaGsT*)(w1>zpOSOiuqt66)gh;`u5R$16o#ZfL9emrVi-_ns(le zv^EZ^3@pxZ?IHabN|O9_@2vri4d~!OZm>zA{Yk^v14sk+R;$=Sb##vqU6lVO7%-#> z_V?xQUInyORSWi92yq0L6g3^(O;jKY>Qlev8|*M!bbGe|O@Fj#h4p0kzA97-P~fXt z(7*=!28vG|D;fL$nSLB7LKrf8lDb`_$g7dT`NOf@`u#=?d#=yJ?nm6zV`g4##7zq?TI<^SY02+r2i9r3^2;H#PX|jak1m@m1QVJRP2#VAFiUP0t`FZnT1P76 z@RA<+o7BfpgyIrT?J)fp>(LoAR%+3-qAd-Gk}WN+wH_tk@_s9#fCU_E(JNI?aJDt; zq?h;=&P*`d*tqWH7}tlri+`nGA3^r++kr9DLyEkhiH<=7np!96hd?4q`^lSs(OA0`}}e8jsE5*OH@<*Fot(@ zVrT&rb5A%U`osOMw)mp+N)#@Js(v>*4sJ65ezg~|o;c*gG`jA4epvr2i)Pk6O9*y< z&iRC+PqGqwoU6r@oU#PnU_RNA{+#mo{(o84$gUQV=Hwt2B<-sgxY?%h&z@Vt(qY|k z^`JYenu{r9y^HOXkeF_Ns^mS|L$s@fjCoC2zQ3hk&2*jTZPc@9XidNKn|Q9$+-y&}j{dr;&upiZ{m1J(BopR;d>YvQ z+&9PGeY{gW$Df~Hb4idP z_un`Q|LR2b&CK#&kUB<<2t;dokbXZpvmIA`9MqP8^eH9F=8WFCEF7Z?Bb;wHq`=h5 zZ1z1w`nN^0ox5OdX*u8a_dl<4-b(5hPn1;KDe%zzt7IGcR(8fma8#t7@^UC#NVToYIC|dRb$RaDY3XKOCQ$Ero$=g#r{Z8#ukAnHiT_d1d z>youhyx3lLGsx@bg`gD3#WFjb4FpTRgQ*<58sS+s?$>1io$D95rp1FAiot0{=kn54foY^vqSqIGo=Drjl zeVrnIXcG1Cu{h%?9=}rg3L>WHb{36;x!`b|Q>_C@VJZZrIQ8*BacYtaQtBGc=~> zGPJT?E>soJgq&)yPjQ+9LH44?kW*}R$f>^+rMjR{`MU6EkJ{YVDNgV(PWE>9T7JD0 zrxhKM@p~kb9~0(Zq6bY@e3dmUL-&-XKFT7UdTv4FX@U^>H4%~VKfNqN z*vVieUa2m3Iwo>p-TrS5_?5-^_O@$EGnOJPLAxPK-azuF*z1HR*^%xL$irerqN?`BCrgo&uzF z>W;{`b2+Euix~HSD)3MFK9(Vg!ATZKsSuupIbLC^d=^r=;3YB+E8%31aIa-c0=s>W z-ehaq?WPfM+tHI92wn1obloj{b@X+x&`QK&swJ)TPkv1bzt1lEZc2{tnm{zgqq2#6 z%aF9bL>Jf$c@Y{!GJG*qv-65_l&zcNDZXH*qRsJ6Bj4RMP1hUv6&1|(ONE3}h(8Z; z0EGmj2ylSB1anMCwNe|DV_JV<(b1I#3;s-Ndvwg#3o$$O>dU3km%WZ?3E_ON&CG92 zJpQ?Lc|NHg#92M-#Aa{-xFd+eHyQM&T8!^HIuKWzFYawcG-H$dU z%;cA{Jzsk_6qkhG*gidA9@sjep|s=vXlPAUN^tLZoqX4f+9oC9{w5{kB;qq*+^Xam z)sm`WaUY`Y?sDcqx9;eM?Qg(aKY=h#Z9;R>6ScN^y=Mm!+qB1@?PXO&oPdmfRA``{ zCul`T6$qXoKytzx6`dnw3sy%`ukQTlZu)>n>LO)vOyp8eM7nXO)VzJOVi-8vZCi(v6 zy4LwC`R8QWY9Q+~r{NM%VyEZn%UOU`N(J&vykq;V)TYEGAXPpxb5%hVID!xl?%fNw zBBZ3}a&fj=b1wsg3`@oza0os>1q ze#^!V3YJytJ2usRVYLcg)Xx-`9naDOa~HSab$|bpLcQv*PnXvt=^GM6>i@y$>45$} zj9yaHpPowEv+x6|R-ZT2{BLU0&Atzq54Nj9%BLfBu9%C3VFGL~A-+(fuA65BgIqS# zWB1r>-n~Oi{esTR($#cVxXL{j{yx#gyZys(5H)}Jn})|@ZET0nMLS*I$nzqVyVqO| z4W6F^SU@{lUm@4lXP+IhSqgp=20LFu_I%i}Akq-?n@~iN6SaJ3H2RXo=KiO~?Rnyj zXxz~cq z=*wvp9WFLq?&)3Xo*u1lNJ43{8#h7%qf6u*5xanJf&>Kqf#Lw84R*Ic%VIC%id&1t z;9Z>j99Plm0y05(w@hf-o?CQZd zzwK1TYhhadV_v-u9-Tub>&a$)$!d|y83jih zzF4^%|48?(xJ?EH>M6rA^CeEQISD13R_wb+Eleq#e5Mg;@=11ofyv5hR%5;$?4s&D zQor$@^9G;U?GoVGO%MsQj4soXo0-8E(qZQ+a#E7EH0-(0FuA@6w!1-y-Mvu~E-qlQ z716N0!+wtiOucIwCSlbf@e{gHac6i^QI{3xI7ys&pL+6v5RT`%z zgPcp1u$D}w{&|%0aAwN~tP(9y9%m`bMhY` zkIgbwZGA+GuX5q|LgwAHwONA@2vH03UzAdqKD6ip;>Nkjjx*<8-?XpRvvJ~BP%M?-)4J;90(48 zFfYMpiKFaStgfeXIHjuCZwGQ|*CQrlyoQhCB|61oC-syp=Hx`bs1!r2LbJBD?@Aq5 zj0_F${OwDPFu5TAdsL#G$df=6Kdr9#k|HjjPpk}Io8*fBN2I8k8R#3iS@@|kk`@1z zZqn`oG>d7s{mP7Fh#nVrs*jsBJODmvwDPREU#ALy%I>0yYn-BWmz1iLAPkexA`8%G z+5n8NnGROeJbcxwC?P-qaQ93G2u`w|Gx~?ozQ+Fx z&yMhvzWYb}mL zDk66ZDG3x#YRx=To==`9Nn$c+9l9;+xEFsxvwYob>p9z_ym2_Ls2+lews=sy2R8+Z zbQ7u)vAy_sJ5Z#zvu^O}76SI(C*+DZoV_l-7 ziMEJPvHBo@?N!}N6&zf#vC0&*eRB?D!ei}`gC;CaZzT`_@YsE6v?~xmpW|7S7Wz(H z8{+Qf)YiQr4kLK5ZWrz6;?~?~Mi~Za(OGh16z9Z~|rTSRIV$@yP6_{wl5N9gzgI#>e<`vX| zP?r5-QXQi+^G_E*>&2h9(=}5s)?*d=g_A8o)5YsqeU1TPA#a~ATJCJ3&8kgH6ikPO)r+0bkqk*^(doR42Ul2ulvIv#Yh#c=)qZ||* z$H|7rneca{TqVX#c~)MbYs0NbyF6>EJ_ZNrtXOZki;v6ykGK$}O?cZ&WAo567NcV9 zXbfj0zta(|jEb%1_MzXXb4&eZ(Px0O%%%GQP#MN&of{d;&cZFQ5kE~;U_?an&`aerB*sJ! z)=GfpkUOcqGNgbHx%S96>Hsw$ASf-oIZK(zGN{};1NrH#QaJmM)?o$YlX_SIB|8{> z7Cy>~c`x9B78qgBid!BE9X&=c0_>W5LvGhg$?-?&DCa(){a=N>VVp2O7JyC+Vj{=6 zRtay32PQwEZc4tnibpaX*wU%NlF@L1}H^mzoSib-h3fu zM5X%-bXDfg8AYl&v3YFu!15;{izkw#LmM|0ffz`WunAx0;cHc8PjqN@3twn>qz7bS z0=3_M=D?xTQ3J8v2qMJqP2oH4962qc($`I=2Mg@Tt-pf(uuR-RXjbAlcblzrS&8T-&tVt8y8SNK(i)~79!uRPytWi(pXKP2q8nZAKwzkE35e%Bn$Pz(= zsFX^S6ppf;j*W8MdET(aWdB%j>`(2@QKymY3|3<-CeJG052QF-S)4~~_7UUg?4nc5 z2E97oiGhQzk>;!7UeDU#${tbo+j95DDWL`g0nnnmEckknS*vil^*CE}n=UDsi-o@X zp|-oS-112%>UR42_duga(;wBFU+d!k;kJw?u9L-UyL>95_(%!aWl_FP{#NQ@tai%$ zEDc5)pgS?{GipuSvO_W4{|cPS{@|GWJh%3`q;j)OpWYsnw^>}+7=8OX!Bj)i0eLq; zXrTJt0r_5cFu)Ip)^iVjD&i0rd&Q?@g?FfkQZC7ZjD!+v%F93Y-Uh|ViP)G*jh>Yo zSr?d7H>)zvGKkoGFfiITI$_meS7NN2Ku>c;hIOL)(n7*uPfZh>VvK?V++L~}nuNLX zy_Ip!Qv$%vV@oLp0F#NyJ7h75@&6spRe1>+D+tJwEDVRT*Y0!cOCP>wOjBRNOsl)n zU4L*g;ypG_fWteD1rr`}0FfZq{^HI8URDdkCIA98OE%7DL41>q0QY`sP)y(kaz~ys za=UUbIek;0ai|>Oa67u7+rU~LW7oNH4A}0TW^TCty0P0=WiEk*rxuKTFd{^b3rsU9 zdsGW{{A%AJK(DGAa1=nqe-2h06P(qTVwQoeq_je|=uE!PR>>Pj7=S0l9dZ*uNViL;}e$=!1kMNEdf{6?F65?qVf|7I-6g83FIutf&&%fH_Y z7w_+H!J-&jzCzBT`ge-af$cin-<1V$Sv3%uu~bjM0}jkLN-QJGB*7XxzD@M8ziTZLW%V2nM-4ot1oD=Aw|_$M-s)t-GHuj)1~N61P}KcuU| zdx=7Wx7I3cuMzb#@NwR|iP&cyWBC_Q1W2PZV(@7jpMkG5*og9t7wm_8d%JKVzVwh1 zGx+Ip1pfH)p8Kz{f4E!LLJmbz%HMQ3=iIYnh{k8*Rh|4Yh>8Pu?m}1c_1=Fk!E^yV z-7i~DiwqyMr=E)S=Imp?QoWjY&jRP@?RVB!A3L+;>lrXW$U*3g%4NFHE|^TX)Rhia z_g!G-G|MuUF&oUT?ZTMv{$3WW_%|x6Dq{U=z#kpcogJcn6;l~f?G;Q9HZ-QUpcgxv zuQ$=Tv>p+)b@9jP5I`%F*n84DHt}eQZt?m#&)DwKJKp&tIHLZ!d<^7nI*?~I@BYgl zNz~7E)nk{L)%>%a;8JLssx>08yd$)9*CJY~X9SRQ^x*%^EP>E1LEw{V> ziuoNDPhk?p@5PJZU31-k3E3G6THuIYiGrI|pCtiDL$IRzQ1%1e1sla7h7LZa3H~(| zmVr+Ag8PEkt}=U~SW%}3Ej-Pt=&q{v6tyk`@&^pUyU9Ri2Ef^V8rl`hv$xHEUViiX zz>v}dpl>dD3nXD64WOFb6j>Zh+svm4n9WXl19YN>zEaD6YZDvc_HO+C=SLYk5IV0? zGylG(fnc6zHaELEclB?KjObFbkJ8BJVbk+}jte^P51YOG%!~f~H?)VAcX_^2W2)pO zCw`@gm@MDr^F`s*cxhzc4-HVe&3R)D%RKlS7{+tMS$gY`O!8%+o?jE5)UHnO|Ce3* zzdrD|%CaV&0k$Y*y*1wT>;JLP|Grj$`Qs~PJL(gUQjIC4p2P8{6-Rvxn8WI5>oPT@obgmX8!i=-jQrzy$GUm-4eM8A87Z?W)z%Kr z>N`Z|45A6%@BM%#F>P#)Qm*xP(m7*4V(6@g&_$0TL%UQ~88qmO?|C)rrCfs=c_~)E z62S|VZFdW!|D%J*nu(!6Eig5$Qgzrn zmL)!6@DF+tCz|-T$F!(i>L!{532Ml~lSYk2AI{k$)AAjal{BL$|D8N7&mmsdNlB&1 zij@m4|7uFY0V)K0on}OHP*1e{gS&^8em69R*Khc3_~DYED)bbZx`s6JR2x_QLqD;x z$oD12F8}-bKozbOGofDIhkQ!ZrGefpMHU9^Z}68JzKTv(c-#4fb2$n=>Q_r&Epef@ zoc>USop-Z|iG$bEpdS-6P-ZX>@8^gogI|Pawe9>r-_3Q=+8NZ*tNAVq$-9-Gr;y>Y zm^2%1FZx_uCF9TAnvX@T36l9TznU&(1S!0Z_?5{j#vLj1w((s@BHSEv!k6W{|A}9} zxQE2W%$}Od!a#EW-1;O0X2qN+DLP>*-CZwqOkQ2^N3#F9D<%hvb38F>16sAnOV+vGgeRLL}VRa)w(QW7=lxUa8Y_1+0o_?=QLWlx>_M!|v`(euh%FxRi&0d%y$ zi+0H~h@)`=sci}%jkb`0iRV;=Y&4eMP2r{HZE}YBVb{N+K9S_I?a^ldEcKWnqn_^> z`jq<WAcI=^`;<@uzMgji4J!2=>V9rOP z&hBL0BJa-r?ee@SUYEqI7ZTqJ5;jCc{X7v#D@)6poFVPHCn9U;)D1*e1BKTyzp~5D zy;Cgn-$bDmN%E~%KS&vy&y!*2ssBL}1)i3BJ?r4iF#y=V|A2|t_3c4xM+uo^lZA~z zUQ9yckjYYNJ}c0XoV`J2@zU7YE@Sbzyi7Qb_8zaH7meGaku4B6K|bI~2;#o^d@tKr z(4T!FVrv9s-!AZ&r_e2N81SmaTF4FG=6Nr5GmFPGI^szvUD}Oi_t2XI_opmoir9NY zry1euY>Pfnwj32T*{;7Esc|vi;jK6prqacBo35w6*%9A;;z9JdTIJ;r`%lv?cZc3x7~!^bG^JV zn1BLXwr1+p`c!VJGwSjw!&FD#9D3}Wwul8%*RDCgoDfr)S;qW6)pvm!CTQWhNZq`s zOz|T4{T88cm^Lg%?!8$Zj%4lhPM@4>LfLu0@3hP1Q7Dmi*x-~v?QbLndL+0Svx2GG zxKbaKT|^$JMdzT{RaDK8UrB;A`7And%g=ZT&`iiXD_p19tv=kxxC zq;ao4oTl}pKI0JT^ufb~NR2Gf($SS-xC%!zB64x6Bwda-EVSkGB1gHa7HIuS(z0>q z%HDuF%6VrIS$r++D(ZyV;yirNi~3FMGR5Ay}Z4@6j4nM=|v)vWw*=-O7eRe*4ao=nA24?0(tb))*19Si)HZ*ScjW-lJM*xOgadat<3-cognsgb~Mv!d_yca z%N^pqvcWYlYa|l?T++~K9%u=yez|JabfwGQUS`z&RfSeBC(^+bFhNOt=xSA$V zIp0xhRRZkA--*nO`rPR!ppclEi+kMBI#Qw1~;5H7%UunGk3f);{) zVF2~w)h0y4!cK9H#F?V&LwJz);XrIXnhnuj#0JI1RrK;~9cFWWLT(`Ya!Wn(L|UXK)~k zMz8`y{?CNTAlPDS7dW)fm6VCA94rdMdEMxD+4dpY;mhl&M}S=NmFI^QqGAxapGLfclSwVyZ9av@UE9B$Un^RyI&f?r>N9;*OqTM(MV|wE z?OuI=5*He!gBqkI?P7eYwVzZ)3OmJ~_8L}${t=owx0;UD>K9xC%EYMH9Tza+hg{m6 z`-gb#%)^3*5l8li&eu8i^$dY@)wrPlO>k&vfMD1BU6$okH0v_~cN#Agd1@(n3|10B zPOTqwa4F$EmY~%ss3eJX8i#Bsq+FV(&O1H0jUoMi%KZPS;Hx{Y9Zgk}8Z$ai$g2B) zwgvyQyuVZc()?Ihhsa=G`MRd8S*7`~TVbkU?$U%(PHJHSRUu_~J`gVTGLSAkj1Qzs z{_#0NJ6=uFwO4TlT_*WhR@i0O;#os0a^JJ1NP479d4eQ~v*AM(D|)H`SUNZr#4*T( zo**@nVjfHd(>X`WQW!~xctfJG6~3*YKAci@6YqXde{*!RHlad1@z%`zU(&;$dY*Vz zKxBJ&55iEF21Zw!z1;nSbs#^00%j0GN-3^#yXph(pMRGcFc&+lMO#)-FC^4ulsd;= z9h?|KE0=o=&^dwD?4s`rU@IR_m*$6cV_4)F(4fjUfjY>hF;iWX>`!Ii)u!46rEM{1 zm6-DBLEz#ZcHRcUbF)?v!vBE>bAtLIkA~V*4y?}sCQnpf0Ebtn4R{i_ivR9UU*^d5 z(Sw$3er(BWx-8TO6s+j819urxqnBsygw((KM=1HyI5$*UG5~-G0ruu!i11~k_6w*Z zE$-1)0sZk`wUlji8MMX=g3qttMh9@v#_*s8VaWq_xxE&j3gyj0?1Y|ApYFbc;s9RL z_VUPY$!oj=lo+$OkJaBC8_6@*+Wy7c{OE37bSytH=1m3c%kb|gWokvxrUk~uYEw;P zoZEU=J5P}FV`ZgAU!Po9)e`*2-{92BgThKnjSp2z%OZlNo;Xj((;XeIqrVYVjxbQ> z)dN2ZR07&*b~SB>l$A>xO3PUFyS+ISX$Tz`%AabBN%Q014Q1K!gxX~z{uaNij=|dQ zYz_6v<)BJ3uMpCE<0~+wm6IXRAAO+5MI2!*zq2;hR-j5BU)J7FFDaQ=Q}<-im<_zd zf{c-qx!_w|<-FO4b=2`AAs$<)l9dm&V2=FUmxpfpo+?=9t4RC47OH!eiQ0kYl$ z-uH7q&wuY$5V8cVm|`CJ$Ax_M?~e0rt;r;ewqt{DyuI0#UgJY`Jo)4A?05D1wm8x+B5Qwr@dp z66oZr98&a5w`+`#7RYs=mvemejOC7j+>)`cVT&_=%^Y0)wJeE6oqvv~GSB!N_y}IC zH9qdt$bq}*C!=qdLE0_c4%ufsLZ)n%9gkfsZDQZK#NI;JEuT&(Jtd`AOLx#cHN3^m zZfxIn1J-EI*rs9JnEhrMQ}=+$iLU;&ACBuSjM5E1tMp>v;UwQ)9T`R+&OIUQGBgHW z%!w7z^wGNa*{huxn>+QrQ|6+w_lwrSkRQOdgIO2m^?X(Z_rsmMyt_mYEj()+uxb9w zYlaUDDzmFCohcPHEt93~yxkaz1$BN70_bsnpq`yD$~?DC;CoV8d#H@JjfzxKZMnB< z97lx3Wyhc}3viV4;ijv6=x1sHtHt2lMkR4`z#nddSFWi##;j^JH#$yn6JclHk?N=T zR<2hqv|-Co+y#VJkndO1Jm>ZJN%x zMta_Vmi9@-T{5Y4kAh$adcLIUZz@y}RQ*ns7n)KMxF-7u=~uJXFAHH^caIGc(#w9p z_t6i}KImdTOTLaEHv1|~*Mm_!^+ZfQ3M>*%Ur!NjfUD5LGuA;TrF;gllHiwla@bcB zycKEJx^wNmQ+t3K zEM+FnN(s^JA@p#r$7Tn@6VY97r*OaE+b+|ynhJkX#LF|oCGXy!+^CPMaAI6 z-HnY8{{&M`_iW=@09&WpTRq^LjQSr zWs0({hjCLcc)9!t_vsv~JvSWnvsX{K)v`Ua@gWi7vF&rS6cz4#*NKoW&y-^XDVL2| znrdAdsHS{ul6dc2|KpKcT-k3xf#eA!cmDtS@Kb}`YM41J?{e_xEz;8equYP6K6c9y z+*SBS9CN9!vbmjiDx4+K?G_*4@uy4Y%fIo9%NO27Bi?`RMxFOFvfjK$;ApI{ch!TTN#qRUSeFndm^41yFcBpJjFAv?|0X4?cx~mSS5WsZlz>M$vDPaoOK{nW z_tDIQGix{KKS-TW<+CTsH!;oM&jgMj>fmU{cE>?c;xDZB`|oGU?(!ABWQGYph1vWf zzbPvjVeJRZa2jC*q$k5{LROb@0G+L5gYarg5yGvxy!&;6A7O_Yf2bUqn3da?JY2_p zb?gC5b!2pCLh)H3|Mm*~>4V+1f{r-ut)<-&d*Ii7Dkf7Kz@H4gX!y|$#ABtX zpWtOebx5dh$2zYjeBl;RK0#6Mg~@VYQbD?R82?on9&53Dv?2P^RIxgB(5PZe7^+!E z3`nS{cC#_EaW?`zIg%;HvyvI#Xz??L_&LaGTJ}bg%r9D!bCLA5N)4IvMKr&U4wzQgT~VS#)68G6;Nc1pBhd_nskSG*n)r=;)HjSA98g zh1HGB%C}Xm6oq58SxjTUgc_7gv7$tYU~W$J{H3iVd`lA#qeaS)uPvH786Pt_mdu+@=YEOQ|5m1(f#J1 znEQn*ruRzRyxna&*7gQ*IvCGH6goqcWsZXSy2A1hgy4@3@!IYkBeHai|T};%oGZlDvvg*9z7lP ztEwa_7$x>pdER}rk-4ydBf9m?|5#XV?C3qb9wOX{TuVth;tg=J?Q` zPm9?Nx|ZiIw9!BRj`e$&o#4(8!A`z74Y?)xVHN6G^|H_!W>1~FgMDS?RXilG*d;Ho zqBtrqEun2XGvI|_MtbI`n)E&J1Gzq)GiOX0h}id~Khj8cdS5EnymvqD>#WJyuWv1S zwu_A-KhOyaSE{YOs#U^{sYGKc%}B(9SdL$^nl)bneWdADPf(o}CL6&86X7rPXxM!l z8tV5zi5v@A3s+>76`$r%kjr_TjE{TR?=NZlUBKneFZ?dO*q2iuK}cCqj9Tae-D-pl zCTSoS?jZ`4^t+Gn3QqoBDVd7wwm_23FxnxloRu!{2+diHw;kZQ@Fh zBqXPzFTt_%>3*Av<)xSM0%sA7uQ6^Exy*7R=)d$>j)h$gfn=FLjRCOC9D^)7HyZ%_$CxVH>=xgFxEVF1C&xxkO= z^)?@}3U$l}Mdd?c3}fihMRc3>+ds`rZ8GQ1F7c2lL&8f<&5YTGg3m)v0}^$Xys4h* zcQ>(zW`JD;bNe>leDd`kU~D=KE9xrhct?EH*{le{KYF*?TUx8G)* z7&NDA^$}%8g&nc?@LiCO7uNb`RqMlQ4%D&#RPiU_wB+&bO#?!HT8e)I&ql~kY=7r7 zP`>=YQF4=)B)PM)(|^{j!8=hZKuOp$srhHRtXY=A<1J`{g{pvN0J-Af`8|+H6Lab2 z!`SZv&uPU(v4rq%1;3y5tKzB4%>>Lo$RU4(?tR&^bMy5MG^q*soAsR$K=2M*7(u zwLIx>ITRa@)z89{Iu43V4?b$xdHCI<2IJbLubr>FlJqE3@~jX%qAClgaZQ-qL+s{F zT~)Y}YdYliK>&2LYFbOhR_$HNL$udz_v1yUcC}F|C7;BGsXf=4{e`|Dyj?%+e-Zg==Lf_0t}8%pih zT{a^R=$0IXJ42SPMv=eP9wJlLpYp#0&kke|Q@j=1YozlYfVV~>`UW&y(Q9FGSF?OI zLj8U_r#JYY@_IqMW4_mtgLl!IeDk-RDxvs+{uL%R>n`zAeBz{gpV>gcG0~p~F7FQg z>z{vChC{Alm1mO&6U9aY+e0Lib1JXDn+G@eHQ83HL`~d2{s63TgZFH2{7pXtNH1^N zq?&EPcINDZXvVcpzOh#QlK23uy{7FMDx?BRjZclnKhw-p%gtxw&C z*y>+@N#pX+!q;A(n^MjMeYh@Oxj9OpSoDpm^FG|1ekv`)8yl>_pPsQ=P3ehgaE`nC zXm#fHhN;l>i0&g8Gd9QdqUXHCawKwk+#Ub!kF^ErjQj)H>;i@}ag`qCDdl%-&N?>r z$|Fc!WRt8joT?D61d5>&UXPJ&N|zZ^H#YA2KrgmwdrJx{O_t-hm*oONK33%_=fGkD z*9`c=7ylqu!mTRq3i%M)P$zZ9Tc0u`XbRz4rQ&)ycxC*?oj&pOA0_bxi98;M;ZIf% z2TlEK;_Tn)btO?)WGExx2e0M*ntVv6nVXO%7_=+#9%MXVahAYIXxwLUyidB1Rs$-5 zZYnz+cWwuLl{sI9h2I(y?#qHUbUDJnU(ISF@z)xEzze=6y?G~?YWhtg)?|BSwUgAa zDj(}nQ8?PSQSsz2!gFbU{8Tk5>`FwW2Yf zrRCE7jF})p0geuD*B+?~c3*b?Gd1_%)Zw zub7zpEh=`eFcIfnh68us=MB(Cd|w6L|v*N+iMl`&NHW#0fD-KUaO=MwQpebmvbVkXV13 zjPmz1I#;O81nkwFG`*4Er(%O`;$Lbn`;lx@!NUn#no|>e|0+8C>#-i zzYIILk}7*{YNgC;&bQmn^QGf3lN&9e(s9>Pi@Dh#jfMNpDCgpYwI>`%+_`?NCTVvl>mvS15Nqo@%*%H^v! zIB(C8DVU<|8fkU)HW^+=}iR zl33}XEJ#h`oy<0W@$;*mD=C7yVPzihTV=iTN=jiWFPD56;WB+ z;T`p!zTEdp@Fl3UYu^l0ruu2?Op=a_S~=35gD2GG`iTmuYZvN&2JM1_?GDX>g*OdOphi_c>DQkk zyQTqW3EK^Uf}N9i8?7^&U~ffxWT+%g8jNz&_bG6ke7m&-aDWro9c^*~<*FKwy-VH; zuZ7hiE{0-lW{X6@S6HujWP-7?=ShQ{sGnFQR>lwV-~_7X!Oq_TUk)`sfeM*ozeFp5 zWtktgDrY|-s#Aphb7?*ne#vUWQe(@5r_=(U*AzXXvL>9jP}26X zp%l3esAC~I`-|O#HeV$~SCeA`cwW|B`phmmJztHnmTP=AnFAtkd>egY{$g_&h#3H7 zoR_wVb~ORk(KM;O>)-%Q@D^77fgZuGmrIme-Bn0)(t5e-%{OJ4GyyLxhvq6Lw8)uy zA?&Kw>!Z*1!j61dof-ejR|uw8oT-?e;`j4$-4B?M07EMgJ)$Ar%kkji_UIt66=D_E zzkkCsN6#or*^TEgQ#GhaN?!e6{Lixo_$vD=FP>qcoF(c`Ra@}cK5N~ z>5XCEJrSTlKjq!jhH&Q0NN59#Y{&>pgFspp5>0~!c3U)9G3x0hA557FR z7jc^Gz5t3~h!Ck-ttS6P7M^HXz>Bsmz6Y$w$I=61Rm+1H+CG>uaN3NnwkKgExY8;HxUpq9Qy^K6dgzCepu+)+t{0E<@@27<+ zA-u)@SSV0@AD>#bbaG}b3lm0R6YJzEAZWCjvH`*Jx>gFBRy${7eLJ#$al|(U-Hy#_ zExj{tt$Q_8>DL`|k_GMXskQ@za{lm1z)^z!J^hv5$8hK4>67T5T&&h+*`N55CS;Dn z=}>-&bU`?y(8QRk)D(9+ST9^cH}J;IU@}9Bbvj0Wt}(tc-j-&#H6usy^fSO*yWU@i zCHTI{OcQ^*f_wvwLN8IPag)9(Ye<{xP1E5pka^rJzb97>1lDF`(JjvL-U~Lk=}UU= z4O3pOY>$fTgBhWKi}zS|cM3F7y62N)0S>`cX5L(~OTe$#$nePh?~Fh6+xyx)$HPG( zvKx16ncL;Wz}gT_glH#pKinB!s3ErvKfL9Q7N=qkUZh;LuWBkQc<6Ryr$zN7Z>74# zX~uJPR8i@M^$z9S@2Rg;8ij=Q4yJwb=2RVo-H2^te6GP9jHorFpi@zg3q8$R19&8r zJ#)gZ#+br0qe7gz=Mib=gTIl|w?f(ds7gFYcqrxAR<foT2`)zLXm&HEX# zq!xUoO`iDco!^N@YkxGzqns>)#y1`y3kbUXxT#nfR=(#bDklSMZa)}l9t_w+~U9AJT!#37>o@- z=0hw8T)c0Nygd7E^Awq~#tA8x1XsoD-#dRE=zsvd8b1!a8$^vyA)CTwp{V!LNbQEO z{Tl4IE4~nQLnd95>F56Y@U+z+qEUz7s=9J`9G-qVT0XTan4I1+JT<58as>7h9jc_K zyjei=xdN{vS?3ZgL*(IuE5T+(&f;x0?BdpN?wWeac5>{e*D(j3UHN$MR4x7Btnas7 z@j@FT{@cs*Z`7EQci;Ru~l%L5+^Q62iGak@*6@ z_|LDu-jM12r5oIoS`F7nU>b z+A8qww@5V1TH?Mt`f;(3wr2kgeFr!5s*IxALE+P6-@RY_!Ya)hzFOOV zq+9t1$lXv~exFLtRHGqT)oqvX-cYoFz_AwX{8aj#BgN2&>xBDpIl!}iM^^Aa3{BSO?kQF)wTB6;9E;6G-&vHsD>#HW-fC>c)JwZD2vt*LmL zn?*$OT=n-04RG1vwFL+6m1XpU7U|9mTVI4Sum{0_XncbuBHr!(7)hhq1yT6&hi9G7 z;R;~{?TGGrGH53V8E!<*N#ZDkg*t0f@u_g$7-K=C z(AWO2SCPXxP{%F0p~07>JxOneZw^y2gfYz@5t_|Kh_xrv5<=yS!t9icBH|V_4L;4o z!r__}j2MHF72tOtWe><;J2T4^U68sugZW`GtZkjrw|+a4Q5c_f*$8a^)?1@6htKaM z6$59OMiDaIHj%?q(c#WQ$7j`8Btqxtk@_5tSt{i?IiGI%E^XnBdhMmQ(#$iJtP86v(dl8EoGt|H=ju^(+6 zoh`+ z+1Ku$Qn|<~iWOhz=_%x;nzxj_+TKGZz=76zoBlvOg!BFl_Vq`wKn)L~D7ek81il7J zaXCmj80*LYn`*;$17Lp@raRy2-M^@AS1qS5uQ=jr=5AS7+Vi8>>9TXpm^MuJLx1$t zwLQMQWKJyV7rss6G#XZZ8hT;umU1i`E=cZvQ6se3s3)tIh%Hm&J{g4kZ6*Z=e%E$`By@IolYX^ zsNuSmKH-JA)^7XlK>aP!9>`iqpDD=Z9#AuZYrVpp-bC6>ZqQ1S-{?3bsJ#4x?uNd9 zIv5YJ)h-Ma+wU5^1mZ_Yx7K#|{EY_(xjwl9^Z4fv&1-H!MKcn?J&^M=zK?4(0%7WF zw~5{>=O+9+U75AuqH;r&9TJR$3u2)tObUeZ?RIEG~ z|X^*R;*}>8K^BEGLTtPqx#f%eAs)vUkPiyo8-kGD99&$@F=9%jE9`o zfqacMa1hp99h}|}J!P<2Vjn1dQgAPe`{|qFf$of_+zGjqa6{ETQ;E$kyUg%-d1GGH zG|$h&CjNmPUj-G<9GKW<5y=!BFkQSIovufIR1EYO_`Azfmbw`a3}7;M*EVbh3YClN z0l>-X{*-sZrYBJDaQLnhoHnj6|MRndQ%?T}FuyaU_S}U0|L|HC^%SdR?$y*75*RWE zu;DL>72T=hiyNo(7hf?}CtC}GV4%a1^^%)U4t6eB9GH%F33XaWv8UspN3?o7*{b;x zY;;!sd1oVw&mG$(dkt}|6C&hx&(vDb4~bj&grJqICA1JzHhfmDj`Lc?1)RO{WaE%! zPjC7=t09_25ZW{2tlh+^evrvUm0PsmKI-Gz@PfL}Cydp;<@Tq#Ow&?l{nGHl^&T3e z2z5LyS&f6L_9%&fxd$iQUI<`b0$pT!E=%cbj(we;Ow!?o>9z(q&C#hbOWT!EA!QeX z?wjK!c|B?;NfBye`&$BvE6VEQg1L`DTo?vZNDn3l*c=$Dik7K~Q%3Ad?968HlPaKK ztg?_(Q48z(#s$|)tdM4o6Wrn8RQG}hr@X*}Z|i4&a|7r6fsLAi;AN6vj!*jkGq4ko zlTCQ;WZY%@LE!2F{XG}ED-0+CHA5^#Kn#vMC3&oS=UWc2fm%80LNIne^~V36N^P+u z7#aUxU(Hqtlpwtmw5hn(NLWwAg8Sze_MM46Z#icj4-K9YBG-*{l*Wv3z$EQA3kQ<@D3PCr5Kp~sUAQ`m$i0g+9jrM}G#V4)|VfsB@Q z(?nN9(dDTW?G9fzhV09Zs^OB?f&(@OJkOmyZ~s6H_~G=H;352N-;S+=l3GNr;9(tW z0nZtphF?{vFP51mtxXm&rYbtE+o`ek3>^waS64?7mDz2eIB|=##2TY+QUr#k#(kEz zdv=U{X;)8=|7VDR)zt96*M&7i-m^U-81^OPW-qYfehMY@PvhPB$t`JjjAo#Q|wiU=^i~AdD?p!=~Ff0n~ak z6nkuB%%IkPAG*^RmRa!kBM~C~@0WIy8)z2&B-JEDVy515hL%)JvPhumWRo>GIk_z9 zy#R-;nn4(9g%d{^|rA4?CyTwLnM>K#UsmA2fIInG))8a2&Xc2C$IV;SB zk}2A(Dm~Gk-Al8G#-R_M3AnQm4HTAd&KjQ)d*Rc(o(jwi?}$#w{iGEBrL&b1YM!?| zc2f`UX5xhr61mSJ70H2Z%%>^_tv-2CB*-IDh<{+Fmut=#)2jv%9hIhiA!t$-8sK7% zmr`ez|0JgGp4NC#Lf35%NS@K5#jx%bH*%x(G z{79n52$%MjJX}%B09NPKL`YW{1Hk+1qbt|P`MxTcm`O0c`!QD|-f`D5`5Xf?I@$_@ zoX&}7;Qo|?l zRAKWEm(v!B=_WXxX3x_GQIUMjf#_XmKKza5n@^l?djE=uJO~xAE?t5%3*dYR(C8P( ztyYf#fM-#($F;YVo8nB!>9vTH3>W&_yR?~PSKGdWKjI#V14JaY^@~wA>3)2&b@t z=Y_d{h$jVv;n0>Zn^%L^kh)KS#=NMz5dGgs3@7!w+M;GG$#di!vF0HvBK1s#7F7M4 zXa3zLE4OlkqUFpxlRZ|y!G=1YVz=^s>uk^Zkd$Vaop}!mS2cW6P9McB9!TjwQ+ZE`iyn|MH6{yixO89Ad793KHkhdQA{29(vU=QAXIizXaQhMO3ZcnZk??;UwFk;5T$D3x77Y&6ok%(Ns2&NM`PF zM1{5Pa$ea>gmSJl`TSi)R19OS8|$U6Rmg+1bm{`gQ0gbk`YWiTt}?8Xi9PVa`P<-H z&}45<6H?VzNNprntOgRqcTG49ZzT8_urW5vR*_#t(r`YZMiaxis;UQkw*9|AH&?%E zB(@kIZRV+({wwK2cFUH@+ZEC{TY()<-{$(kWiA|N1F)viC6HA6Ym)&u*LSTD4QYhY z6tW-s-DR3I{@GKFCp`73>qehT2hZfk_rBlwyx(#*z2^?mOOmb+&s;);_Hn-L=80vR zY^%@UJejweh3^-7|Il#~NSPk@zgWX?l_owu*4RVosT7Slq>5#zDd~hFH;l|8oIVDz z2o&&x4Ls^R+_aWXa|x~EGZ*|?(@P@&?PnSv$VDq0<=|kin*Z1$csU5u^1oZ6_3bi1 zf~p|PIXeBbl6ot5m=zn$&L00?aH>z%2iEAe&i^btp#HD0h}247yM$7ks~_8hVc906 zCEOVmQgPWCz;xO0voU}v?lc%1*rfML_Z4rvFiKulB>7cluy$Qqd##)Pn2J$QuGK*8ohOSR8Tbl#A>!aYmHa;Z5(PFofP>1}7;Wf$LaK%L3 z=D8Nt}gXF{T4RDEPl5%0Fu+%`PzVTD|~>T%xp$&lq1 zXaE{M6m18cciu$y$l6A@{+EUKbkg4F(j6(Un&dF2Li8PDXTRcD6YA@nn8za>_@+pI z8uFXp@79a`!H3D`KuxocEo;mk_-%1BT|h zLyiO&H+o4XD@R{F6y@3y=Q?N1)WK#B4mX8eE&W5MoADB^4;Ia|HVe`21lNb#2$Gd(3^=sEJ4lhAF?liJ?-uB7s%5s+ zw@>3se7PK?yerft(@qM{R9yZob{?Setni0)PUBvj>7zmEm=qZ&D|Ea$G)?G(6G@dqj7BPKSW_G16TsEeOv!g zOLI0KPa&Hm{w#;pJ_%D-XsofTay~A=0kjir{72VFb>yApA#m{YB{^rAwfC3OZo1DX zLFZ+z#MQalYekufhV2?=MmdU9GpLUg%!vRC(CR{dWbPq5krLqmeV>0cwG6a-)GrgNl zzo~F9qWVi_a?^|S3l$5VWYlS0(qyBU-goUXd#S<9K`3Auq)XC$ooCj@4BZFxR| zF}zNqAR4V&w_9gxY!UP5n48{ijAE^mGj*M+Ng=c)BY$csc=m%I3WA?CF#|FAR%&mERlNvY90CGaa^!XeXRab$Ar5p8Qs5$bZ?O1~tIPB=Gvz~xq>km0Xf{-Z4tGkm{k zu6^FCrl0@A2neshqO+zfnm)*r99)%uAR-75hIrgPxH zS&=t@gX=vj0!XC{T>t|Bam-M!h?X9MlI;7HZ9vR`gc}0f+j$UD<{rL8yyxj_=C3~j z)19FPW(mz_fp8#bEA?iY9@Xa1;-GU$?$5r04bnRUAu*VC?ldn zkigaarf8@hahiq0Uk3g>_sgKTs`@TX`KISmmq#Jp)8!F=@3Q1_?IwdI1s`)m{n4@U zlPHT#*>ij5w~aW#6|)kScQTk9^u;vqZ9zpDdI>&(P1WO}U<$qHqa&^XcN0)QI4Kru zROKPu2NE(?oUVyD0;DiV@BnSxMw_4YC~R0fD*d35N-}-sa`<~lJxd7OF?dkxLxMx$ z)cN67;LiA!lY3W?Rkcw-d?Ek-utCm-eX;=VeVbJ@08`S7VyA2|B(uto&B!pp#=$t~ znFtVdA||xNE?K}D(6_bD9^Eye(iw*n_28u@nNrCB9=Ay&7am2N7OSF+D6I?aM;Hkm zWUK|NExG^?D>WrJHBd0K)tNiyD`kvsxa_;|n~`uU`Q9MnK@#0+-_t{AVA%ql1h5nV zs8zc-lo^Mn{TcSqq*-0m1}~;~Hy6ox5zUf`)7{m2Rn|}Mu6hxZ3lrwN`%&pM+%n{G zp>t4_Kk}l{MX8G3JWIc#s4(jbg97)CiA~iW0hVbIc+us9yhJ=7qm z$LEIV1;n{xf|Buj2*Wsv5q{A?^c<5Fa@Z$%Z7me6@oiG29Qrsn0~viOtoIbjSp0Q zdH9P*=gyT=j;VvZm*)oD+|{mUIk-$#Pvc5D;wm4E*?FSUJ45h&1J z1GQN(o-2(38vfYF45uxO5KB@~zUuU_aMeYO1DZKaOW$B*xx=cW()1;RGnH@)iwCTUywrAjinmc` zhG)Oq%X{uKX~pEI;%Rj=3$+l)ly8~9)*GoUJwLm-*=>t>llu1^=`4}5Wax4jw4CdK zF;W5i`?D)Ulh|q{%e3E+eONnj+Tprca?flchZpzWUO8X}Kp%5tIEHD)v1{y(jk!_)kj73z&i}lrN00*Q^j}ca z|7b&k>l-K4&R46A6Lxr+9 zQZpV4UFhKTu;TrlFFIJ?EzW;c3Q^JGiP6k@;p%m^#w6U<7MkkF=R6lrl01f%+?p+a z7`+ES`aZ+(1Zu^dzYNvwWx*<0KRI^6ucCN#Y*g$5cEd%UkgF);tg7@qcg{Msdjly- zoSpJC;^(vQvwCKm8T1ST{X-U`U}}l8b|c7P=-3so{AO|HYTL~cYs{-0xkp_63RlGG zRwJarAyf(L%%IB*0d|gs3>!Qj0kW=_3ikd7+8P7xtt%ANL$h-;y&ks3h#b(iNcDp7 z4J8BjzAQN3fgX--MrOV{KEx|pD=!+M-Q1u*`^85h6cng)9xA&ma6@Nzv?$To)8okc zdY1FVirLA8q0ooqw(|wQ`oCB|6Y}kwnVIiuULRdypd3XGkCy-J_Kvus!>OBnBYkmB|?#qk{PXByjz46Gq7P-XTLIJ|1D+R8O;hD(mhsO#83F`t!C?sE3s z_I0(a$ML670$YRM(4oFy)q318t3mV1)Fc7j$Z2UP7LnMDq!$D?tNu%y??t?9LUIO_ z%cgBEA}2V=&j;Wz%56f(S0EA5Dxm!V%|j#?W@b!*FoG*rdR61L0ZS9>L@&HB%xw+> z7>xaNWrYro_6~jwnY}^w7w*Qwu;m1He#)q zx<-$q0cxLm89`aC7OMYb4)~XUhme3MR~iRt8^cQ&Dy=zVKk!Ngkjr!ol{=xe%67NS z{k&@w^DGgASd?y|dTb}d#TV8s%gry*%ohJ{X#r^@8{8@VO{9Mu_A^YtS0CU}#AdIU zoHJb7G%MNfm--m}HSQy901qrs|+ z$fWuL=a!;>9TfM_?ci`BFL%`ORL)7rjYUM{CT5$KOi09BOB zDauZXTL(#OW6CTqi2aaqD0G&lV&-d26FUNW2B6$ik%B!LZ(I(tbF8Ze1{j6i9~P0R zi?VlY`c3^r)b~ijZrWDmp9|eQJbyl#ZZ+g9N54Hb$G5C+`=I7HZRVa05WvBb;NJ&I zL_P@LmsK=u_&Z${oZajtK*fy9R`37?{1?>mB})b2#dZ=vh7xa+LmE-l2@1IK(r3`I zV~@atS_+UhhD+houN`-gOQ3X%ULkyEXuPXD%gTHLf%4FIW-f(j{POL-`rO&H#e=AO*4GVv zw90uZ%thwi8ftPi?1?Mrz34@wGY=R}^YX^E(AI5t9mUcGvT8~7?bc;asfu+&os@?I z%54Ej)^siVp)D~a+1L8DX^RrS_ON+o5I{0;NER`9NemTllP8>7N|gljlBrSq83OFY z=Z3o(A1aUhZD}hz+PLw$seW###@j{L>nyy%Qo~uD&24q7^O6!fi1Rl~V0jRD5t2>h zJ{GgwvHup?K^$@5%^8*t&GIFxDZTJlfVPo4&FINz9jb6d!}kzi@HNoy7{EMgqF9FW zvf+OWoG^`AGon?MHV|}1?*usaIUp2ZQZW)4+t?eG} z^CLDfI zyAxtNHcHVp77ei&>VD;v{^K&i?kbafB7&lwc}!a6CGcb~^eF0KA^6*LH%Ck&A~woj z*r3oYc8qyOj6Yf@<)sQ!*}xo-6QHXU?PT0v(;7{KN<-WLg_H#s#W=(Fu!6f`ND{r; z{GuuV^9XREeu-QX00L%L9{{+JZP*8Gs_ei`-D>bp4KeBl8)mYyyEVS$HCNufz_ZXJ zCo>aBKzXT+{Eknp*$23=>;Uhvf4mDZc78Xt-5Rj)S=nHyF(1llmeF(Ma}86Vj|_yL zD9yh}eM&dRD9y>z(W1(@Ga`X|rU3uP>93aKQB&78`ZGzBl%n(eYr4Q=$X>O{J&tM4 zQ08HU6%X#ciBvMFeUi8!`jQd3ZAz60N~xv)^n>0C#6pCQ!x=|eq>g+=>I!o}DH1Q7 zX3z@RvFe*}gF(MMKcg*8i`nfyQp$>@9nC^_(*<7ha&`hGV zg;3J-+0n2Q@+PkLfD7-cqd4|udR(`-`VPiH=g-!~!R!k_$XyKS3A?C(4F^o2LAVNtprY7WQqK% zJ0S{|P3pZ2;Yw28X4_9}7j7jCu(vh3YAd^6p6#`Dx&pU>J!cen#|U{I@jpjs(s?Ct zYqjQWLC{23vb20jtKg$=FQS4-5oJ~v#ZxZfh4H-XMPa8pI2j66tWNQ>Z2&93VTUZv z@4bmuG6COMlJ;Q8j^qj=AM!_Xqt8w}jo7Rftt(V$+cHsQk`q=)5iIDxN8ZKd2(UJ; z-xvtA8X`rwGtAz+%?@D8xj;N63VH{)ZV|M}@LAz2#ARBl(z{s&7_8n;De1X{X0*nI zRo9RgjL0^Itz=-(VIW}a0UJY6Ofd* zPMaDLz%h5ZTJK<;5J)`@#CyDfysLTR%Kb3YixUEG0)RXp|Fu#g@zFbmpK>0392n%O&C;DucUHkun4d=jYk*yE z0~|q?@*#{5H=H`GoQ(KJY3`B9wny>t4;}}acI6|dyf2A}7=*wE;??BoR2P8^inzO( z8sgMd_ynqnOtCl#F^lQ)F-qErboPpN#`OoGfg*!A@3um3el>i&p)=sT|7RM#nJs~g zMLNc60zLf666g5}P{;K5&J@|KTv=iCh4H6jw8z{D@*7)1 zn7cI7H#UH1aIk500+4Z=D8FSp)Qd&7@G z$Yv*+wTP#^lxS8eW2;IptG}_bsd_&=-=YOBwql{lCu<3nMgCvXAqTdtgoQ6Q1ZAIe zrsW^1)dB-|TD%kc`yLA;{4I8ZZ~+8K{;!)V{&6*U;gB+PwOwUuvq>*LZ))f*Xp)`Q z?zl+B82Gvnq|^a?q@qP|?zC=53}IbpvE6k!3DPLZyXp=wqiT58m0B3qpC?GRcTmn! z#bv^y15Y_6FT;B=Y1?E=;v}~lq9T>(E65K=3$YbuveG+ccA&8z^^@JL0|@=kY>OpX z>Ft>fWM-n3f!PhxG8pI5(PwB4{FQpdZ%293vC_w6N}TG_)5l&6X~3QKDTu3z&5p3E z&~E+Zr{jSzYHc!%G2Kpyl03E*z>WxD%R(8-c_@zAw(oR8;u0r0EeEt4#VSDda;W#6 zEp+wrl80^|$>)GMd=<6L$_Qw}QK6cw+d2OB{Mq+z=+dgAG~+O$lRJ{_?1QZ;K(cMe z1{zzwfdDGRPMm<{O&H0YT-JYSZfIc@?1jm;8kq9qTi#i z@if}rOS3t2?bBuaj$QF{mnxGFB7CgeHNq!6hd`1(XUi=6v*@nCB;O;`*x3se$ucTOL0Srf2(?B!?7|-s6Rttz%XJ31vX~hM_37h`aAH&#%Kh z_SKSfS4lLG8Kb45EbdVVKpzzX6m%}|>ED^y?w7dF{x#SM3c4sChjTP0H8oynE7nZQTDBpLM>bvm@ z4*a(n*MsBAR98a{l(~!7Aq&-Bj7yn%EC1=%UCBGeiEDSSsK+*3-L|OEo`3^N-==0) zfd;yd3|D7mHDrl5?LT{)0O{3CQpBhl^JV+T9X4-FieUM#q;^OhblFGC4B^ct&gz6o zTdQWbgujj z=k&DVEZ&H__MY7Cr@X=#1 zaaDU=kqJCS)s$CzE)i3H+RpG@H&T2snq(pL<_;j^&y~mS)1(5ChdGf<*DiZ+h65MK1c_{&CnD2H& zW;(}$E!i8VqBpp{n4L>f#?YGs8<)=`4k_UZQvWAL710CYH^f`|_ZW)axzUNHMMQ2s z=HL1p(2X>%Ks&DwyM?>J{Gsc7E>SdF5G+NW(*ljv;&(2rx z^Tp;=K9(syo~G7Wdq_|g4;`|=;^Qe+4H=>?+Mg%g$@^A)TYf$2|p z#V4FJ_ZT(+#x6c!+0-)AO4t-Rq{VrZC}yz9g#W{KAIxS?~H8yxB}};S=#&8L4=Y&uYsXxkO6 zD6e-fkyCQGRK`Z=kb+SZs~!b6$!EM}_Z}cTgSVnRo`gU`U2%R@+IZu+_CMM5-qu&p zoU21R^d{v4M-KEIMd*mmBSDbxyT4`JzakR|{|ENQodZ*yHY!;2pEVewXqkK91RCoj z0Oea?H}*G|`-gD})Zw02ab(};RNx+9WS5>@*?s&keS4@7!ZxeEqFG$VsROccw*Rne zk#`}qGp#?DnEzYqo&L)#m<87De=Et5WWu&pH-c%yWo29FvuLe}o}HcOFpK-?CA(V` z9*p=3TvVo`WhmadMXCHcCAatMwEkzdc1j)lv=j+p@Lj2*pNg#i&&6upBtz_J?m9Da@V`nkX>p3^Oub>!Bv=?K}h#-!{D zp{;m7r1H+B3(Rla`|UPgyKW^)tId4Rc%244A57hUJ?DZd0`TX04`9nbK3D6+1b+b> z?Vt%=vK5p^U8w`dw(6=&6| zPNv;s1P~@F(NE`Luv=#|Rh^Nsf{=i%F<#hj1 zv3N*6FaQLa|LA^vpS!VHa{{TBt>n7uhJZB*f+WbqnCSGW{j;paZ!h=me+)bwAfMY) zx5=&dE?t?qev_!k%DLj>?`=x3Ok~3Lnw|sh;`zAO@{=p!()>r@C zfa3kR_?a!%*T9P4=>tgFo?V)wr~<$sKAv2dp(SKIJLvo##O3w?Z7^hm`kVrH&)7Vf z!3}vm(_8@3a5wlZptBmrdw9;QFnr;dbcLd6jhkkVwHxwi$ErfP4Kz$=iS3 zXwl1l7!Qb*FGaHPpXlrl})$5+Zyou%<2MOKS03;1}$B< zN&j^|y5gtWNulVTlbst(0Q<3BJfmsdyLhb=4-`^sH25l1=J3mP5|fz=8m{EMnItLY zwawxRbg_=;)>G+~D>(q*_Rm|SAAlOtUlHhnUM(@ITWdksXz(Qy|1SW`P@EbO0EFFY!rSV>l(Get% z)OXz+_)H5_<{J&HCX&HYq@y#XCv5akT+zwR|0;59-f9&Eh4# zKDazmZ@Rn$*6dnku3zPRf7rS6&f;o_WPauF26JBavv&X#gXUT9z!QyQF<5EqNv^+V zJpoUv!swwbet8^?YWd+EX_~CkTVeFbb3Cl)(0WD_*6c+Pjj%J%2Ba;6}=driucfgzHBWs=Ur5BLO?PD zm?BX?=2@>^**&CRqg#Om-~rjqMV3zwn1B?I8C?Ow*)qTPLV!S(f5K;(&%~YqdLU31 z!~v<%8?HYPfjCh7yy=EmkGPHf@FuYalH6a=ZC)nzlAZD)$P^N5f1bq{j@qa{0FGOz z=`WDprxQKsudO&|2ax*rwY?nwscF>01=F6as#Tb*r|r|lCGO@8DdITEpdsH3aMCJM ztXLnowfJ@JT|5`ndU|u7>Gfwxdq9i=Xkvg|7#PM5K!)o207R(PD2=nj@|mWyNQ8eq zM)D@I$T90PSotVVWFQaC#^?+Mkf`YHI=V+Go)jQSAoB_y(NU_mN$xm$19|fiRfxgP zJuq3dY4<$}X7+~Kg20krU8{8eo;uM&a4eZdXLeG2070~uhdg}qxSxSc$>(Iby-n}` z;zOc8TUZ=KdRG1zs{OCjp`qo!NiD$ElRf~#mdTkpg!Bij-2lnN=5I6uQZkb(%@kRi z_+AhcfTgZ^0emS*>wiJ0yKx{K8hQ7PrgQ@Te}?RSiUO;wT1CCPr5o8%lfX6}5W$YB zQ2Ws00qj(?*cKy`PY{$L%jk7u!{lj!jIi|)vXRpGyOBb)y$r(3H7;1&qBm{Pskn{^ z4T;)b-I4VW4Wjif_)cm&v{$vKf08q4DV*hj)@DeQ?&l4^A${c$XLEy zs5;n;Jncrbs)Xx6TczQyEkSqX8ilmUTl5ByW&@0=mH3aIz?Mm?e~VD#Xbi}aIlWW8 zp9#~M-us?dDZ*~7!6eOvBmNs0aT{QT;*UUaaT(JV^YZcSR-!C%l%ZsL|7D`%g zKDKn-^pZ+aipoVEAQ5z)MfI;^i9fh7XMjP^B-)@?_LzSey}{OQ_`xH5-!B9h@=J$r zdRLG}`2Moj%nP89?>UQ4Z&T`bQ!lhusd5d8T>?}5Uv0y^6M;4KR=?LbfB>|< z`V3(|+qn7)2ZAvJSSi2>gDl(WhP(j8+#?H-BRm^9CClXCzc_?eD)@35HFZcf{;VGd zupDINHVNtN1itfE3@G@#au3b?r&0j1tfSX*^WR~67C7*?K0zcD&wwec^}fxc?b&sC zs`5HwJ7C5mBZy{on2$B9php(KAo^j?{=p#XPz|foyPjF)gf`j3d zpndx9y-QpkV|d7J z{)<=Z_kSL281Tohy|Vu(MIbOUxS{3$7!L2x71uxRl@C!+;%!{4c;iX; zHJxj3K21L<_aClLx;5X%#qYPO7O;8cZj498f5gwfM9Iu03GMa3c;4UKuj5r*!9Gim zAhM=^%NTh8-2WH!dyambe7aNr1qlDUJBA!}V4peT{*U>dWs)}T3xAtJ)FA(D`n+R# zl_`7pcSb+gkYXyH$Z%QoC!TCCl#JJZ0}!2q7Mb7syR03M0$p}!x; z=HpAR3dh*2G#l=KSPB|qsWGVqe^)iYx1vz~Mzm%?*fs<)6+_c=JbM-ZdHrB8q6(^; zYi%me7+-xn)wEuy6))VY`H&5qHDMt5>~$yh&bxi*GbWF=P4XxKuf4OuSWT1M24_K3 zye|2nGi~K-L!!klS8U22J6R5H&iD7kfDL=I1QAsKEX0oQpiD92nE_$+l^82mAs{*e zv~)o?y@AhkexNAyUm+LR^*?j>In0HC*&tp6RE!`wcGLg3-~Q%N3}gZVYDmaj9cIY- zzi8{pmHOY?&P`qw0LC6V^7~s40(WDUgwwC!Fm5 zmI9~)jyWMmx(`WRc_Plt4(`iZaNf>ohZXMroR?1$Su5kP9d4_x#4N)?H`zfR+TO*d zIn7y5r7AtLMS~}l1F$VBtyje!6xKJbF^pb09vUb&i5Koza?3m`H*t(!PQ2TMD}U~$ zP8uCtbz9bbpFgQR^;Fsvbge(6PC7x@oN()#aW5MPI{nhT8vf5Wa?4k;X^#v+o_5%L zT%dD}8{YiLpwsf7w_X4IhTGM54~nB9YtHZCSs5s9ef7sW8L~-N-{-RbUeA;O$4t_! zIO~G`b|Jf*eBf>u-}!vi1nfs}n(#G@_b`HOaWv@p+iZmw^2<|aXP(z{kcV6XsWfCa zs}2FQyywQr3c{XsTE`3iaR??QQi>iK+DamdV>S~__oqC<^B_(*< zJvIE{WnbXs13ne3H=&4%ygIPfp1+!(!F$U|a2{?q)dm%pHmW=z`j%c zOA&O{_OwU33G(u`xVfa`mCPhRMO?8eJby>dZwAyTIu{ETCjM=%Z9Kq(@;gYw; z=yawe2kI&a(i^`;{DcJ{eta;Gu;tZ+6;vn4XQJ z2twJU@w{8`1T8KQFEBS{0z>k;+?ggo`>N%^%6h?Jq3j`N4-@d3Y(Ou_cN=xE$pr`# zNxog40M9sh%T95Wru$@QM(r@P@a*&;`2&`LyP%OQ#nx4889LZI(3@3YXf1XDALMe@ zR>3@Qys_r3C3Nrte#tchWmBGuB1$yj9qu(`q__7_He)>37N1?CaX9F7+hyf(x?W?3 z7BaZhW>2p+S$NOFPn9dY97#Zs5d->v(6pJ@s>`zH$)}@(4EZr?Gc7rS+MgZXAp{UZ z76A@TtaW%jV86*?y$<|ebNYZNvgFjWAj)!R7`U&+winK(JnyQkr5l)w0Cxc5M*%I{ z>yHa<%|#!}16t`kR}l!gfDY2^t>WK?srvlAk#(u;3}JYgILP6(-8)8ha0)f--Qd9 zz{HQPC_c;K9uReO*n^DzE%m|3-hE%;uEj3o@-ZHW8ria!Rx{|pSf0ZtplqgitX={a zGi7Hv%__W{$+OQc@@PGIB1bT9mM{pJdJ({|$)4+{ZG*S`bf{M@c3mhcZo;Ss?!3?5 z_=ITqeRYd82aGie4my22is~6ad9-tW9v7Vza9(r8)5O`vL(L#G(7AG8(md{>?+xm< zKFsBU5Y8Y*9&OHRhV?p)2cH%0T@H`WqAU8zxkyokL%87Q#JOy+Vp%{9%LIk zS~}vSg-la6XFpE9_^V&CWCLyY-c191?w`t@+98(5$x^zJTOO~^(tV8bu1Gw3nBhZ! zxRT~HVBuqEz!=Ntb5H2ct}zKrEN42J3vKVE34atfFJJ}(j=1i7s&kh*bMCpe-lqFF zNiK`92^f&Y22>s;$=zo$b5ad?Ku_(QX6M#*d{5oGUDZ3@1yg^QuYg;5NUesP@-9$Z zv^;qp#qn`6yL{E5&f?{Z7xfxc#e}_Gd^F|XBh*c*V~Qug#=Nw%&VK@KK2@OzbfpWw zmS&BY)*o=X3e7Cg06LibEV^tC3>Y|VVg_yCZsVeG;H0|k?tDTJV&t<_*m%(y{H4yZ zhdfViAgJU*=2@oU;YE<>VHBj35#$4T?&()8S0^!d&Oif-TRu-MbIom+m^-hsAP=M( zy4wZ^I?sb3-giGMe1V6&u(i>$1uc^|9NoyV8txDfjox!r>m8T&6$?V(dQ6Hw66hDt!b*_Azr9+4I((bc&z;b zdtv+P=(A7Av8y%GCg6x!z|d-6?D`En-4D?iH20qD)c{7^eT3WWza$(U8HWVviaZ@{ zf(Xjiy^P+(CE$hGgt`@9dTkZ~_lW0Rz~YCjH$WWtFhGo``_woSa`*Vbhz^)w{J_H# z-=-imV9 zPp*C7TXjfSn^XkNOfv0f0gjb;ej=B7Qr7t#9Ou2{GFQ3NA)fdhn5;;7sH>1k4T%h0 zY9%%3cvvn1C^vGv1A=%rnV#aPmZThEE zQwDy|c3oz!YHOCjYwYyf_TJZ@Thc__;$9A%nUS*lG@RlmJSA+e{fceQ-1n=1M@Fcm z&DedQKH*Y$vTS)8vf1(B^LRBU3t)!%ZgsuM^ECJSsl?K?7MBF*PFFu|$7?3`E1OUX z8aWTntG07J#0Hv(ZcH3QNV;Vc#q}+#RZ`&wrTZET_gdz<2`%D36Wm+HI7?T0x2@gF z>6ah65+SD;gXX9el_F)8WDe=R?B_*64=ey0aw9E0Gu5$2Hd#5@%vc39XQxaFE z2Xn(bqRZAtcHhOWkq_q6*QrxW``=k(a7B~(Qdia9rZ)-ME`m$pzWsc|pXKL-;yJv= zM6k>Yd+;K||L5aW3(5tDDQN#;+umj+u4UwBjY>)~!O^)&Z#msmRNWEf>P7wImqYvJ zuNs5}H(9%P>38dg_D1etJb0_Zg-5c2g}L?9**i+hy;*%{(CJUka)M!>^KplX0j-$( z>NSdKz__;a#+$kmC?O5|Oab9sb>qV)^;6(uPZ{KM6?%kQyc+jy`^Lv({X=^Pu1|%= z^{ZufcuTyqcXS?!!68Xxdf`Foa$Iyfbqll}(?6N>>-0NQ4r<1)@bU6aAChZI#T^fV zh;^?(@tZ9sSNipXKL&l8jx4yyf;_@Rd1be#%bIky1l?jSTYJxa?z|;gs}OGSvFyh$ zTpe34i(^yqz4HTXTSdFmkIW^%w^0sQ%X{!@IZZ^a9M+eZlydTjuGr@^I=GeA+{1<# zj?x|87T7W_45Ogirb2g!d?qd>xnbNTpFbR2vE9(0bPRrNAZ-K2cdnVvZZTNuSlC`9 zFvGn_@ef(@o(22xf)4Hl4GLS@iq3@jgnCz~k$tZ@h@>ts()T-$^4s#fl}c1JQWOr| zWvCziiWe)zo^TlQju=%wGAn z-XODBV6~Sor&S)8{=KmbL5!-!(cp5>pHjQU**qh@h7NA}RZwsn+=LfH z0A-z{!Z`1ni9q^;UfbeKU3A+TL4S1oyZ0v+^$*@7ZIz5uGK8N&_c?L?nM(u>bF^-k z8$u&DYs9It?q0R5ie*iA6Klt9+uZJ5KUW*DLc+f<{ZuZ4kA8Ilhua~ts@@Xiu+~u* z`Mcz7kkPQC4mseCCZnOUOmJ0Q614ht*R)_^)hk1W6YfebRi={d~Rxd?r;(2gP^QWVTWMRJc+gF+r! z9$Aknvks{sI1pYsd9n`rM-Ry|<$P+7!Hwg{-SDbU+nY&H(a$5X+8G9 zaY!gO{_t|%dlq^hnzZxF)-cLKFXrlmtYub?=Af2l;mr`g@||wmMQPF)C(p!D79X#A z3WGVe;KlUfiqF!K33pi{=RP#}M#Ksv!N01elx0-Igdi)IdzIebTjVBI7=kR}yZ zp{c9u@&uofaXJmP4uyc1A*vR|qYmv0o#his4&I;g`JdbGI_!tj(o+u6mNqvcWj-pU zI~f7T!LB9Q6uM*)d6|dDSR%BkU=z_~|CGe3A8{II6x@#bSb}c@R4Xn>`h=TD!r;bt zPC6YHmn>kwM&gRW-_eoZQ^(NFnmEyYVHHlE1Zz=PD!rGVVVh)flSOM}I!(=3B{ag~HtU#b7^_BpKL`Y&aLC%)d~34TP{}<>!7YpV5>|f6%ykM*($}_dH-LFIhW%kms$v`bxcbHQ zX)h7nQ>>+NuD92lRi75O4wO{>_ptweu8ze-zxKT9s+9P85`-%}OMsRAaE=GlLzB6` zk2O|@n{YwQ#4)Z?za;a$H(Tyk!zd+@)Mqy9s-7SrkHPB=DOuPfym!KVNWFqL?92D$ zQzvpLuFXu*)NNfSa=ejjw^zF^MM2yI(qxVet1c9v-V$#ye3XmmUasm+zmR=)f`Q%> zk&A1BUBalV^8_x)8AQK6pwrs*7HI zcMx;tTRV@$b|=0o4}*#4D*~rARUm`N%NE;p1G4h?gyKWC;xcdAZ|KyI3~Kg#=y(0r z^LW{;a1j>8{)DqyP_ z*DV8d{8l_CVt0br3Cg;W1b*+s?42tmk@saLy7*goSo~Z&Z7;C%#^QBPgz80!;iVcT z~G^JabrN!mj2qI;yu(MuFxrn2L&7_6HicGJP4(a=}TaBM$Y z(VGmDh`h$eL%~l(d|)VJ8VoKE0&&nEd%o zD$CC84YTOm=No1IPxBg- zcw%^6^N}%vmQNHhnN2zP!cDI;z*e3=TwXdwdBn{28CijA(ijZ!9_W_a5?h|S-I=*| zy$l(yh9ZVFS7&VbE+T2<( zJ(?~Ay@UQ80E89ka+F)H@15h`w-;^fyt{sGd6{MxDR+);p2%+lklilZesL{&&F%d_ z{q~5ZKiR0=B=c~z>{TFsfYmYiM6|C6+_rw#EAUo#lK--ev&ECc+#2O#M&n6}np-bm zAxV%sPJ8U(Hnxs$fPZIVjpk>K4C({z{4Co~39J4Cj@37wSgQGX@pasq z*JUrtZ#i>`dspAw@m1O`EmTAkYoU?33#%OzwDsSYmbT>bWE(a%DDZ_jkr!tPyN6tc z4P=)Ud0`%<1B`;YW&HWEGTLF;jDp)cL$27jI**mRS8jZmhfmQ~J7oXZry8)2*aPwE zdVYdtBU>>@{;2oY4O^MBZKGoz`>i@2=%U>fVhJ-Zo*%qfd}??>yMk?jU{AKlsN3LD zJ3)wV-VJr#`XAa$5KweeFFWY5 z4?f6)Uemnt*q8^pmK;W^=LBzOL6qoE>v5fBKd8@ZD>LZp9_kecY6+!gfp-B_Aw`z? zbzt63&Jam?(sb}{_A&U6P)m2Pj_U7pZdb~3ywxnD`!S^-Qs&I@3v=czzH7vFw|>~( zhw!rE68Oy@nj2)6KhWyNX!>O)xj@-K)0nQ46q54(s4-2jQ<#&_8$|uP^HujT<6I<( zUHdVoT$(&PQ_UUTtLCs_4$ph^+;fnpaq2R@04}~o*sSds2Nv(1Ulfw>1^U#jRHfH< zl@=nkwlYRV`01$dsc*vLF2eU^uS&&7v(M$TJH7mzx@Wt( zlFDZ2ZrvvplV(n|-@*L!C#xkPdUoG66oV3=U=7ad;J8Qd6{>>@u7ugApT4p`1|H$|{crizd5Shs;eAB>|goXC9|0SoOH4 z8HD^zDAxr%tLCVoq-R{EGDmB!u)xB=B%+*JbV#s3Hj2N1Q(7S7Kd?pJ~|xY@D>@%wo6=-wT+%otLCh;Ss9R2Qn)*f!TrM zaIrZ9(>qv2`4@^9FFDa@bhPD`L~wlc3?<^l`$9VvB8;j&%|#xPeGuJ2Igzzn+AShj0kg;wm=wEUk_!F`|=d8C71KreB$FC4Q{$K;3+$i)2Vu?!*X1h=*oj zSHgb)Zc`;xvWg>vy(<2B+5eACPI=c{W21E@Y~PXeS}|E2zKlS zIZyR@%~+R2grqZS6tuOUZ*LspPw}+N$n#NsF;`F@*ijnMNLY6D4*2xh?i;7h5;iKE zYTqD#3KxFyG^avDdBsJ76_mWbvJ%zj)Xd@*y*vu3z+N2<rt-iuOd!?LMeWR=TEg|U6m zHZY`KM1qG5@ps#VF_2!W& z;U&B^F*n4J7#p*iD#mvGG0Gd#peJA75YNnC6RBy&bfFhI|K8R!^mY8MEI9>xtOEB6 zCY;?jzyA5(+Z)lGLsqo|U!1`VZ7}gN9+30a{0B8;)tQb zK53=LV~$#vn5sF2CR*d%i1x&{xBS6|k{>ftCihcGW9QMrFy>G|x4IOP7MG_M|3ps{ zn^5q&(><`)uOEL62Nz3qLe23?&N1qbX1YGTpjD)lXdbZ>?0N!E7gfaXx_O!!_1x~a zGwHw8il?aD1LGOB(N%JPKymsikhlcDRq$*V8G{bx5$uSr4_)h_)+|{+P1WJk!Y05- zG^ka>C5=91A;U%Ojl`qg4;fVtoW z`x^x|32reZifoxM0smz4cST{WR<%Wlj!$nYcd+#z7NBfn;CFY92yRqalin%AqP{c> zw_BlanfDJZm6Dy>8Oi)aCLJcI6x1awq|2I)oc|KJUoze_Z(SOJI*~?RxJE%$NjQ%# zS}Ei8tHOl07r91sxb^(n4lg_7a;3B0CRN;X$uH5S^7|z3hFv)R%v`?vxfhzKO32xX z6-F&^zeN1h8qX*@CODvJkt>S-mO+^hL-`=E^mwC>nSmw+OF?Tk_u(ziiOf_((HZH` ziJpYAB>eZJW~xGx_w9#cKUT+b#Ba9hKCuh6PwR>^T>r@FmC3aeM|zx{%)%}%=iK5h18ahyL} zgJ=ABmt+3mvQCK>VXC(T9tbz)^V_X=SeJw)%#14dNhVCynl(H%CK}D}ZSB|sbTl$% zNu$W1h|GM)^VQ|D1s;eTFP``ekB~{{Y`1Qf1lSUX2u-k>1kD)6#eDPCiwkRFZ(l}d z>x3Qdg5O3Q9+)%#Y9H(GFa2FQP%KKuNWC{E`dTWL*{s8#gG@S=-fVm$M%Z2|_4eUu z1v?>qbcNGn@GzKuALq*461%9;4;jwszU~j1m3T|A^H7+pTa8cD}{;epZm(7Gb{p! zo~YrM+kl-66~q@Pm65ydQMYDxvPMj9XeQ$3#LS}>W@tQT+K`IT4`aqe<@yc_y{lXg z>Vk`_awy|QY=A#92qwpJ!aDFNVjA`%N!UI8=i}GYl{gBhZ<`p5XB2b!g8lSjvUnEp zxy`Qa=@->ONJ(o?8(UnxrZ1_<{V-lE;uA%N>>vgP;l(&E;UyJ)o0t;F(Gc(`2_(}zbV83}S7N>=-n1h>Vy0(~YfGR$_^_qPpwQta|A~YY zN5D5F{Kzs;5#G^cu;0LU!!ffBE<=w>;0UJO)y&w9S%`{0rIjYN(G^DdBwjFS^*A;@ z+C?}bTj190h6l>%#qjz14dW#&?;A|@Ku|3S(<3JO&#C2WCExvPhZ%3tM`|xPXPv`L z_eDb5O6oyRl0_Zp^5toe|Im$pZO1;-MT|)B?{~TQRIgm(DB?@uL^xC1duzT;7WB`m z7c!gWT`=pwPRYG~Wu4HsUXDQWt+(QAEfiV|${ttzqW0VH!bX}@$KCdnS_iu2;b7&h<$yo{?Nj(_m zi2E22EpO~|ob;+=C5D~q&6-`m`P=NdSGp>`mF)UoGAlYm!m*fU@x(}CJ1ZDeZW9u} zk+tu1+XadY_olzV_y5)U^$$ZOAxNDQv2XY#JLWhcVowN>0sfIVce*`XHHolc%DW(~ zBL@>}-eIZA;ol94249`qzCug5oR-`xY>00EhVg{awsCIPdxJk|p@c9cyr3&3Unfd2 zF6ML3Z^5J4j21T8#)V`+Cat!_iA*}(AzjUZZRir?yI|QEch+r<+1K0^#Qz=@ z3x%Xm|Mkm4Srd(SH`)C=D7x*@u!vx7= zy@0H z6aC~&A1Ua}(;?VL#43qLH-Z(|vM}ud^`(aw_gH+{8_Br0++n=gk@1Zc-3x4EZSDKW z!jqg;>qcEw`ndBnGGtF{gWBIUl-zN@8I8$1 zcb$mAai`{?99)Z95rz$Y7CfO_c}>|^X1#GG^SGS&_AQn8FAJSnN71--6eGMKigrc{ z4a%XccFIcx&#(D4_?YSET_H3ow_MSVZzf`SDUC$cWqPaQ+9Sm@q^mk2e=K~(9U6Y` zR}acLr|r(t!2vvLRcdq1P{Okpt7KCQx*S&Y*%zh(HlIU{(lO?=WWu4y z&zPoN6$X)w*hPYR;-N?kz8bt3TX@B+R| zjyvNAx;i57d}$PO#0z2XsC(!5ch@jE_;d1Gh%Rq}(f3aBeX{9Hz8|5bu~xr^o`VHt z2M>NX?Z)P8;^3V!80_&C+9u?D+XA--qx=C~gP>zCEp4Fm@o;N}B`wC3~pVar|#L3~2Fp8uX-YU$t^@EWSBYd=&8PKrHF! zG*s_FWeTkt3ZxMX8$fRkk>J!a5H0tGnM8O4k1HJLFCx+rF67iUggO{6^)g}%WiCSK zy}oqLkC#26!?58cgs5lIWj0^}0>hYW!#|I34~dSWPK7G3X|TYln?unZlK}~{j&EW| zxzF8IA~y6!NZz>EG;Q~_@6)%dS*z0*rS(y0G^QXK@yVRMc#ZMR)5)LL|3=s>UUr;Z zN0CwkX-s}{Df+^<_BDC6a0s%-x*nNRQWz$dTtsCmNaaho@`c>|;kT4^vQUgNU%zj+ zqegb~d$#O?$Y>(4P3Uu|Nzq`@m@0eAfqLs7YxFhsAJlg!YHA~OEt}rhch;4F!VS^G z7j3vb2}{EHJ6xJ1a_Nuvy9zhh=*4zZda1s}k#v61#lz*XNc&Z7TneQbEout)p%FfImU90;ZH)fKVF}b2l|;i z8I23+WT1u2GM5ER3F7(gcSLu+L#>Fq%4}MnPJOS^jbjMIuRh?AY$#Bpg?E>PP`^gKBJdY!$Y#>|B0NC%%e|vk9W5i#TG!Msb$6K&?p#nS zQ!Nnwc#MwrEJ}-*%THblyZq`ZVTdTyZ~HyK5E`oHq?XdfHe_ey4>pT%h=fw4I>#NE zDca4b#eT37`BA=cAJ?~fLX${=B;m0b%wK^?)&FM057EdNHnPg^zUNHhJInUNO-!my z?j7^-ww}r{mzV{;Ju)L!Y}Rs*9aa+*`TeOL(dK6J^|$tki?K-c0BILO6?N2*6SGZB zhLmWMbSlPQ>_*5WV=1CE5xrPv%2zO*$#6X^Wm+sCKR@0mLl&t!nwJben&7(h>iwR` zTOx?OdVg!#+d#GdYN=yap<<>e*scvTrr`PLN69Ml4z7%tOFQscXyB%OP0Rcpy}Q>|LWQmJUbhtNdu?STrLtc7EgS z@TpIDu$#_$$vm<6(`4gF2T-=^b8AiQ>EvM@XX^0-rKZ>M%b)LGGLCL}m@xYDT$2}} z3PI6KyeGRFfa=YJ6ZL5)jFkT)h|K*e2z6H;o#a8ix^tD6y?bjwZ%`+jBvfc#oM_<` zKPgpLua)Et5rZQqh~Si`RIuN7i&3%&xeJ%&9>jo{NhGM}q((cc@CW4%gB|B^aGeg8 zn=(z9v_q^{Dl22Y?u9ZBXXW^+D`+Do8X6%4AC1+RQ4MW_7G11vw-Cv`KdXaZi;+E% zq!!y0d2R7zamN4}MIPPkr7N*N?6GXFO@zl>%(V$eF?J-pc@Y%GxD&Yv&ufxDXRD3F z+FeG_Ir-2jJ{TmnFoU9_LN9lNGh*U~DQ=iF#szsOYq*t^2j5Vvnc}a=(7hJ)cE@6* ziXLV|3Do$m{R<8)fWY*E+J`kJ@vRz>&>yME4~4};JvI`-{dS2W-5cS=WF3ur`=aTxMWr!(F5Ck`n35y9#*M=&9fzw7zh@wfTRD4vD;!Hr_ifTNNBg zIOu;J6XGLJ)FqP~>qf06eHoO@qK1~MZ$!F!L;1>ZyBa~P;aBO(S(P4qHzL2$33H?$ zBATs{9W$xv2L-9JqDoNJj5-lCHS0ty0WK~MVsL&z-HX8Fq946H)97BKrX(VIOIB!Uko(rGp*}L_t-8Iv^oR=V zwihP3vvH`7L2d}?C!wkY{=APVIVh9Apxz}0^&z^}#+#-3Z~Bh)tMAIOP(qV|`Xu-x zCK^SKQ6ixO;I~B)aE2p})pzufm2%eJutQsEyem7vj@ka$5aiZUA;y>znNPjgWBN*> zbD-zr2l6n)cdH~nroSg+7{uz5IBa4k1Mj=MgW41O4f2FT4{uhMs`h;}fA?uH(tyao z2Xl*1Rj7fb^N+i`@h6^Wif?*ZJ)l z?aBJoSSufBOS|;Zu!sdugIML<%fn}gh8Y|geNX*kg(U1yW^rhw~<6$ymkbE1s z6EsRp48|h-VjKT4$gR-Oc&L8qMU5MwvI#`$V}C-*w+Kl5frA>dV052bAw8R$n(!I-U7+sxdJ@|*TX<{NDvh!;t{xpee+_cq@ z*8&KPzGT+=OTIyLn^kjfFk8$8tg#fk!VnRp7SMdSN-YGckB3I+f2+`Y8HBjE?%UEQ zbmhKRSPVDFK8IR#-vWA}$b=1?4v48U?L`dEpJM8Qdq6eMX##uPp)ff`#6=Za`n zox{o*Z3N{$MK$fVDQa&hTH92SqCR}OzHiGqOZhuiBgeTDN?NoH zh6owNJ3ivuAEuJg!QP3G-u2t@eR1&?L+qf8TR;((jI(bBSW;?J4vMc);F5Z%RD}Hp zf|@)cvRBnOHsvjDmek^MQcS4)m|iyfNlVu`V*aUVIuVrr?3s4!)Cqa%&?@Ecb~M72 zR$_VLiDv5D`0EX|mGWiZ&gGhZxWMfl>)8;xB}8O=t*5Ysnoulvn1_JkAd?SLpIMz> zd5UP*%WOd@(Tk7zYfuklt-#=w!)+5XH^~$2SH{As<&{D~@$^=JP%>i}7^X|;-$j{p zZco_p!4!2b-NDDeN@X@zdV)lQBzN+jU}k-Wz=^?;|iVcGtAXw+Hrhh_QF(>GUAE*-SAN zO3rIUHGQY@siDIH_uOK7%HmKTz8Q_Pc;QX$Qk`$^q~LUt6v9h+2~_XCGdTK%1lBx$ zZ;tjxHvLwU3UXMJo01}j%@sW@o%zkH+=OmXVz!d{SbrHx(w@`4ZM3?3*~+keRN=H7 zF4-vK-im$FuLzcTM%^>={7qU7a@Z62?J}fKxyNtXvZ}1^V9MHh%6=?d{;AUfj^|X; zF4hXX=LzzW4H^^;&2uOoO7Teg$Ujc#gju3m1j`_mGA0&tFN>W?S6FbJ6TZ0+;N zCm2kNBi3eslFAY=(sXviek?I@5li?rP_z>N&HCHKpNmtV-sImYF!9nvU2Fadf1Ze*cr*R%|yHu*{kqL-L zs%GCmmm%Yz>acKp-2P z1j;c?jRF-O9784+-L)g_jb#2`#xG1H(3JKaDY$nSeGRrdtdu=xQy~9}$`^!sZu0|+_ot^CWr|%5wD^{x*d@a~%Sbu(b$v^am&k|?x z6Iygn4u!$%7BNcwg$*8I-{My=DTy|zCq^}aTA{yOc9_mI{vQBYK&HQf;p{cUUS7t4 zFstTJ*h_TsT01DxF<|oVUL=3VEuw99F>0c@wgy0N(?BK2a6X8Llvp_!N(r;j4hPiW z^bukoHHvN;7`u$xqyuQ!uz7$^DSx*`{p=B7=$bOxvDeK&bR5$oGou7c=skF%ojTQm zu3?P*SlJQbg4+;RR#;_(&8#LkU>xOL=t@RMVBf(tgb0UyS8|kW+pKVzN$97-UbWzD zHBoP9J(iB33kb3Ve<>!*iG*+&md9hI>>TinIHi4P@uB&h+Wx|a$`}YVP`lg+o^V$Q2FBcDW}HLDH$rYpI7cd7g)3Gb z%_aaI#Ej(Ug&|n|FhhloR^BfnhA<6NRBCmUv4q3{=eFoj(mc{Gwk9J$7?x+-KP3-JKv57q?{Vc|PXuG`= z+6p7dS)#`Qu7M(?2nPbi(531-!}g)F@-)(o=?&XgnL-*#AA&9Langmp-rocNZ{LcF zVIM8KTUH)|pfx#YrL+fBM=h{PB2HC1>@C@ZFj8JZ=s`lH1rix#w#`Ip>z$+-n|p$4 zNX3y@V^M~*>TYoVSd(coNBO4%jm zHeJAEwwbnmk)-uR+nzh%O1;naXbKWd^~yr_Mgi)MlNG2Q1fhi??AMx_E{H$uBZDm2 zW+0`Koev@Ni#W#02&uUqap0khX$m}tB;DF)< zV*fB8y#y*2gec4Xs@eDeYb8 zP>|OPKqw+&B8E`uV)A=S1vU%LAkc^xWs>AHF4{PUFnsB~oW#ZJ?{ShYce zi1JiEN;&`niT32DOi9Pg-#d4ahh;#A^s;9ct%M<^x)3$cOe^kGAN%C`3vvC4imgTKMsh&5S8xD;=iM3R*FbrC8~Iv}*-jfS#(_i#yOXjOrE>3lh(x6s z$08mQh>U?K^u(O_E=R<{MhuDj>eugr+OjS**kM z6E^j&ATRPhN_+)(2-zgEo(K$&_O8L#%iJx zJ1S)X!5@pc5_Y6BN;YK(9ATr&4S;Rway@Ec3T#BdM}j3dALr1NEpr-#PP7b#?Bx+_ z`kCG$a*1exSOR_0m(~<<52Do76;}A6zwSewR>L64cmt9WDsmw&p#X4mr$(%Y9@rWLew1LfH}j;dYu-0x@{DJ z-qg>v!3OXn@S?;UDA$(hIgB2N-aB)aqJ}V=nvcjRpO4qP&c0!5go>1u+#+XS1b+*{ z=G9FDPr#(4v|%OkydCc`lPm24C=q=a8`(P0>Hjerpd$28B}5QvHvF$`79yz~0IH)n zBlXbY8CyH`m(3WtqnX?r$c>_T^kw+4{a4S%OP5TLTanCG4%hLiF9xWh65`U}4X3Dg4SuE5OLA>J$ zj=quO#SgO04DS#`dVkETI-rm>qBx0WOVwrFg7H;`5G@9+;|m6O4*iaRw0-M=JI!?~ zi)V#6uRTY$W!CrL0Xh%=1}99EWR6G}_Ar)U?k;AG90f2By(W2O+ncukl3hb0>{V^S z{bqB?_~@bG{G{C}&14aK? zXlHh9wm=hxF31Dyvf(ar!E^wF-pzzJddc6o&qch`2)S+2CaAV(-i5h9MJOIUKcPE!Yz-p@-E zD1$C3RjKS8$qK|J`(t%cSVI~kOWx2C5F6Lty=C>>CEGj1;hBm^r?DLejG6iL|0l*+)G9tTEM*5y1AtW_nI(}5-Xz&qpKZZ5^m*5twvIe ze1$67hG1rhoVBpE$xPaMR37Is;Ha4$?+s8Y#~>J7QO5efDBy9zS5 zm~4WbPcDdUp_(2kZ;}iXix_7o(8}aA1jNa590e0e^LRP<0ch|d3SV|5RxYpRvqNiB)@LxP$%bBf+>tqB`?GI+%(guh}_EBcx=P9&iMv93d;8OeACLjICXSs*WIRHo$79 zKQj_x4TRv>wiJR%q^;M0HEeM-Q$ciM50Q^n)d@pvM((DgV#q4EyL1369FPTtJQKAe zn*$S}N(gdtDFtG4Oiw1fDx5y!KshZDXFw8lCMr1@n|)K}(1iF*h?M7o5=DR!l&tMN9`vg#cvMoGNLt=@&VU@TW+hG8xc@U7hdTI3vSdn;PLa zhvXe5M1(aS!QeiRWCR$OM|QP?#Z@4-HQ{r+%L|61fQvjuYOy93TLbO~1$PHK*-jtm z-!X?PxvI`}aw5n{q*<{Tya?=a2|G?$67>@nGbDxj;#f_AoP){Xh(qHvLheB<0UO-A zc{4d{&{(58cxM}C64*RO5+)4eUK%H^Dy|_HdgqlDpqVyd>U~L}*ZZGgXUpr;DjxIa)S*9U!ZIRwml#d}3h~%gh(Ow8mF+pjK*#6%>^0 zLe^&L3M=%q0yGcO0m@54_^R1-l(fbgp|+xyyf7@`S4fJ+wB#X+afk(ifF@5GMJ1n< zqLW4FQU!QMo)A@XoP=eoamkm}rJ5ZS2|}hyk!s&r^7+nAHs2{M)`Q08+SSPALp76+ z9AR+U4HG)6SPxIm5V6Cn!AY%xn1q_jOYDJAcw>uG-qy0G9bg_6$$xsnxRA<-@-nKF zU&}6+70TZ7#Dzll{mjM5Wf0Q7T!COJh%DEv|1>JwelmReI}e!4_u_ zjyMsg)Eu+%L!HveYK$&MLTLI0h-1iFm|M9Lh7&;5!qu%*4owTd%&N!;xx!T*yVvJL zch#KsT=p`ZDROlQT=??C)~A|?!&v)EqBB$MdO~7SiGAO&%RT_3Q5UA2S&k2nagfra zXIrp8ynx{c>k<2+cg;w`@LXS|N~uU(1%EZvgDk`Cqt&}()b})#2v(e=Q>%|w^73f0S?q0ur*Fxtp zqIDX(_#SrUOX5HtQ|HJbSo8rz9G1~xDka?ZrnJC>-W-poRtjhYvhGVH=mNv3-h~`O ziFCkf7gms_gKDMKe9;vp^?g^Ar7xdh$#E*pmAChw35JwCO77G?8;S#t7K~toGZV1t zGw4;lKpfB82jI2sRB+^97tr$l(nkBjT;w)LB`?ZN{PU6Q1y;O=CQMM9@G>8<|3~f< zybjVEtoz$21DCL3>=}<_TsdT@1%ZHi-Xf`^zVb192LtLUi==sz@FeeUaEltJpUVFv z%@pJ&rlK9G7M406Z)jl|#M6U`-(x~nSK5l^bAEdVX4Sc056w+Jvpz5^Iel2s==#vA z&j}39%-jtp>lE;&};ssmL^Xv%0)C=g3y_%zjB5dyyYP@`WnlntD}?J4Cl@l0bnT9C z;VkEXT?Cc!^WH->g5hDn5u`(f{`c}e+@L~q=0qo>V4(Dgy8%g?h6txiy|UC)L+Ngr zV^d1S3{*+e1K}pQGK#X^0r=1;Jtu2wY$fUE`V}}6=qNwT4`jYyNhP%rR}*ol5bu=f z=laiQI7!+v=vD#rtHo7pai*)^QUJADIDy4RFi7h*D801{3^F08##7FrkteO>O26Th zA%q^|?>a_3Vq*)z&dsq5VaSi{Y#=t3upXV|-yAbR4Su38C0UZ<DyzazmzO)PwRwv zg6KbT=FlM1I!xZ7pAztW_>Dbrm_4k7##mKjvqyt4vb2IS6bqd?VTlB%RyTX@T{ZZ} zF>+3Jhdbvm^}0FL60W>@azE+|bXyf}ccXo?eeaW}ub%$>!@<2ruO7Y}JbC!?p(}Be zCyojZ3UxR1m>`zZ2_T)X(;es$aZG$6`>8#53LN@|ZqG@~f`+pyoK)-}0Fnkh_IecS zCnplcNi4$3@WpBOrpL{DMKDfbq9errZh8#l?y}uEP0>XDs5N=~V(TDiRWsq@4{xBZ z4osK7-6ge>u#mW$e137xscW3)ky%r;nw#DJur0F8V$~l~5cd$8SS#)U!{a50TvLjx z(;f#b!t}v{GkruW$RTygr>Gm7v};^ooP3pq!Y_ogcxz8T%^5i+R)sm>vZZjUZfGQ$!fLi z8g{|)V%G4_RzqUs1|@CxnqPFn8XyoBdWgf#!l(on?Eto1hcy+0IR?ragL%83z2grm znB!$_YNIa6{I6dRAPH?eMS}4`MkNE8V0*PDK@kGuF$B;qZ5fA5Hu5?3q3>yxqm$O6 z0eQJZptJ}HaDcWdb;$NycHx&x&b;`EICI!9q7jFC?m1o@=}o&229q@tJLdGv3gEIL z{H7GuC`C==?YkmK;bFF$w#{<-pJGKF!52{^5yq|95)C-C)OIlMj)};pZhTn{En6+v z^_x+)CnLgm4<`tv4aubQMhGpEEFsw~;nTgI^1KvTmk^n3(vahg?RGUV&tGKw8v2!y zg5SKbDLlhIq7G%tl-Z#-cz1WX4Gcp%d;7$Cus*Y!Sau9A11sk>`d!3JH*EQrISW3! za@KFRozHYTqolO!tdlQtZ@6J&k0n#W+!Fzz7JjCsmG)x!Dq4dKx&ki2^&&4FJIsqLefiKE12}4ejc=F0V9xlBBEMY8bYQ-#%N6ht zl%Vt=PY$F&s?d!qy9c(Wo8ya8g^kotYkFZFa7Z@UxAs$LZH|t^9~FjHJ2*hE#8=Fh z#`s-TL&ByHozYcL<=n*H4wkg2N{}!nXQ-}tkjbbESOR>2|}bp;f#F(?49IHN9F-9u}#B{ zOqAy7goIfqkjdm>o@hx$?2aW5`O=AvKqOOvej$OvwgMV(2dTsOvI>31X%nWaT1WWZ zux%R|QX%`YK2=jL;a3rxA8{pQS-ip_LL9&xt=-sn016V0!`eCFI|xDJT8mBYwa9Q3 z0vOm-8qxVFEbDfeyu8zu!AX_o;a05!?gD{_HTw}ybn z1S8_cA+`BEo{b$`En`rW>z?bo?9oZlJPD9QEQfcCAD^$LCgbN+y@)nwJ^#qbl(xBZ($NR zBLRskWCac@&lKYb0Od$h0FKgBWND*N=p6 zh>AOeHg$od!cudCu?USMFPOPELT>857`LIW(}I2ui9&OXn%Wk-QGtJP-Ro{-dwtYd zpNkgy5Lb6Ia~#DHF`O1*Fg2EQ0wt{E8l{@Zn=Qnkn4_G-IE>aI!6lA&inMmBLjCxA z$A9mNGntIXZmQCb^*i`3BCD`heVLC4XNrc6T%xw9W_*)A(z*O#mJ8cDEF?v;L=IXY z&TiwS(R=AR0z93t-VcK(ghi29>SC13_QPuw00-%Uetc;|u;sXx1G`A!%PlDQWt*2w zrEoQ`+JW4Skus@E=9;1Su9^|>kO>(KB%gxh=qU=~EXU@L)a@bQ_LJ8o_K z;)C0o2+P2d1#LKE1Egci3^mS%QCI?LnEr^tX)_9|%(X6fYPNwDc>r(5j_S-BQ&;CT zlsaRKv1P*Jp4`YHYxLJ#Eg`m#2k;T1=3Xe3Z$f^c})B(oFsuB*0U zzcMFXh$(0wJ4db%d&i;B4%r?=T30N1m?H}o`+9~BD11&?-2sh6pl~#gn$qrw0VF6+ zuaO>(M^RKmbV29hupqcU7q>fNE1Nd-mvs?$D-$`HSzWwCNHgcn=*#p%PX}l!e$Q!} zfK;N93H5kttGXo%0mRe!VJ5{~7&p~aKRCZqDtyC29>WSK9N6|1ldR$9NRJ)0w@6kw&U6~P_~lGGK7Fg zug}`chJ)yq>40c3=@Pv-ku=WTwUJ+oULzs93`5HST#B9!ydey{?2CzL;dn6j)EC*B z!)hHWix|;ig&s*0Pw&7G57ujR5RiTy|Ii9fvm*=&(pt^POdYWt!~NnZrOT5_$Lwf= zl=BPD!lv{leu!xD!#cmkPZFMZaB$myxwK8o;OWulCGpEhJYOFth}182o#uoaA^CeJ z80=F>z5B;-Bho5K#e|{72{_r6>;n_^2TE{>g&TPV#7CYxM`5X!Y!IiNcC@@w!E%)H zZdI?>Xiai_GUR1QiMr_lvY~FB+UTm8?YlQaUF;Cz1nLo2w6l=Y zf9IqGN+PHo0)7}04)0o-ti_)V3ms!rN(5ErEd^I;3AR)H*}9b{I(P$w%f=wj9f zX|?F@C(0^urYsYy&d`)t+en|#2Bi_(rc;IKDl^-c93?qswh!Xu5kE7|F+R#P91dpd z4FjR<#ASjD_1xVLWK}khb<^Jz*L#NC5TdapG0fF*%$vU*!2$DE3t$Qem_}L(#nn0W z(B~C%>Dj&|D}HU%)VVKc{1R<659zX*Wf)8Ze(F10>1A~F#1J3RC6l#`hiN+ycQ z!LGi(jii5NpVdc5Ey-EiBFuM38R&-g#C7`_PIpvMIb)%+aaQ$a>WiQiXr%2~41hZs z1;(H@DTP}M;%S^qj@{7mlI*>N{t+TuEG{}cjk}+y`o&$`Y6SgQJ(Qy@5|DXWDU!rT z1~rEAa;@A1-=D6F6WRz{MEdhwK5!sYx<5-yP+PuZV>)HeeO(MC3RjL6SwM`lB?MG= zM!<_ge5ht1B3L$QPQU%G2;%U&Jj5W84soD#7$oIoNobgrI2!8g&9dG!2cd~8ACJEV(U4wBXY(ajPFx#g^J7X#Y*DWwG8?N8X_3j-sxJP-3y=G8LQ!Ryr zYxOglB2Q+bN=PQH&}O1!iLPw)JTT#!ZGcj$?rTRKA%%IP>ZC8&?I4c|aw)w}Lxk3}N3C>VV$}ABG#TYYgs0=<5W98Z|AS%KjrV{@B8{Pb{DSsvsj+!PgwEJtTU7xXZmA=z=jbz zdfvt*5m^*4fI55#9ZZKB@q=nPKXecUR=)TZBu0dNv6?umW-+LqNnAiVdj5Jef;{C= z&-<8IMna!T=XLI`_OOB%{!kf!Rn2p!2%>t3QkwINcX4NL&4B82B%9Is)aL6B%)*1S zSeoIc=E@xSruOH1(}=GBx~W@sIcGouQsmj71W(31vmg1Ggj#`H#<_WBvEt;J!^mjQx}S`HCJe`Vdt3I?f!(PQ6nRF;ru%p5R+ zH54ml;ab32u4(8yLV$NPX;86EY73992H(*|<*PXR%jf6D6gXKmJgAcGN+R-+h?{FQ zXYieJQ!S(`PDI5fu5+CtqLE2Wqd<7$$fgl6BTx|~S?tUj>V`J0dUxh(w#yNRmg5mZ zl@4)0wtn2iI!730gI>4P-mLm%dn|rQaQGK$h>OH-#BJ!Bwr&PtLc>T`Upa|e5FuO1 z`v7fjM+#I6#l#}Y@$KgLPIG*hE8vke6~er^f;lj}>OD3l<^%&Nd9y6^ zc;%(k>z9)-{X3Fn0hStu7*AWxt@h)zM~*F6>(aoqy6Ba-ghn$KHijBcAt8YyZmn=d zuV+0W!V%UR<**@e8j7qo%E8zoLoDHp2o^q>FdmqPtvzGtV$ICu8mPJG%4#Pq1A$x` zoHPlwNga<2TNIO`Rou@Ry%NASvY5@%OVNFBycXh*wH^U1lZUU7L3raix*vZbA{- zle8^S@TwA*DH$Ss0@cV3k=8tyXs?njHgIoCAr1lEqWEjOp!SMY+pzOoeVMc4y#4Xa zaZT{$I9pHyrt{Y?0m@C(K9LO$hAaZRKtaT2C9$XtnzIqo@{NU8o!r?i9&s;(#n41@%$?;xOC?~nbvy&Nx08z}pmnx^^5l=!<;6J!led$9i zNQ{yT+Ya-TO9_J@W#<(hw{G6YK6LkX)JVvB700b8 zg}`QKgqa#rro%cULP(}@Cepg7As_1i@@XJ)dWv?kJ-6c_qt&Iu;Q8wfWnK(I4KD>H zMyI?#BQIcTC-WqEHM6jn>yixEH>SmY-2d9 zY8sbSP2a^5o2|y%R9UCq=x8u6P#bDl>TwistZUC>qw z>xrf0wc%EAc-^Egx~rE;Ozl8GM96^>1M^Ynd~e1=*#^-&^GhbnSWiJM;+%MomOm+n zRWe^0Ve#7#2oe(Fwa3C7-1pcyh|N)ja(%;&J0V>%aT-*FyUgeGXHKoh4C`#FF0f8= z7s$CQ-K=`t&3ATncfrwjaSVJ3=#O#jf=*kMHo%@2rBKDR?H&bX4d2=HF7er+y;x;h zHMu$iinF1=fRgUs&qJdmOD3 zhg-#T<&-Fny|eH`reL20?%!SA(%j-n-Uo~R78{u)d?Z!{XDW z05`)p%i;y)@|b0=;^G+DSf|NwA@7L7M|Kre@e$$=7KGm=1PgzohE6E$i%50pg+x{z z8%5|sZkm@-otO@}&9Uj1CM2|9faPIt?uCwNv|@6kfzj2Xy(jI?=r(0QVxH5vEIJlw zgSkYYdWqs0T`+o-L{X@(kLb2szpNl&Xc?tyz7u+awXpkKKx|HDa^f~iKN4$;tXG>WHloQIj&D7pdbFHtMibvC=?HIG9%J7OmFQ&{lTwyghH+U&7*GSbHsR_( z9%c+RXN^hg`apYH=DNQNqZi9K5`RTV>d^iSjh`YI(B8}o1!b$5;X9*H$CEyK|I4#3o0-NEsZ*9s-PDd&Pj^O-VV3I(UpSsceJ& za`mXLX!iOUq9dK_GRb6kV6jM-%8RZZ#U)2zWL)MsK-1bCDo`@>Bb-}Ul+vxryEd_K7Kk#iQjEmN*@?3d{jNxr`&t-WzmAf-{i}bk^nk z*oKr5=ep?J1KjeQjEA+6eJe`K_^w|A(z~m?w|MbuNw8#M)`cm0f)B|gF4+j*0Iam# zlwLk$eWPQ9-e~J8CLNFla+Mql@d|FNE#TgxhDbt0k>1*HoO!;G#S&mF3=wGsh2d_z zwF0@YM+L?TpVbt$mi*xYJ+=_Qk-0^b0#0$IcUlIDc>>^aCG-{EG$Tj5&jqXJ9Xv7>agKf?!x93!CJ#!ecgcPhn)NB;tMSHQcKyY^7 z<_wLYEV9rED=^~eQI7x1V~7Q3vvEteG?YR)EZ(L>PXA|SJU$F(j7!8vxHa_-9Eal3M?69jjX%&jut*$Je|)MKNR@mjqKVjt2#-Fm zgyQ%08|LOsSIrO513z;NsRA?8!bz{>8^Up;15dmcQGS|DDje@cnAavj9H2~ODi|Fp z35*MzWxTjc*%TV)#YS)GRHiG~cQTtMDt$Q!2a%Ok*(NR-T9^uYVH(wpPWC!E_W?-` zhY5UaO?Z?BfuswZP-KKlJN?bqEimM&j%ODi$9_3BPvk1%C;sm+g?M(pxXnU5*=5t$ zZnMN$Q7@R*B&}GC428hEq!+l--Li!HOJRa>Yp-+--_-6lBPs4Jv9F+q8cI5Q zRS{Q-cgFv8#ik~si`+sV7GSXVt4KKXqcNBvaTZUz|?|BHBqsN z;!<@vSunwYIFg$b_R7cuj8=S3S5W#+vWz?pNhZoHu_4OE-97F@BsV$WTVV;rS)4@z zkw@G}c0uT{a@Z9`wPi?Pnlj#7xrnsWF%ynOQ9WolY5=&QGe=YEPfJ#YI*H1diWl`j zfd>}q70L01FW$EL6{NGOh#;iwF2U|>Z;52I6>0PoBq4ncbc(B>Fo&5`;`^z&J+{l* zK%`g$i`@Pu6VABx8xOg@*YC(Z3?35e(vD}3;KMc_0Youmq4|@x5gOtM;;K0yL7L+1 zlrlErWOqAb8^g^onwJH;GY>&WnCrq0$6xF&rtzIIDys+tk|LtjX))RRxk6)LSh$AP z!y@_4^dZ`^{?d+nY!OntxF%9!hR^mQ^bE;_Q!;Yy%f=4b+C6jCA1188nj6-sQf=4r zxBtS0*q*oRmSjFWk(8KO6)7uCEfB)`C8irRH*hgVk_vt$;1WX?`CeGr<_ae6EmD~f zgAw{T)R*{-DE44qgn>g+s&w%WeK}^_OYOMMyyP64Trwf`E_IlVQBfyo5GqO*4%cQ} zMh%^8P>VC~g~3&paa!-@PMa(*Ny~0g#zTq;{C7|cgjj}Gai|WowIy_bz1uzW+F?F> zrhNutMKSkv!i{)Y6qsYR?M;T65%Z-ZQKUd=QwfO}?hsd9HJ$=H136KjiEs5j#lX=% z9u-S>i&(og8Qsu?mY56m82Pv??5x14<`^C=*IHVLbgJWlGrk%n$&;vf1Pj!byy~;K z0-L>+vDU(^bZ!;}3McWErYa7g5gKFUC`wu8z~NG0N)X7-PV)r>T~a*KBmD|bsgE5B z38&q7m{B#lV3&_XrjGzx37eMA<0f0EfzL|KgS|_x{emnm>oazDhJ5audKSH zg`Vb08iSe{Q8cG$SOU=8}PY}8kUT}L?nrRVtHg*(qG0EXXHW6GOj`q;j$uj z3Gvm65BEprJ%?sJ`R1fPA@+(TnFOOAV7w|`i15-`hqt!XSsh6CI#p>9(Mg>GE_*H3 z&hRvp+o%eWnIgcV9{6W~HV_Fe4cB3+%W1iPS3^f&ZOcRzveo9MghP0(uwScFDfvZE zUre7a&~-}N?a=xe3$_C&tOsQ;NU)$h$0c2({Gt1(2+yZ zBFVSv01t6Wg3gd;#e=FHa8p7y7MpO9lYxB5JS8ya=ObEy$RO|=v>8xJc6-H%aTt*f z3IX8>Q!N*H#9bk@ZQ6jJ6IXpXOiD{R!axcAo5;`SUagvcoR747R_w{{s zhjGRUY7R=7LPC`%(piU{L=q%jI^~a}qK?lfC+=XFa~D~e3PaU}aiAZ|&QZr~Rw9Cf z(a>7t<`XV@B7j}Dgz)907HB)TvSpMsIT9{nl;KKpX#F_6ncW{u`9Vt7U!}h-v+lBPx$Dz&`um1F1(49ZYp&Oil@MA1ccb3EeY*ZL5R6Ye*chL zM8}vT@RA)w#Hdm-izwWf{U|y)~js!hnv!rDt@2_ctv`mDy6kkXft42O(`${5{OyQX&QWgoG_&cnc zXV!?JLV3-F01#1a=5f-Y1_S`J4-zWLU5_>5lToyQlCpRIu$&mKERtyIBap>sB@Y>p z;{smIkP+iXW{^NxTNffOo)5=4s31XBA4&GDV9W(A0+k~ST*!%et7TPAxjwyw3t2Lc zq`XE7*0+(bAE18ceYVPI+$_V3@czAYh4= z7g3FUQBsznMc|Mcjo?RjP`S?cDa-4LwwFVG$#xT{wiq`4{OEs&e+6-+ub5&#V>2O7y_dEHUn6$7T$;6e(L!vO?LIF31 zwdTKKyOq9HOitSMof55+r`lryNOBCOBKHYQkXf;WyS z>jj>)?`=(vJjmJ>{pLi!5H<6 z2R`a;Ah+T8u~wEsGIHTxkXzo)dG=;@KxoO(=m;v$Pa>)_W*1krlRk z%Vp=ulzsW$RMd)27gy!}^o0x5DA7j?K( zh`n>IA2!0jRPcf9G9_%G*dW`A!p6>X+D)emg*ZBp_$R0(7mae8`~rH?2cd5iQ0-xU zyB`f2iEoY>i6<*WZiT30CEH1EL)6Ym*rxjYQ+-Tr)`Yp{(js;=u8`y5T8n6KiuQC7 z3MLqr1*SHR>?sj|N(>XaAsp+Q>uk9uzaCrafZaB&R3M6YPb2p&oF0Kgi(pKJ6? zzRU+A$udm$V0=yS5Kra5P07YJ?b#7FnL4SNge1Kp1_`ZH&Dkf!j-GHuO1Fj*$(Y$O zk2yXd79KLPOlOf1T-F?2L>*h_(0?6G5Kz;N2$kzVgGUF`koYNodb~gBS!BGQz}N89 z*MxDfhzF9_)fWeIcnlK|?7!PnC@{`$?m~pWXroW}Nlsm2@bV%xpJ7TC`NT&qMpM?~ zIes9IfvjKcZ%ApQb~5~HST4~0J(IU@>B2dkJ9siy#8q`p;aiE5?Q5ZtEG!(tf!n^S zPB!z_dJ=9DV~a3kaqOhs4}n6~Ya*G(BJ`Zd+nkc9>GtpX#?a)32;QZfTL7}fsKS$W{3-zb!s%j}&%?!R^2x5dzidT`j}N^=!(kdA)l0&ZP7`yA zF~_ikR|GS~85h*bf?kZUqMxqEH{k?{q$F36sO+7L2SSXDbndTU^y!br(1p&={drJ6K5IObo)NUIb#RE)ubhWbswUPJ4i%!`|6S4R;0Z#mpUI z2Cc(5EE`OtiR2LKG}ha&@@7~!+?ulhdLKhvjGeTeZw9-Qp}S!OFD?SB&NlkxuE1cR}3{OS@02@w9TQhM9f}@TXsEnpjAUHW0bKS=C-dD&V0k2*^<}ek z_EV_K1$1u$pKZYEbTW_e!g%Ge=8M#^$j~or!jK=>b==yp89Rr<6oUB}`tB$uEE>=# ztawr)1NFsTletg%dcA%sk!)FiAuF>)~P8O5Ms!K$q}N=zJO}$9TT@7 z3VF1ye5>Y%n>8Xf+|OcDgMceQ&YFBYNU%=}%7COO$D*fOYP8FYge* z?cdlUITltdJIxx}2-Mf^LnDQrvP#<(mm8j7s+fmE*dZlWE82>|CH6KDXUM(@g0cNM zIl4~ApbM>e+J-DPGOgJrA`5Ofpv9X#o3h0_DOym|;3LNEz!$_LFfM$S1nhURk#v+s za1*0uQtSW+4_X_+*I48D7qV0sG(1nQGlc+basJ+LYx&vfTTGiRy!nB4t zvRD`5s43Q!_VSAyDcqn0lST_XK!41WuHbGep#cQyEm2Hb~IJHy>{@@Txf0P2GUP~Tes zy|;FOmmZBb!uFxon#W|1bsa~EYF%BTXSDEV94vo;VXdv-g>GsygBC`+4v^(a?829` z=1ZLbBU=dxnMiyrf>2DpEW)o5ojV{MC~oV=sIoS^L}i^EW$}8!ONvvdxZgbXo)^}U_K*3_F|0=+ZE*xFXUHI#==8M`+o`Rc zS(*5A-9-^9Y%!u`E)J6^Wu*}vScZhK&R-ns&J%W1WW5DU9AVcsT->b`cc-`%ch>?% zi@Uo!i#r91I}~?!S=`;--4X44cU-Snry~Rlm4?p(>9?LIrUgVFT-!uWE3IlR%$o?+_-;L_f@oLYzgHz z{*6FCo4Kev`Z#xj_~q&_%X6Ok%?#cNX}s?rMSA@&X2+?*68OI#^_<^ty z*jr4~xVxx>qb>A_g*U)zeMW>~iPPtz{y$Qs9HkwSD$ozaJt=#~wn=?I6>0UGh<RP-ec3f}ZC2tg7mR;F5e*w=F6j8N*jnZ zQht1iw4)W5l=Qz`BK2{*&5emh`)Y7w%2;p_jgO#tZRDIMWF$4S(I!18cv|x!h$gP> zR|QM13=$n7NOBRZi#B+&sF1iSRe-rg1%Tk{PSuvIhXkWY=~Pg6$|zL8xF+E=3?WK( zR6nGAXszu|^<(wJd$Tb}gvaI(o1NIb*b*>k_pB7^V&s_gD>%+KM-wM~Fe~G!%%rCcipa+GXaD4WpB$na4jNJoNcnBQu-q66gVRu|-H(t>&SfZ#pdhP| zI+;vbZQ?E(?si!8b7Y5tI;omcZzMx$nzcWM)u|~bdNV_cjF;Sua{)pkPCIb;+ZSr~ z{3Y3p1Al?6bbS1Nes!USCpRSP}pF?Hu?_+|cc9$zu4qmwj$pr)o50Bj$`rl-U*ojezUww-o2^S2Qt4*68}CLcV}*zlguw zGevrAB#^Ja&BafrpnTtl(1Tvw<`vv79qO?GuC$|*x)ndrt>4l((YOiIqagldzy-IT zunMTLPt3tF2Wn=vk8sM3IAddBvOcAb^>d@XXB!Fm&9s=v* zUV{`jJ9@Q5FcW_OQ!}^BMK0)P*82z!!6mG)?z6OcizNJjhKZhk;TGj)W6ABd$R!C+ zFxziKGdYu6imqqt>>Cpu1A#Uwp;9U-1SE;q;fU+2xk#$(WzWZAd=xME^}YqX#<#O| z{hU(dKjM8xe)U4rv;}BH>)8TD>x`X(Iko@pWuwI6uGG%`k*UbR*Y|UOrR~U>!lj5& zsdwEnKBBqAT$uLgATfdNINH{nO`f5-y3^o=%7jB=(I=QcGCslh))j}*t$$-P9KN^c z_u6{|Yond>UHIpsz@o|sS2f8=Ho}K%b+8bW59zzN?Y@DFU#9X$i70x-$ z*4Xr{*zHaWi~B>1gBSp&J_~GnGbgFXz_!7+$wya6|66DqNHI!CH+PIdwVq~6GStv` z-_rW=Jd!-*v(~=j(v`_KOdi$a;!yM#O5hDyd%DcC$yT?<^C1v-+~bol-?_fB{hg?n zLj3CeFe-EnUa?-W$QJ0Io#*#9nENTL`XP9AOrG;c_#4vB%BP@Mx0zwC7|WYx%VX@e zCR#f4OkEpFSc%wjV~Y-HT2!lI7P*jU88DhtQA zXx!0o;*UF(5?S)UMYZ~HP;^61cLpRB)!Q?dJ&+RZm0L>}LY=&)rf3d|GtmOW^>`UB z$pUd*X4;Xz(Y*94>ft;Kd}~w4(0r!#bp5La`ZFKM&{nc20q!AI{%GBSdOT)H7dtC?2k>phM-Yr z(xsj4i2kacP}JAQ7cy+hIajM-1{#G5(f0yC5mWF>7Z44^`gz@z;n~MnKI9_1+p|6k zf5K&cPU_+4M{KVpFf)T^(2>FvIvX^LSBi$ftjgSmekpPoe3$Gk@{8i(plOFz61(Uz-tg6htrznASgn2IPk(WXbmUtAb z(#!gz9cp(TnKW6mV`g`c1Han>TQlKkt#MW?*Q5q*;lyku!M*PsUICLbsI|BE=Re=p zXV}|M^(_?rk1;wiR;Bo&?O2L&eaA&*fBqiQ(?tT-<=}At>rST5U6fxJcgFP*uwm4)F_7` z{*jYyvU^Rg<<}8T#?(s7)SB8i+^Mh~B{Gl4uTDwpr8=_Y4k21FZhb@@g!qxTc4U@- zj!Zvo+6KQ&dNA50;U4=d*=m!G}o7Bv#xFyQBmCI8< zf;rQ-+tGx7+7gHV3q#Wv@(F(!jY+6&h-Qi13$LdxAy&QgY}a6;R^aviF@$3n4t`cI zkIgZ#u*Xp_s3*99$7S}7GUv}p-xMRr-JtH5H@h`}UokKLUL4k2Zrb&`O~7q>Tn%|l zU0_`)+&5**bK3H9GHBXMXP_-X1#G(QD*M+DH^;g>RA^~O1T5qiNfcfp>w<=$V>gDc zHLpoRk~_!vq9}-Mdl^*FA4`1o@1heybrKEW#1akdG5t9)5fxR^TQty}(VeFORdsi| z)W%(!B3KpCF@e^w6d6qewq=&;m;#cVW{hT8)rF&i7&*Lxfrs?)=dE!}3`EIcy!H1VB`FFB0HF7z&h3GGTbVvj%D~Bhf>suvAS=a0FEa|d$ zRxMN%XIP$Fdz>#<7_ro%J9l<5p%{-#7IbMGtb;x0x(@4idfsXJ5;QYiR!c-EgLsvw zKp-|aI&{NVQ`%8vP7)qG`0eqs3HbSijbU)$D@PoAI6SHjT3MWqk1UXr{E8l*>123M zhtD{`sLtnUM4*T&+P?~YL2u-!KAQ}6yB2X8+quX)#}f@!Y}7<3CP$e7zV{;uIw#$- zUUiB1Wz^Vpye}@R!k6GALC@-590Ub^O@2Ms;<#nv6Y#0v%f7EH4r9CBjHQtK(RMAF za2@Ap(xthad8|6E*VFW4B2;YXf0potYweKV8uE%S--W(ujY}9cf`?wRVq=4=suO5%P6=DoI zo?H!~n@HS{K12OJU$5bYqO0{~@eop!NT%4a>Za^kY(;8F)l0fQyRR{nk&Fg%=F4Q} zVq;PR!N!J^!j%o6#t;b|;3@3L3wCcMt%2l%nm-m#?a)^YMl5nUue9B83rR(Q;k#@g zeLBxNYhtXDojf+A(%MD0?7=f+ZJsg7lQ&EWUgJQu4=lU@uh3=&N#m8-9g+vWS;dM1 z4lUH?%>D^;TMe74F0Ms;{YPX}iX2z^j2saMbn!ZztJd+5)4pz?9p)mS_VD4#;cJ;8 z*t0q|N-f9mCvLWD`M|U*S%=3~=Q$*afg=!FJlK!}mdlcF(rZZ|6{o9~*5~7wU9#Pn zc3WPX{>t%#&uZmC^)GHioJY}sAG%+3KYkk~>*D5nBVgxy9(hT0)rT5}TM5ozI1Mn~o~T6Z-Bh&lZ$4=?Z{=0$2ChgsAfyk@$XzXQ zD(gc6eSCyomOL{;p-hjBX#RTXLTev%s6%?~MkzZlLBcQT%Ni0$; zAUfiwL38W|*deOS>_N$-$x_ujJsZFJY1vPDkVb9iro(==Ku;060t@LV@A?pl{s};XwYbFH*l+W!koI{SsRmhqD^F&YS zFCNdbHYDiF7*Ri=F)z|+o98n>7q&(u?6cWT^*@Z?+(#hyVVKj8M&9;C{YWCy6XPq z$sCsAGBDb|EO~>n>L*gdXOtsM$5Y~0;_b@%HYShjjNTA|lftAMC_S{9OwFUM2DZmrh z_mNX$#(=6z=L@@FeD?Ai{t9}tnVig2O81d8AX215l{D>%d|DEN;JXM}toZUqqk@g! zfZT|&LQzr;K8fw(UHyckmU9e=Vv|0_{#x4^KOTY>s=R}V+*xz1>Fgm%ay#-qPLi(F zXka3AAqZ1l^=2|v>l?fqW~~8|4U9U8B0^g?Nd-oHAG%I?OYH@YqD?-?$G8IsIUkYk zc|9trs#$2w7h2MOf^afjteje(NL(r*9FqXu(zw>OBYdvrurP%Exn ztc#*V!NDzhw4#fG4=9I;j$)0vn>fJ|0l#L` zOr)X2ZY&X&_*a~|+{7@V=yPXMU4e9FHqLEZIU>2}LD^r8NPS@47rqHKhrLrZn5o)* z%oQ)S_#nC}x|$|$H4&o$H3^JZN3{sTUm86ZV}pFYYAen;zdhAta96A8zH9BOnI$*0z*M2Zu>GsQtPENtxG@GvU9{IHkF?=0p|acCsI z!cewHBZX2xyD}QA-4z&?`^Up8V3F8*HO(nf@D@gCd!Oxf0!1*F`tBJ%R~(kZ?9BQo zCPYI#2q&+8>g4r^m+0e%k70K{HO7x{jASE%3REn`z+XPusb9GC71#G+8E~v|S`T?k zEe=C-eIP{>qVCY+(@;Rm5%fNGZx@m7ny93@^(Xoz@a2e}%*0)fsT}udm#796TvD-i z_^SpM0yg%nlzUQ8>k|^JLD&lrklya{>Ib7Ad%?_dHxFb@KT2exsz?`9s?hKU8)=Ze z#?JW-LjO7a(Y*g9zNfoLm{-%E4HgsX@@Amb<{Om7ZR8L!3|GGdMFecXk+28^V)uFx zVjz|?sSJ*{1i>fQmm*A%@O|e6IV}U;=~5Sh%JJ>)L;WaRf8DqB zc(^ucfFpS~l-C`q85W+2<;7yB6t3${are)Wrj&A5-IFFo6yDLS z5MOSjef|R1qmE7)z!Cp#9Id27`41v19`kmOKuC5yuIss0rBUU}OZo4w)1fDz>P0}B zJfsr|Z737#72oEQF9$R5`Naz0j`nr$9dNg8Gywwj46MEphx_wMIyr!Q++!XWT$zCP zr(SPhnCtgHu^mbtPbfHacNv?#0gdVFx9Za%kDeqoCg9>ElO6K2Je6V-W>GoTbP;~Td$7q{=lc%jx>eSTxK%~gL^ z%gD3$DbtlXG8)tPVIj3XIx-udQ{@`b{%e;Pbchew8q~MiIEDR8o&xcF>%Qd6p^Z-R zz3xpQ>Dz5rxv|pN3DMR@_P;;4W@^8E6{DnEF~7HNs)|XGrKJdhCxhZ%fW>Ki7I~f$ zci?&1g@1%bI(z`U_@>ZsCR9liV?;h2$@(l(`sBZtF>aTRr(emJG39^4i^dKRerqs> z#WWPg7A-`QS_~|R5_$R2?LzDbuVO1=#xq0!1IL7VLf+pn%Yrg0_NSxlBBS3@m8bP* zDFyS`waA}u!kqXK8{6!zZ2d$>jTE^Fu529HEdQ>$zm>bg|E;s==lz9fxR$Y$X!kWY z>9B2CXK{~OUizMoyxhGgjp0jeS$L$=qZ#zEX^|o7?fHArZ@LDIN|S61?VZPP4I7v} zpazN1t4aQf#pdqE+0#di! z++qL#8$NFj|DM(kWp2X`n9L%C&DVC$d#hX%)tv91drK3Q*7^w_C{!Oc*BAFiD|;VkT!J(o3b(tJ zp27I-%X$g50^!;${I)N2_(%r; zERLZ%KiVw)9$yao%xWF2_s}Mqy8#oRl|hY(91BoZ49&!@ZRZ2pb00fOXJ=y`2LIY) z(bHjN27whwV}hjWqwI;IvFl%<{Y~0o<SMa! z$(h|u^1F)u!iW8v_h3SAu|2N9Lez(z4iKhjbJ+vV<^|jV)>ul-k8yw0djlJTWhq?q zpI$2od@hzIa=6|*93@Zb50#Cth`Fayr|Y_QGzdU(bH^6C923>JLuYp<(b#%d>tPe1 zU8H-tSEx zonkR4R$X)JEme-KJsAt-0$o3Sy@iF|L+xijxHb<7whp68?|fNZnyl9vF2moo~D6u*mYazL1SYdNg~JYs#>|k zx+CSIT1B};qX616PY4!s>);F^Wxr)DSoAS*4?M6IDzN|en=8O?i~!gwDRU&`JAkwa z7{vTQJE_jFPt&OUX7*NTU*ehYw=;%-fSI#FRR0S2zPbE}S^t1m;0Na-VpUr!rMq(l z@^}VMm)iH(SFUGFAl>qF>}rviRteGxBfm0$n1bL?nEf6W`H|Dp*+yXw2$A# zVrb1C+MRI^;h?Nv57&j~y{`mF;=)b`^N_0|KGxzE!FID?B9@;C7{J8ffy41G(MKCJ zM*t{zUAi36n22fK-1}*z|J&=Z%V&Tg%T#OHKZSP`;Rur0@<8pDzHf_F)LL9{*ZVHy zS>eiUuc#EX)bT=1C1m%0rw(^d=6*$h0;@YwjVR;_3E226aX!o5z}|M<)Ekut&Y z&hfft;RpSye+`oA_Jii^5PPmXw0(bzI@G@f!xaF8pSP6sW`#)aHRiFZ+c#h10DvAK z3G3q0_twwr4T$*>oPQ|9em+$2@fYx)v+QZg61+9L2`oI<6?#IQ2K+qTx&l?F0}oe# zMF7Ch4}2|Kivz}NtD6Y-&jkO9^ZLU4^n&wh{YcaCL9paq{#5P%y7c;D{|F|&f7gD0 zbDw{Q_`rWJ-T26Me`mZ`18@C$7rMH0b^4&V%6NSzVzjw=(eRPz1ES1+U^2dYYrW6n0M}mI`+)7Q-Z^@H!Wlw^gHs;wV()L6M*!(}K)%!mpY1Ej>x)pp zoBrLU(ABt9gJ&!Ne3CWj8U;Wb7TVvUn2lv*KGrSV`uNlO^g-v1bj9gZWvI>Wc0TX6 zOZijfkki!c^EfO*{?7h+IJf`z)~@Z~9h_D>cPZHZ;s@~Fh?jJ5fzFTrfzP9wwB1IT z7-$ezNB2|VUjSqbVG@~?=`|zV0RTxK!ds#QI!VN;7?H|!F-J{pKo6x%3`Mq#y3mO0 zW?Q{6PA%i=uNzT`oR!RXDlXb-c+IJB8n5q{=(-&K=r^eZD~PbYqL zBeF&nn{qmR_v)Q{X(jCImH2t={7MbR`Pu#{SVXmQOovmxc6ydNKWDZ{*+mE~1Y zQ4niV-dS$j-du2SFSiQ@p$a&hA#_@dbe7`q8ZE#*AqVXob3saa-N{F;(c=E3cl`XeMYhmIw&X>&KZ|U{9|$ZM;+K>ZRaMk;kv^qo z-&Nt|iNFj<#GHSQY_RnSZkSnLptNRd{0WAeU1WEdjZP>pjgqw*QhSb};h zVz=xphVF@%kzPoH+xv{x$y#Z1)~$rxBe3@E;(3!Eoc!Ad5fOjvy<>2-M&0ZrPhm0v zd54Lpd>6>Lk)^h2-BXFaSv=bJQ+pBhfw&J5PANl*v-S^}_(y!*BVV%*Q3ZlLv5BU7 zJbTC9*zgL#?fzR5<8nIsq4W+|Rb;nqdHLEK+nZf7soD+%m)q_*ml&6VS_1xISK)jg zte1-0Ec_wn!2kt(=54CZUV1N>69TAdU1bOE+l%NSGLgsDwc$Vp;;J z7SnP!vRp2PQi9N!%Q+v=ri6AX24xYB8k5WVBcNy+Ib94Xj+0?3COH@-NPQZAHEybD z`VY%R9+XS4?Y?$45O`_dek%Srd5m2pqpz;zI#ZC7-1YP3yRDw2`m9DG>mcL?{1#Cc zg;cf%z_yr;ps}3z5ge?S=!%f7_v>*j<4oU_!ttUE&CYkGp5&&_qxT?|K@oI2UG|K5 z2)gk2Vh3f2jvPwH@-4K-0T+V8@LO~!>o90s#f`xqp02>X!sI2E|U0(aQUzkbvQnLqB*h~A#KK>mu|_w~2zd$J)@7*@?!^&YF=P}YW7 zzb2I*4!)~>_a4pgATY>R4=@*|Zj`}vZ+{ND`iy5wnK%1^b=Wn>H3&XK99|uobGvhI z1LpIfH-|5%MHMZ$=DE`dPxwZtnQLhKCIfOa2 zmA5Vkj2;Sl2~E@8zJAj+wNVdIj(5}~zgH?B<*uQtQuEYPRf&x|BQg(>(Gz|qcw#o* z7%I4j&hBORKxHPy_G4z%w_L!>@Eq%})XV=2ZR>de)jjG)LFQ({BwYA5FTD?C)n}(C z^Rdob8lS+aV{k~RBr7x-Y(aKxVB z2w1Wr8I4dy4>%DdT!%6o?sQuybV z2pOoe`TDTK@M)y%CINlNTQQHC5g90TVyMFit)yK00UdE@JU2F@v6^2HMHy~%q^pY& zDayn3G_gXAln7;y8&zd`69Z=x)$nMeG9L;wQ0w^}>4YUp`dv+RS3{$l@Jr~tpwt%P z?9~?TLL2%dE9$t_P&#YNEQ788Ss5OZy4ddO7cW)jOZ{@qBc5M6D~I(`Sx~Ys!r$4# zO&3&Nz#~o$xw40P}9A+H@9Lm4=nFbS7C9Hmg_ObC$(ysy8mAA)H;Pd3Oe# z<~j@JPgcWH6xVNRhMet`A-ROuO%r*=g+(4OW7gx`g$hpNJc|Hug*Q9ziA121p9#bN z1PKqS2C;^9E8&{W^SlW#|l_WpBnf$W9zhL3Z-lJz5Dww;;`c!xrQHTEn!&*9Xvh z8Ke%ua>(BFeO>c4&64*Bh5OZNmaj2Ay}j;x}^W-DUjK) zQ0Limob%D^)=sTFqJA)8sWBMM5S!)+SISqe4KMta{^I>nW)pV08nxTq-;vSy;yw6G zzU<~)D~vD=vw~(F)|a#%on|UiM4Bj<^K@XI`Z-Vtz8F`y7Z0|=VtI4&E_#_WEn(p@$q!#^o zDW|1$&vugnbBz>7peX)LM_c$CU0u~lehDAK(CtjPPqVJlZ{+Ovy(~$w-r3#)L2n0DmVsG^nchcb zRY67NX%^X3)u!=>aJupX#3AS3?_oAEywvaC2^+JK=qyh3NiNSxzcfHd;vsqOH z4xa3v5Y+_Z*(P|>PAu#EMEh+6$Gn^o-!*n2#->jaY_@RQ1 z&rhfUD^z!p%;~qf*J)ozSYfskzANK}QR`^P>w5o4(D$k2j$|x4lDZpb-Ont7`idlC zNc&lQQwK^TwbeZ@TNlcpc~gRwgPBoGb1P`F3Mw)^K-QYg2~YVA9Ic8%O3Vjw8pH+Q zGJj1By7=l*rGdIdXS7b*Y65a4WwFt)1q*R51cvs=KU?e~S3ZllvbyiM zAB}3`wpMR*Fw6O@zCQVc`m$ImPx^&5l4TmNoX`wDkTZBobaTz9Dd-`)g@}bO@Qyjl z0ffAhSe~eh<8nIc%5`kFg1>dO~1nW4K;kJk-%T0dyM#IvtaY;_E|mv#@=Ei4euCfrB2 z_NRqq-x@+NP)?HH{kHjDluYXVeQB&k?@ucvFMAoQtFjfXIg&N6H^w28tx?7+Zet7~o#h{XQAJj5)A`67x#)&vyLi5>C%BFU5G8jQ)g zP746B@4#Q=w6Yqa?J^ruD=(?LBsZX8yt9ZOO9_CJb&1H%XFibW@4dx|>IrY}2xN(* z1`))lZ%ubcy{^BHi`;z_U-OB1W)JYgp%_H@@zg=! zPSc3@M5*dSX^D7&P?wrGBEGe70ivkCUQWYp-tV)E3Z0z5jW<2Ly!lMQQ-CYx7fOd~ zXEZM*PM`|>#D@whn$j=0R5xg1;I7b#dyG9q(-n8{_@&gjr)qFofWeI|7c8d|gW~4= zZvn$8UE_R%voQ}Di9VxVL-f0u)Nhj&m!lqcjR%Bhs>(}83k3VX5O)V;AUGN66zTzf zO!Gee?w#^8!$iMD9gut0l~pgZ2UPI+_JR0bYjpm_c9!_$k?_xDKCl8m*6+Kv`AZ&o{FjL|sKb6H&VsRq%Bjp z-}d#%r&(|}uz&rQNFXZ@-@XRpVFk*t;|B}7go}8w%Ftlv& zOni$F^P%z`)cT)wuo}CR23nZxT+6>IeU%llq=hogBdjyk(cZMGVprSNTI8kstC2>p z(VKW*IGU;^yqH#IG}@-lF@CB9WhKg3g2I+u5u}N8N>(lS6o2FdH6A(*k1vL4A=}lZ zlsr+x6^1?iwKo^buQCti!E;_p`}`tqg_w7n+B%Vlm2Zd1+H22JE~_?73}?OF$c-X) zBMG6nz6o6Hk5A;H_Zqthu;9(O?ck8>_i0iFwG8~SWS8D^S5q&AgBWh z>rjlAaWy{LBkp944y=Ze&Lp`sP0k zZdq@0w z>!~i@nhLzrPw5rQUWk1}GFg%l6@($jVX%pq4MS>H z@=Q2ItDyDBX7{01YUHYb<6Vt`*a22l+D(PdZIt z55>uuMAv%9ct-2__jli)NPVC$Cxr!o`$C|V>3)KH;IKuIg6(xmR_1>>GyI@>mXFVm zO%C*r@>6-;U`+MH^TRhw4c(SY#Eo3OJC^;M&Ge=%%#}`uvlwlXV|wc6`@TvcWd8sb zcyOB%9Bk0OEBp!CfIaT;^NK^2RJU}F0mtZ2r6i^u^3u(wCBsQ{&^1fI6(%dqju2i^ zw`ywWnoFukW?FDs$ePXhhQ)`oLk`kyOZI+(EM;9NgCZp`zpL!2BLNWYW4mi5lm#vh&Cgi$D zb2q!smqIJFR;61qQ_vy%3J3addRFmbX`?|zvjcHb5Bp}V`@*Ae^lg}9d@N9lfE+Pp&&i0lnw`>HW@L zHO1%ZEAO8kf<>zKB~i`8UPqXix^ksp!P*9o;S`P_wBQ8y!kcVn$QLOJK@dzWp!Xf` z7U@u9-2RH_1#LWM_)x^og`2l%V6c9`OieJAvnGi7vQC{4rX4D?X*qoiTZ-KcW0&SF zTBwM?M6sX)gh;9Lze>{v_EI>_=Rdkx9ik9wNjdw;{B*)4h0tTq9^<}zUERgI;OWNJ zryskF7jHsmtYs7)vqPExyBye1&{U#T!uVUxEUJi##s^V4B2zVPwP;Q zFeWd8F?lhu%~Fzw>!=OpJ?gi!z06a{%Gc?znqsKt#c5bPWp~@!=AegZh~8yK3Q#34 zxyEIHLaN&GXUn#%csx|y+;T?Ni}Y5=hs$XwFHz=Ru;k~25F`w*ua!BBrO7awg90HR zUvQ%oU)$=));y&b5gn9$c@qktq zw8OstQ9{Wsm4E+dx!BPgVm&O>z%H(eHoDei^V@dYQ`po|<>QzOAU3nOQH=1hYO-&P zHzwMWTPsk#2u=u~&B6hGY1{BDsAp)~))!7Ut?j>A$=br*nA+4Ncr3*TPOa}b3@tCk z$*xJXZ~a^rXcAx5%ZNS9_tkibt0h5Q{%Z|)%?BN}15X%Y+%&)HxSu8bAk&-m?_F`t z#E!tTV zvEOFwfLa0E65m3J`=9@Mk@kBJR;)?6d5eC6>FVVgmdyk;oRM55aEt%q{@$i>VwJQo z*@9>DkjO2UGp1kVONPjOe(q15*|73BoZ>e+&`9#QN8@@rNc<%L9a_dQDiRNQCJqB~ zh77hp_%}MiuCPux+%*{lWw3Z$DoiRR`52S2a4}+|`CtsF2xvs|u=t8SMlYIR(?bkPh>QNUYOjRYUPitI<=;52mWXHEI>A8=)&gBiMl zs3k^Vfpj5VFW}-2FA!Gz(|pe6L#v9%v+F}UjonXj(kn?W>Y>`O&N@rFnLStx=NNG# zoW|Irbm`Kq_*CTW6LUSZlyNQjp0}?2N<8|AJ5%?)@ND!OKDD1JMiH*s_a;3gU5D*M zH$fdBgza-AF`SBBhisr{zqoJ6kADc%>IR(ZOA|=w;N`?hW=G!-Dm@t2%6W#8*;BMr zXMNC#?WTc^aQPUdRtn`KEoMGAIv%~j%c%#Pe;)S?18LqOQoSu>6If^nc%|Fv%6|5A zC3O63#F_J1Zsm!wzRvjsW<{OQo+(eAcTnSK=TvD_bQ}ag9u}O#_(`8}m>Tq_H4pk) zcxTrCxDU}RW7jFZ*LCWo2VIcO*6VWgjf8&F*v=ZXhrUlQXjO#Dh3zGo#jTY3dC7&nG{|j*Kr7^?vW$rB(s0q6{4Cs@ z?}5VM+nWi>4(_4jV=v(y^hs8~AEH7Zo<-RE?8B5%j%75#P20)@x+ByHrp4uzH)LBcORWv2~HJ_Y>|tq<=UH%}v#@PmL)Gr_9 zsN-44SsSCLXX=7o@@m}*yj|!6%@BJl0Q)u6Uf!OAH6^(#k{uJ@xeOX1{lzhZe*)!B zFQeS07`Cdb$t(IYBpCjH+~7P0ETWu5OZ25*Gv8A?q$nmFqoE6#k$T>0W>5(}hS>8) z0FN9TmnRNxmfHRc_*EHJTjvupc|1!KF-}SEG~>%X8#-%d2~YNNmlCz?A7GTIhM_Cl zdy<0-b=L1kzq`^SQ5;E``YH6u&LI^?m>gCRCdYfGzYBW){PKxeJ^u`$I>H@LF8yEb z%t8ED<)@~(z~!HlS=Pgm3hVP-wv9jHuxBx-1$NklC5NH^W6gxv#1T2+o-`E?uxs>X zBRPo?4X2T^Z5VGVY|fBUbp{0UNF3iFV6#*Ey|n)&1e%LpHC zlzJS_3QP^Sd?dCWw5UpuKeLBw(CPnBG1pwC`Jm_NFZiMq7RW!RE5Fxe#M?RF*#>k{ z1&h#IpePKQ*E&iMSs_2;|}XR~Y7b^Wn30AI{h>{{)gs zY<%b{qYmiOU2uKqxQKlQ+|mB=EQpeQxVT7r2K@5=5iAJQpPRgj3=~2vS%}QKILJ$?TYe;qal!zQ3m$MLH`w{r3~7S zgH#r!lSUahk(o6p3UMLbdNcQrjzeG*!yZOlA?4fm&x}L*-(UBef1naPq8J7(;y^BU zqW@ndL|HLBTBL(qepUZSB?LM#tP;e9T;6&AbR{G!DFkz$5pIa~btt4(@Ie|uEDgP; z%Gh01wA_AqSk>S?c8-G925nZOml6rSu$TpOOdi6I5VL7QEnzwM|5|Rs+7?o)7x^wT zyyCTGe+stJnt>JL3F=%Fl?uO16jq7e+V&PV9M0sqXPDy~;ijsHTfi*qeU6IaTQgLV z+O9FP3ETqLXO@qyeTvyC5fz=t;7c7aiwS0L_)^A^s^ZUeZ;2C3yrR!SFj|DmOHXvx9EJD!V zs1>d=lmH3h44@uD4GHp$7}fufgz^h zd$&EiO+aN0N|Oo`AB%f0(|Nlg+WCPO$#2Vymk9kZo;L^+!eB8SlA^BI?qA%nLp#u! z!72{;ljxTWJ5z?Ede67Ro!$2mEzl`Dh<+NSQ`V2VLrm6RxLE9axjrQ7eVZaapAax2PrGpmx0UvOT4rTO} z6MNXp%4VD!J*DNERPg;XT%Eq|WaIwjezuk&f@)M6B4tc7u1Q{J^=}SV2W!p@R&1QFxLr2RM^idVrf=`8zdX8P$&UzdmCWn4SDhIJ5R|66d7 zFWgF(eJu^;f8xxg-sye3nHqY0wol*DL(1|=WTEea{sy#hGRKI`aAYJ)0`>+H{YsV&KE z7NG*)^@*@u*|67g?k4rwt1Pq8m)@aMc?7 zfW9X9KA4f66fQRfD#-QR1!3~jc)di6JWQfs ziDRa%IOfB2R{EXKd_D9vzjCC*k73E3Wr!zPS>I==?;iTH@-u(KULO>qx$@$@d`pc4 zuK1;}gYy7KQ#$PhdF3a^wB8lw29v>>j}xJS$ygmw+5v*}(?k61MyO7oe)*7*t)O8M zPqOt>grT9reQd8}vKR)?qmN>#gspWY~C!>6=`a?@=e5 zKsG zjAX~hiN6=Y*Rm1f?Lb1j4UW0-3x67}jkpfh6_AW&>8ko{4-w3wc%8tJB^K;`xNH;b z`R4^`2s_^v=%T7#4S$Qjx!o1bI<7tLPI`s{Vih8tv#>9r-@<*U9ai8jkL<24G$k-j zvQ1pz%-2l=p^dv;W26C;C36S|8mInTGYoYQ$h8?sU}vVkPk+Fy6tH)w0kd4mZ9A({X4qPim@fmjCG zFv@$tuR1dkPhB#TeH)3!Lv;Hsz^WeU14`_LFaNkwL2`2OjaLk9b;nTVt(=IUL|Zwn zw57x=9ls&QiYqe&si0oMh9`tNC$rTv&o*%SRj+2e#ms)jBWJXVm}qIB?$>80H%Dx= zdwufuic0V1%4I#=$ssIuhy38R-bJ(&Z1QSg-6H}Rf3fSIW<$Sv_4_ToMX#|Ov$H@j8%e-v^a8QfGJ(1HCyw^^opw;W% zuh#f`{()y}uD0i~BzK7DfqT*VFm)&k_Hlk-Bx=~~0jJ&qsmT(vtO- ziCc7zCEuS|uY)CcoEOHdah_c8B|Fi`=F(ujI?T>a28MfzF;vHI!?@>|58||X^4^J{ z6Iq2ZqqDs3&+~wroZfWCwFl7x7&19w8{S5FW9T_v@UnXMW+Ndgmga z7TqXKH`IRx3)L{=DyyO^eHL>VqexGNGQS67w2 zM1xhzmMtM`&XS`*o3q>>=~rLBKWerh)krQXM4*R$zQ+92`9^9Z@Vx{)`~}slkt>^c zh*M>pqyrv zzlaa)*6*C%@6hL#^!}5sX>jr(H3Qvz_Y+d}VlKGPK{&0W-tzo~vfq@!=m@Qne}2#I z()#u75IEv~=k{D!I|qRq+UqKX#~dDc6B>E^m)y%Fg|!y$>3>jt(9VmW)EiKM2`G4Q z3t<4d@zwS@9o@Jr$gudZK+gQ*Dy3Z?H1*TjUorv+Ok}^hD|}7Oaohr~>H|mGJB~M> zj;U#$al3zbk@$l501QYc5HW-45a%!5l-SY{!E>VGY~SkkK3X>y3Z$EPyslv~ajE*C z$1!%B7jYV|16_kul*hrMHL;)a(mGne}~@JQw^$`OK3=& zbTd=7SPIo!%7(Z2zFB8>e^{iW?gjvnCX{F872=F!hu#5R0r!2{-C9&E@=&;hwdzjq ziVJb`@}YqaV7tcEw{OLhEM+Y{2%4th%qDMR#P9+#%bF{&43DJ?!;2CgM`{Kw{ii-c84 z#4E*Ek&Wrw%~THv0sBqphJeoGaUE8x&T+z2d{_C{LfGma-grJ0HjnO8CL27-_ofnC zlUjjIL%I=xU>E|QAc>gT;<)ImhYXsOG@;&d;y=AEBYjYRL-Pxo zv8T`|W!Dlk1B*?EL4LWNZvK%)Ez>efX^{ziAgnaOT$SyiIWel)p?!R~ZEGoBjv0XHg zT!R`^r>~+3%@wR)d);02$Mo46*!LyOms= ze^m386a6qyNGBLW^x-Z)PcB70%S7Uoc@8`)-#T*jbOVTj~C;F=Odr zAD*q<{4yTLmefIGVY(}`hn%VV@SH<&^6FL3#mHvO@7Iy`4@O5cWi#_YWA5A{puQIs z^Gk4N`SX}#x;hu);21M;8n4GBHq$ifLkI z97w*8t^MW`uC{XF#7_c7_Ixz@F_hJd1jtiq^Y^mET`KXgMadKh}Qd|GcwXUPak zu#c3`@b&nqX>I!%k*gB|lKrVTv`mo{a_j&0GlEpEZ>yM$&L&9_-rJ1vYpw5VWr}*6 zu+WssWz|(=6%vMwxA`ygDTTdd@*QpAi7QvdG|5tD-yRa=keqL2`<35}hD8iQOEt{V zOzuwcM@KTV4l4Zpj>9`CVnFwHA_Nv^@Bb%POtvIE|MrlVHERo7HA}~Y-eN%nnyU|? zFgCIDPnur4)fn=1J0`l{v~Ot9&cEHNzT4@ceA z{^L$#a4x)`<3A}~-cS8<alwy*^+AwMZxoN<*p^C9?3y0ZGjGBZKew>1BA`HX4Ls7NY7gX zVUep|kOlfV6@kYHIF;+Gyuo^YuY-F>ZhL^Lc-zKd5}rDrxE;4@&P_jD4OS`AR05a% zV?chw>F1N%s|5${!}+2=T;aI~_m3l!?5}e@6sdAH5%80Q*(I1lAfH7+>8)=cdzRRw z(ucm5WyP!%p{hPD}5neFq>+?kzrO8}2s>8oCdW-3EI zWv%ZheFFj=V2Uj!cxJSS?5vq?#Gu~^tdr#nL}6fu=ujIrC5^fzt&ZXvrG`Bg(`@A@3iFj+QP$S zDMadJP>#9ag*&1;e)_3dytC^=o8N)IF+23Jm8jPKJLcagY>Pil`PWT(@ ztypn2lY5OWb>ki}_B@L&nRVp2Qk~n@)xaFTA(2PfZB^2r5c7?q)fpNhQ10FuC%s^= zS@_>)f%XNS4ceh9auzay7q-+##OL+>hQ+_tu} zPhMl%S7cNPLB(S4fdt%;iEC4!`%?1Rq(fU*G^RMmj8&LhR?MOe8d4mpbfLD{bP|>* z9de=Cy!IvBw`f~DTuN|T;B+yOVhY|KiOQf8mH-3TO;bvb6Hhf_hWBrj;n#kZoyBiY zUKGjIfj+Q2fAo^-Z;WuTt;-|sJr&rS)uI3{_tV5J;e!>hqLBLP`j8C*_tMs)Kfsdb zymMP7`OkNKr-1rCuXNeViwB*NeZsJ^0TkgL#(7!HwfAetscYQc;As_0^)WwD!7EPM zDy}b7YHD4C3cOQt4GrsqD^+;%i1`hF^k;W}Vwz^WzA^enz%l3>tcH6FQ@MSKT^i0= z$=qeGyAP!vBN;8fzNGjDaqb$qNn}cM)tIg<51$-Jmg(xxX4x2O@Iqzvva- zWAoe1thW;xpht6{3P^Wi)>@3j6DZ_{Cb)G^A_vF-~HzloBc9ti@zVE51Js7>+SBS zB~~3(fstYQ(6^5ZrZe7a8o2RXClXrluF8WAH4>q>HJGuIxCmKdXQTc8#u7+=;aO26 zAVT$k7&u&g#fwL(;QW#_i;vJ>9F8tOezH0|2iCkTnYg>Rx5f!QJC(S$Y5hA;!sjU; ze7-YPnx&t?=H{4-N^MjwFEFXL&wH;58X^Z`5a~OGGLCz-bL)WfYcvB zDGc?Wug9iG2r?`rQi-_e>aWiPpjhVRjOq6uXrBxYzDfsojPR=*Wy85qw-J%s{BCVC+iz(Eb&{&OY%xI3+L}|_f+VlLr^DyjY zT}i*wQd-B=QXfXL1urH3@Ruk_Ah4>KrO6veN9<<+zxlUqQmi?Ms9ZN2GB(S?(UkR5 z3#6}%E9g%ffE4quM07LWPI3<_5U`X21TLp{nd3G5N8i;!`baJINQhW8aJA+EOh%nx z{y}L#=7;-Ig40!wC#&$$XmZcqK5;cyc@Cqe?b}B@Nj%X6gHuM$v&>noA4|GB$YbT9 zG;sm1kSwcLXm8G(h`XIO$tTtKJrmZZzi`I`K&}+4TA;&K zfNZ^#4_DDM*xH%x7?eBa?R$B2>5?n7s@6>fMT12a4y2Z@spzPXWeCoS#q zM0UM-oW|RH^Y@F*?PiyfV`7ONysG)S*0zbsQ$RVEi?BIZr9F8E;-BsJX)O<{n|4*W z&)!xQ)~U0&f7@jDZfjzGT4$N!3%b(jwPq>%1{VheIwimXv-hsRM>1ERvP&MHig8cA zXd5V=JT+b&QDYS~7}_q=G@QZTHFwH=E&D_U`&4t*Jz`GWZ)P|BT-@c;DemZ-0;(^8 z2dBDYeB%5>F9RnIEL5|uGWK4!`T^~Ms$GOQc6*(Fe!gamG~XrKQ#k&2rRUR&9830A zo@a3Zfo=1q-QXNt_)-JRy*OBKXGnc7M8ju&77SbX!K|VbG@_N$tfb-Phc1emZ@p9B zgq8^I{F&Vr=~vTKt~Zgc=7#c{*J_D&?kw{8^CzLl$3>;u@C-bum=`jF?)t2awIAq- z`P_#frra#`yXIDCxemo+zU`xF#ch{*;!RyKjblO$%@qV@81D50Tj#W^#&&4npGhX> z1r&S|fxByFPr%9kqiv@-b&Flc?cK$cb#t$1pvU?X)~Yw4nWn5sp_byxsk9eAIqll@ zERAroO!}}NH*qsl9Y}xeaV$?#p%Uu9U9h!OV@4dcVz&!-jem>dG$Ry!Jn3qI zKNa(j(0pntUJYRhimOi!7fnB3YwI53UM_jY=gQIn*hpP`*CM$4=C}D#t{-_`)@7hH zqPnrB&|d&dxBEJxejtLWcF57!%Nty48m*Wv;2uEsMeKNPtP9|z=U?^%x{lE?p2rpB_}!%I$ef)mJd9rn-mD=46T0|aBiY3;*}<@<2eP0hOUm>(O#LlLC5!bu_g z=Jg*n!@RDC1^n3#KoVH6po~B@KR9%+YqS|rp>8YcR~uGzrc%w~K6ylj@>DunsB^xv zBp3qTX|nGHL%ZQ}gxe7aQB=9^rPoY~$0q}{kEhDZVWz+#0svq4X#v2p!85Kw0Zb#D z-|TdV_jc*+Qua=JgW_&C{R1OWI*`LLl*_Fa?4@~>Ox{)9z=IbiUF9Yjy6 zIVE;45s9zKh%EojCvlDCTMWpbF2Ou!p2V&76%wGZLIWD@3FcM6%Gu$Uh`|ShH!J9f zlZV|kIgJ>;hOB{lEk!K+Cq?J#3s-7!T1Ks^y_%S?PU0ylTyS%6_}h_xQU+nBl^f*%nM* zD#624GWaaHArfJaoz)O55jC_8=c7F|rb2(`?x`0baDZF7{4AE*47Xc_B}C1Jo^P-^ zF0RZ&C}3)*g=>V;Q#0t<^@`qmINV%h%*}QqEeOk)qaHKIaXauHo!Y$ydr})~YU!~r zG*UY_?%>c&Wn2<6S2&D$dOxFIeRd|1DqUi^)fdqIp71o2G$ZOqCnMOic!kpvg(quR zV&;Y2Tj4@#X`fto*V1lnyF5LaUFQQsUUyv||2%MQm5g7E(n^`G}>#J1gl_N8(0 zeu4t7k{l_y&4;CvkMjRcTE@EB9snRYlekTBX?eOvZIP$4o5Vd;8Wz2-;7YtJkdi!c z@fo-Po18i*eC*i>w|}0b2ljDI%VO+#uer(~>{OA_gv(G+GKw6cuB1CSFuT^|RCdea z#K%ZAS$p?g$@tjXqWROhY;AMOcy}nLx%R^cWW?T-Y6b1f4AZ7cwLHW#&VJiUDVyT( zH&xXBACE}Jo{;}D+-W%!b>}XldxAKWsY&MroJ56>1(on`UUG7l<;?pT1 zHy8bk9*;nUWT7-3NSr@o?4|oT=mcoil#lvPDdFa~*D5P^+ElyIc|Yxyf@qMPf8&oh zFY2Aw8bMJR?IHX-6LEm`PHIoQi1A>c8P`9B0VuZIc~P9CP(#+-pOT3&%DG>=Q4b1-VF$$DTD@ zqYKQGx`W}jp)qn171tXI94G3-NsM{48);+;@FB z{EKqg$n?@$n?4GsmQqbU0DDkiyx^SQ@VD}wyWa#{G+e5<>P`4J!(3qwSRG?$I#G-3 zF}44r3kaV5Cq$iEM%bbpC&P2ARSb5zm10b=E>fb^%JOKn28X;zRt99Ln1+og&-_^* z!CBX?WG%V9BsJrs?bPTGr<3|}t~iG2PxZE)e2_rAcfHA<2OJFTG3pkMqu$Rr;turFknQaX8^eFX$JJ>nDfiA0bYIw2^DFR_Vc+SBy}^t?j>x*Wz6c?u z7!i}$k1doS?D!Gi*v_ep;lw;)-d*5wmPbEe<=By#d}E>({T8u3(6#z@EOJOS%CP6z2R zJeh;PG#Ra;$$4KkMh0r#wZas;3+jT{lJBsR!7g>UpgcI1Wj_(3vCX!oEacXcubm*=-~nvbVYs z0^-zjW-7_$N1rM)VxdSq!slo%l&w0e64;mSD<`{+E^X`zoQ*^YzV~1{E5iESJ`b&% z%X622Z|5e#hg~%RC?9p>YkOsepmC8dHI+TKkj*ytU1=(Cc9slTCApo1>_mBjhGLIX z61MS_b&sQB;?pzLOF2@BJSm7GHBi>VOmS-jV+Q00G6w=F@HXtKf@zr^rmw?0fWn-` z_E53IijKIf=ED2s$7u`a(b<;7x_odAIA`%(yV!#ykoj#QCQNi}o*HZaUQ%}y$IPI# zz)t4aD8;Z)Q7W7y`En!xN(QTo=>jdc&^%C<`*qGw$?!Eh$^$&y!u_B zW@OKf1YdPCTv?Vi<%K-QI(aGJTb`dMET$n~X;qI8lDDPh$%Ud5w{VI(r{x8e8{D zWOck>sPc$d+t!L4)9;B3y~P?;Gv^@%JvF)@vwI#Hfb2-Y7*y~Kjn=a{tzt2W!qJbf zgu6E-S7If4BeOm57m{-9U?wgUAq}xMD%B5O?7@S7+@Am5A$fO-WxTwzL4~F~4-HaIdJv3>LF6-1O}BkksSz9?rB}p)%%WiWjjIpuHurwXtoR+5Zt!fW9bCbc4u!DU=are&$n7r` zk=b9%X1+{aWx2Mp9T@4u_>KpZWb`>6a)W&o>MZW%4ccSHwso%C7*Qf;@#8OCJ4eE| zOTRB!fPa$_BGp$sB%YjCEc7d!1#8LmM4p&27G6>aT(o4((hmi9!o4kEM_IG>X#{~- zgI-&1p6@Hyy{@Rrmq9K=4|;mGh0tod#$_j?;mI#h8tXbIhmkr%)~B8o`>=Ji-7C2zqs}XlBeb(9WVHk#qqssMj9${kq6rA;!}X z%@t0h`u9OGss0d$v0mQ2J>Wg*;r-!nv?RAEb#CSEf7NN)8#wn#|3}A{iAeVAKeECK zcfD$2zpxm8eOU5po9hQi$OVcqM4z)6@9o76^7*h;?VxP;vt-(9l}6`33{$e?`ya$K z*_z9EB=O`dzTy=jL!RAM?=f$f7=he5%GxJtem#ahmf7*oK`In#qP}Q9q4!g|u_${q zXHE#+(O5J@MPkI?=<7>O@FU68SZ8n4ZK;Jd`@Lxs~8&ro8fZ^yZ-UIN}vNzUR9fVDXUaRLB=L9Qy-;@A7dM07?$Zkl?%TVl-u*8vU zkP<9bIc@j&vUVeN#pX5)N{~ zdy0CkwbV+(&q*ZsXzb|g6l8xBdDq0=o$u9pj{@-Q_#4o@hZWCJV;c7nzq5kW=%tK* zS(e6bu_Ja8EruPT`Q!EN?-P641!XG7jVek<%l7JYzJ9cylAQ5cEAa*y&uNG}Io7r^ z+lcR8;)T7RO5E;+-*o*c0p3cyC~3a)VkrJ6inAwYZMKlilRa?4J#v+n@~$fz>yzKI zNy=D)No?#mVv)NqSZnnJSRWIjbx$4w!qiwLU~#RnurXPWpN+{hau5?j{VBkP<@96j z`)_&8G`UAM6kNwx4gR``F~arIl$m$CfSIXx|^J z*EGgUsciRQ`t=`6%Fc8>to;thC(($`%ILs?l084Uuo?ZHRmM35{f5`qgK>hWG*czpPJa#`!OpCK`$>F3(~u??%w-n`DREPbZIJ88>rrlwA%A&tY5Cr` w=B<&XnHDrk@tL|jMa*0Mb>c23VOM}8uZI(_MQE=54{-oVtpET3 diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae index e679319e7..6a8ae53bf 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.dae @@ -5,173 +5,429 @@ Blender User Blender 2.93.0 commit date:2021-06-02, commit time:11:21, hash:84da05a8b806 - 2021-06-23T01:55:12 - 2021-06-23T01:55:12 + 2021-06-27T21:10:49 + 2021-06-27T21:10:49 Z_UP - + - - -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 - + - - -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 - + - - 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 - + - - + + - - - + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+ + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+ + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+ + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 + + + + + + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.12757e-5 3.52696e-5 -1.06829e-4 2.00263e-4 3.00609e-4 -2.70703e-4 -6.44047e-4 8.09974e-4 -7.94801e-4 9.88267e-4 -4.6596e-5 -8.23317e-4 -0.001708984 -0.002333283 0.001665174 0.002335548 -0.001499176 -0.002713859 0.001005887 8.21775e-4 -0.00440669 -0.002943873 -0.003749966 -0.00250107 0.009544551 -0.006051063 -0.005689024 -0.0014171 0.008366465 -0.01375323 0.003897249 -0.01233822 -0.006401419 0.01445537 -0.02451014 0.00194478 -0.001159012 -0.01313722 0.00547719 -0.006664872 0.01335299 -0.01275253 -0.01383519 0.00973469 0.00466609 0.002507209 0.01457923 4.50887e-4 0.01174861 0.01563465 -0.007085084 -0.005193293 -0.001585364 -0.006084084 -0.003864407 -0.0193513 -0.005607426 0.001835048 3.41592e-4 -0.01256364 0.02819061 0.1385139 0.3171014 0.5794721 0.8968456 1.278944 1.679311 2.175644 2.719395 3.319481 3.979621 4.688361 5.425393 6.186198 7.031567 7.89382 8.812631 9.712822 10.67551 11.67646 12.68361 13.69823 14.77877 15.81732 16.93447 18.01933 19.13528 20.24976 21.36608 22.50669 23.63151 24.75282 25.86339 26.97742 28.08011 29.15177 30.22353 31.28487 32.30588 33.33785 34.31761 35.31719 36.20272 37.1124 37.97687 38.78798 39.57774 40.32164 41.03234 41.68122 42.25549 42.80435 43.30276 43.76669 44.10105 44.41888 44.67058 44.87212 44.95766 45.02122 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 + + + + + + + + 0 0.07415217 0.293276 0.6523724 1.146443 1.770487 2.519507 3.388504 4.372477 5.466431 6.665362 7.964274 9.358171 10.84204 12.4109 14.05975 15.78358 17.57739 19.4362 21.35499 23.32877 25.35253 27.42129 29.53005 31.6738 33.84754 36.04627 38.26501 40.49873 42.74246 44.99119 47.23992 49.48365 51.71738 53.93611 56.13484 58.30858 60.45232 62.56109 64.62983 66.65363 68.6274 70.54618 72.40499 74.19882 75.92265 77.57147 79.14035 80.62422 82.01812 83.31703 84.51598 85.60992 86.5939 87.46289 88.21191 88.83594 89.33001 89.68912 89.90824 89.98239 89.98238 89.98239 89.98239 89.98238 89.98239 89.9824 89.98238 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.9824 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98238 89.98239 89.98239 89.98238 89.98238 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98238 89.98239 89.98239 89.98238 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98238 89.98238 89.98239 89.98239 89.98239 89.98238 89.98238 89.98238 89.98239 89.98239 89.98239 89.98239 89.98238 89.98239 89.98238 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98238 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 89.98239 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 + + + + + + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.07413142 -0.2932618 -0.6524791 -1.146173 -1.770666 -2.520709 -3.388543 -4.372961 -5.467864 -6.665779 -7.96844 -9.362901 -10.8439 -12.41277 -14.05775 -15.78061 -17.57712 -19.44111 -21.36097 -23.32804 -25.35841 -27.42397 -29.54372 -31.68508 -33.84848 -36.04831 -38.27301 -40.51455 -42.74691 -45.01224 -47.22633 -49.4923 -51.72329 -53.91454 -56.17096 -58.30061 -60.46962 -62.57535 -64.61927 -66.66268 -68.64148 -70.5687 -72.42087 -74.17724 -75.94079 -77.56175 -79.14631 -80.6141 -82.00772 -83.32174 -84.52201 -85.61045 -86.59677 -87.46883 -88.24846 -88.87812 -89.33636 -89.67314 -89.9391 -90.0008 -89.99021 -89.99715 -89.9868 -89.96733 -89.97451 -89.98069 -90.01648 -90.02372 -89.97389 -89.98189 -89.99822 -89.96888 -89.96631 -90.02326 -89.97745 -90.00614 -89.98288 -90.02886 -89.9727 -89.98674 -89.98052 -89.99629 -89.98717 -90.03237 -89.97457 -89.986 -89.99273 -90.01967 -89.99945 -89.97858 -89.98007 -89.97471 -90.01986 -89.9764 -90.01325 -89.98709 -89.98157 -89.97006 -89.99793 -89.98364 -89.96604 -89.97495 -89.99713 -89.97775 -89.96984 -89.97912 -89.97496 -89.9839 -89.98706 -90.01616 -89.98995 -90.01847 -90.00894 -89.96981 -89.98393 -89.99552 -89.97649 -89.97789 -89.98429 -89.96865 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + - - - 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 7.541666 7.583333 7.625 7.666666 7.708333 7.75 7.791666 7.833333 7.875 7.916666 7.958333 8 8.041667 8.083333 8.125 8.166667 8.208333 8.25 8.291667 8.333333 8.375 8.416667 8.458333 8.5 8.541667 8.583333 8.625 8.666667 8.708333 8.75 8.791667 8.833333 8.875 8.916667 8.958333 9 9.041667 9.083333 9.125 9.166667 9.208333 9.25 9.291667 9.333333 9.375 9.416667 9.458333 9.5 9.541667 9.583333 9.625 9.666667 9.708333 9.75 9.791667 9.833333 9.875 9.916667 9.958333 10 10.04167 10.08333 10.125 10.16667 10.20833 10.25 10.29167 10.33333 10.375 10.41667 + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 - + - - 1.003296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.013037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.029 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.050963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.078704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.112 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.15063 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.19437 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.243 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.296296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.354037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.416 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.481963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.551704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.625 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.70163 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.78137 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.864 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 1.949296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.037037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.127 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.218963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.312704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.408 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.50463 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.602371 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.701 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.800296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 2.900037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.099963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.199704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.299 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.39763 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.49537 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.592 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.687296 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.781037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.873 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 3.962963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.050704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.136 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.21863 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.29837 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.375 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.448297 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.518037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.584 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.645963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.703704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.757 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.80563 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.84937 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.888 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.921297 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.949037 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.971 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.986963 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.996704 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 5 0 0 0 0 1 0 3 0 0 1 0 0 0 0 1 4.997113 0 0 0 0 1 0 3 0 0 1.003296 0 0 0 0 1 4.988574 0 0 0 0 1 0 3 0 0 1.013037 0 0 0 0 1 4.974563 0 0 0 0 1 0 3 0 0 1.029 0 0 0 0 1 4.955259 0 0 0 0 1 0 3 0 0 1.050963 0 0 0 0 1 4.930845 0 0 0 0 1 0 3 0 0 1.078704 0 0 0 0 1 4.9015 0 0 0 0 1 0 3 0 0 1.112 0 0 0 0 1 4.867405 0 0 0 0 1 0 3 0 0 1.15063 0 0 0 0 1 4.828741 0 0 0 0 1 0 3 0 0 1.19437 0 0 0 0 1 4.785687 0 0 0 0 1 0 3 0 0 1.243 0 0 0 0 1 4.738426 0 0 0 0 1 0 3 0 0 1.296296 0 0 0 0 1 4.687137 0 0 0 0 1 0 3 0 0 1.354037 0 0 0 0 1 4.632 0 0 0 0 1 0 3 0 0 1.416 0 0 0 0 1 4.573197 0 0 0 0 1 0 3 0 0 1.481963 0 0 0 0 1 4.510907 0 0 0 0 1 0 3 0 0 1.551704 0 0 0 0 1 4.445312 0 0 0 0 1 0 3 0 0 1.625 0 0 0 0 1 4.376592 0 0 0 0 1 0 3 0 0 1.70163 0 0 0 0 1 4.304928 0 0 0 0 1 0 3 0 0 1.78137 0 0 0 0 1 4.2305 0 0 0 0 1 0 3 0 0 1.864 0 0 0 0 1 4.153489 0 0 0 0 1 0 3 0 0 1.949296 0 0 0 0 1 4.074074 0 0 0 0 1 0 3 0 0 2.037037 0 0 0 0 1 3.992437 0 0 0 0 1 0 3 0 0 2.127 0 0 0 0 1 3.908759 0 0 0 0 1 0 3 0 0 2.218963 0 0 0 0 1 3.82322 0 0 0 0 1 0 3 0 0 2.312704 0 0 0 0 1 3.736 0 0 0 0 1 0 3 0 0 2.408 0 0 0 0 1 3.64728 0 0 0 0 1 0 3 0 0 2.50463 0 0 0 0 1 3.55724 0 0 0 0 1 0 3 0 0 2.602371 0 0 0 0 1 3.466063 0 0 0 0 1 0 3 0 0 2.701 0 0 0 0 1 3.373926 0 0 0 0 1 0 3 0 0 2.800296 0 0 0 0 1 3.281012 0 0 0 0 1 0 3 0 0 2.900037 0 0 0 0 1 3.1875 0 0 0 0 1 0 3 0 0 3 0 0 0 0 1 3.093572 0 0 0 0 1 0 3 0 0 3.099963 0 0 0 0 1 2.999407 0 0 0 0 1 0 3 0 0 3.199704 0 0 0 0 1 2.905188 0 0 0 0 1 0 3 0 0 3.299 0 0 0 0 1 2.811093 0 0 0 0 1 0 3 0 0 3.39763 0 0 0 0 1 2.717303 0 0 0 0 1 0 3 0 0 3.49537 0 0 0 0 1 2.624 0 0 0 0 1 0 3 0 0 3.592 0 0 0 0 1 2.531363 0 0 0 0 1 0 3 0 0 3.687296 0 0 0 0 1 2.439574 0 0 0 0 1 0 3 0 0 3.781037 0 0 0 0 1 2.348813 0 0 0 0 1 0 3 0 0 3.873 0 0 0 0 1 2.259259 0 0 0 0 1 0 3 0 0 3.962963 0 0 0 0 1 2.171095 0 0 0 0 1 0 3 0 0 4.050704 0 0 0 0 1 2.0845 0 0 0 0 1 0 3 0 0 4.136 0 0 0 0 1 1.999655 0 0 0 0 1 0 3 0 0 4.21863 0 0 0 0 1 1.916741 0 0 0 0 1 0 3 0 0 4.29837 0 0 0 0 1 1.835938 0 0 0 0 1 0 3 0 0 4.375 0 0 0 0 1 1.757426 0 0 0 0 1 0 3 0 0 4.448297 0 0 0 0 1 1.681386 0 0 0 0 1 0 3 0 0 4.518037 0 0 0 0 1 1.608 0 0 0 0 1 0 3 0 0 4.584 0 0 0 0 1 1.537446 0 0 0 0 1 0 3 0 0 4.645963 0 0 0 0 1 1.469907 0 0 0 0 1 0 3 0 0 4.703704 0 0 0 0 1 1.405562 0 0 0 0 1 0 3 0 0 4.757 0 0 0 0 1 1.344592 0 0 0 0 1 0 3 0 0 4.80563 0 0 0 0 1 1.287178 0 0 0 0 1 0 3 0 0 4.84937 0 0 0 0 1 1.2335 0 0 0 0 1 0 3 0 0 4.888 0 0 0 0 1 1.183738 0 0 0 0 1 0 3 0 0 4.921297 0 0 0 0 1 1.138074 0 0 0 0 1 0 3 0 0 4.949037 0 0 0 0 1 1.096688 0 0 0 0 1 0 3 0 0 4.971 0 0 0 0 1 1.05976 0 0 0 0 1 0 3 0 0 4.986963 0 0 0 0 1 1.02747 0 0 0 0 1 0 3 0 0 4.996704 0 0 0 0 1 1 0 0 0 0 1 0 3 0 0 5 0 0 0 0 1 0.9754144 0 0 0 0 0.999588 0 3 0 0 4.996292 0 0 0 0 1 0.9516481 0 0 0 0 0.9983703 0 3 0 0 4.985333 0 0 0 0 1 0.9286875 0 0 0 0 0.996375 0 3 0 0 4.967375 0 0 0 0 1 0.9065185 0 0 0 0 0.9936296 0 3 0 0 4.942667 0 0 0 0 1 0.8851273 0 0 0 0 0.990162 0 3 0 0 4.911458 0 0 0 0 1 0.8645 0 0 0 0 0.986 0 3 0 0 4.874 0 0 0 0 1 0.8446227 0 0 0 0 0.9811713 0 3 0 0 4.830542 0 0 0 0 1 0.8254814 0 0 0 0 0.9757037 0 3 0 0 4.781333 0 0 0 0 1 0.8070624 0 0 0 0 0.969625 0 3 0 0 4.726625 0 0 0 0 1 0.7893519 0 0 0 0 0.9629629 0 3 0 0 4.666667 0 0 0 0 1 0.7723356 0 0 0 0 0.9557454 0 3 0 0 4.601708 0 0 0 0 1 0.756 0 0 0 0 0.948 0 3 0 0 4.532 0 0 0 0 1 0.7403311 0 0 0 0 0.9397546 0 3 0 0 4.457792 0 0 0 0 1 0.7253148 0 0 0 0 0.9310371 0 3 0 0 4.379333 0 0 0 0 1 0.7109375 0 0 0 0 0.921875 0 3 0 0 4.296875 0 0 0 0 1 0.6971852 0 0 0 0 0.9122963 0 3 0 0 4.210667 0 0 0 0 1 0.684044 0 0 0 0 0.9023287 0 3 0 0 4.120958 0 0 0 0 1 0.6715 0 0 0 0 0.892 0 3 0 0 4.028 0 0 0 0 1 0.6595393 0 0 0 0 0.8813379 0 3 0 0 3.932042 0 0 0 0 1 0.6481482 0 0 0 0 0.8703703 0 3 0 0 3.833333 0 0 0 0 1 0.6373125 0 0 0 0 0.859125 0 3 0 0 3.732125 0 0 0 0 1 0.6270185 0 0 0 0 0.8476297 0 3 0 0 3.628667 0 0 0 0 1 0.6172523 0 0 0 0 0.835912 0 3 0 0 3.523208 0 0 0 0 1 0.608 0 0 0 0 0.824 0 3 0 0 3.416 0 0 0 0 1 0.5992476 0 0 0 0 0.8119214 0 3 0 0 3.307292 0 0 0 0 1 0.5909815 0 0 0 0 0.7997037 0 3 0 0 3.197333 0 0 0 0 1 0.5831875 0 0 0 0 0.787375 0 3 0 0 3.086375 0 0 0 0 1 0.5758519 0 0 0 0 0.774963 0 3 0 0 2.974667 0 0 0 0 1 0.5689606 0 0 0 0 0.7624953 0 3 0 0 2.862458 0 0 0 0 1 0.5625 0 0 0 0 0.75 0 3 0 0 2.75 0 0 0 0 1 0.556456 0 0 0 0 0.7375046 0 3 0 0 2.637542 0 0 0 0 1 0.5508148 0 0 0 0 0.725037 0 3 0 0 2.525333 0 0 0 0 1 0.5455624 0 0 0 0 0.712625 0 3 0 0 2.413625 0 0 0 0 1 0.5406852 0 0 0 0 0.7002963 0 3 0 0 2.302667 0 0 0 0 1 0.5361689 0 0 0 0 0.6880788 0 3 0 0 2.192708 0 0 0 0 1 0.5319999 0 0 0 0 0.676 0 3 0 0 2.084 0 0 0 0 1 0.5281644 0 0 0 0 0.664088 0 3 0 0 1.976792 0 0 0 0 1 0.5246481 0 0 0 0 0.6523704 0 3 0 0 1.871333 0 0 0 0 1 0.5214375 0 0 0 0 0.640875 0 3 0 0 1.767876 0 0 0 0 1 0.5185186 0 0 0 0 0.6296296 0 3 0 0 1.666667 0 0 0 0 1 0.5158774 0 0 0 0 0.618662 0 3 0 0 1.567958 0 0 0 0 1 0.5135 0 0 0 0 0.608 0 3 0 0 1.472 0 0 0 0 1 0.5113727 0 0 0 0 0.5976713 0 3 0 0 1.379042 0 0 0 0 1 0.5094814 0 0 0 0 0.5877037 0 3 0 0 1.289333 0 0 0 0 1 0.5078125 0 0 0 0 0.578125 0 3 0 0 1.203125 0 0 0 0 1 0.5063518 0 0 0 0 0.568963 0 3 0 0 1.120667 0 0 0 0 1 0.5050856 0 0 0 0 0.5602454 0 3 0 0 1.042209 0 0 0 0 1 0.5039999 0 0 0 0 0.552 0 3 0 0 0.9679999 0 0 0 0 1 0.503081 0 0 0 0 0.5442547 0 3 0 0 0.8982916 0 0 0 0 1 0.5023148 0 0 0 0 0.537037 0 3 0 0 0.833333 0 0 0 0 1 0.5016874 0 0 0 0 0.530375 0 3 0 0 0.7733746 0 0 0 0 1 0.5011853 0 0 0 0 0.5242962 0 3 0 0 0.7186666 0 0 0 0 1 0.5007939 0 0 0 0 0.5188287 0 3 0 0 0.6694579 0 0 0 0 1 0.5005001 0 0 0 0 0.514 0 3 0 0 0.6259999 0 0 0 0 1 0.5002894 0 0 0 0 0.5098379 0 3 0 0 0.588542 0 0 0 0 1 0.5001481 0 0 0 0 0.5063704 0 3 0 0 0.557333 0 0 0 0 1 0.5000626 0 0 0 0 0.503625 0 3 0 0 0.5326257 0 0 0 0 1 0.5000185 0 0 0 0 0.5016297 0 3 0 0 0.5146666 0 0 0 0 1 0.5000023 0 0 0 0 0.500412 0 3 0 0 0.5037088 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 + + 1 1.003296 1.013037 1.029 1.050963 1.078704 1.112 1.15063 1.19437 1.243 1.296296 1.354037 1.416 1.481963 1.551704 1.625 1.70163 1.78137 1.864 1.949296 2.037037 2.127 2.218963 2.312704 2.408 2.50463 2.60237 2.701 2.800296 2.900037 3 3.099963 3.199704 3.299 3.39763 3.49537 3.592 3.687296 3.781037 3.873 3.962963 4.050704 4.136 4.21863 4.29837 4.375 4.448297 4.518037 4.584 4.645963 4.703704 4.757 4.80563 4.84937 4.888 4.921297 4.949037 4.971 4.986963 4.996704 5 4.997113 4.988574 4.974563 4.955259 4.930845 4.9015 4.867405 4.828741 4.785687 4.738426 4.687137 4.632 4.573197 4.510907 4.445312 4.376592 4.304928 4.2305 4.153489 4.074074 3.992437 3.908759 3.82322 3.736 3.64728 3.55724 3.466063 3.373926 3.281012 3.1875 3.093572 2.999407 2.905188 2.811093 2.717303 2.624 2.531363 2.439574 2.348813 2.259259 2.171095 2.0845 1.999655 1.916741 1.835937 1.757426 1.681386 1.608 1.537446 1.469907 1.405562 1.344592 1.287178 1.2335 1.183738 1.138074 1.096688 1.05976 1.02747 1 0.9754144 0.9516481 0.9286875 0.9065185 0.8851273 0.8645 0.8446227 0.8254814 0.8070625 0.7893519 0.7723357 0.756 0.7403311 0.7253148 0.7109375 0.6971852 0.684044 0.6715 0.6595394 0.6481482 0.6373125 0.6270185 0.6172524 0.608 0.5992476 0.5909816 0.5831875 0.5758519 0.5689606 0.5625 0.556456 0.5508148 0.5455625 0.5406852 0.5361689 0.532 0.5281644 0.5246481 0.5214375 0.5185186 0.5158774 0.5135 0.5113728 0.5094814 0.5078125 0.5063518 0.5050856 0.504 0.503081 0.5023148 0.5016874 0.5011853 0.5007939 0.5005001 0.5002894 0.5001481 0.5000626 0.5000185 0.5000023 0.5 - - + + - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - + - - - - + + + + - + + + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 + + + + + + + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.999588 0.9983704 0.996375 0.9936296 0.990162 0.986 0.9811713 0.9757037 0.969625 0.9629629 0.9557454 0.948 0.9397546 0.9310371 0.921875 0.9122963 0.9023287 0.892 0.881338 0.8703703 0.859125 0.8476297 0.8359121 0.824 0.8119214 0.7997037 0.787375 0.774963 0.7624953 0.75 0.7375046 0.725037 0.712625 0.7002963 0.6880788 0.676 0.664088 0.6523704 0.640875 0.6296296 0.618662 0.608 0.5976713 0.5877037 0.578125 0.568963 0.5602454 0.552 0.5442547 0.537037 0.530375 0.5242962 0.5188287 0.514 0.5098379 0.5063704 0.503625 0.5016297 0.5004121 0.5 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + + + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 + + + + + + + + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.003296 1.013037 1.029 1.050963 1.078704 1.112 1.15063 1.19437 1.243 1.296296 1.354037 1.416 1.481963 1.551704 1.625 1.70163 1.78137 1.864 1.949296 2.037037 2.127 2.218963 2.312704 2.408 2.50463 2.60237 2.701 2.800296 2.900037 3 3.099963 3.199704 3.299 3.39763 3.49537 3.592 3.687296 3.781037 3.873 3.962963 4.050704 4.136 4.21863 4.29837 4.375 4.448297 4.518037 4.584 4.645963 4.703704 4.757 4.80563 4.84937 4.888 4.921297 4.949037 4.971 4.986963 4.996704 5 4.996292 4.985333 4.967375 4.942667 4.911458 4.874 4.830542 4.781333 4.726625 4.666666 4.601708 4.532 4.457792 4.379333 4.296875 4.210667 4.120958 4.028 3.932042 3.833333 3.732125 3.628667 3.523208 3.416 3.307291 3.197333 3.086375 2.974667 2.862458 2.75 2.637542 2.525333 2.413625 2.302667 2.192708 2.084 1.976792 1.871333 1.767876 1.666666 1.567958 1.472 1.379042 1.289333 1.203125 1.120667 1.042209 0.9679999 0.8982916 0.833333 0.7733746 0.7186666 0.6694579 0.6259999 0.588542 0.557333 0.5326257 0.5146666 0.5037088 0.5 + + + + + + + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + + + + + + + + + + + - - - 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 7.541666 7.583333 7.625 7.666666 7.708333 7.75 7.791666 7.833333 7.875 7.916666 7.958333 8 8.041667 8.083333 8.125 8.166667 8.208333 8.25 8.291667 8.333333 8.375 8.416667 8.458333 8.5 8.541667 8.583333 8.625 8.666667 8.708333 8.75 8.791667 8.833333 8.875 8.916667 8.958333 9 9.041667 9.083333 9.125 9.166667 9.208333 9.25 9.291667 9.333333 9.375 9.416667 9.458333 9.5 9.541667 9.583333 9.625 9.666667 9.708333 9.75 9.791667 9.833333 9.875 9.916667 9.958333 10 10.04167 10.08333 10.125 10.16667 10.20833 10.25 10.29167 10.33333 10.375 10.41667 + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 - + - - 1 0 0 0.004120371 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.0162963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.03625 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.06370372 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.09837963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.14 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.188287 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.242963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.30375 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.3703704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.4425463 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.52 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.6024537 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.6896296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.78125 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.8770372 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 0.9767129 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.08 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.18662 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.296296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.40875 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.523704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.640879 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.76 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 1.880787 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.002963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.12625 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.250371 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.375046 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.5 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.624954 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.74963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.87375 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 2.997037 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.119213 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.24 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.35912 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.476296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.591249 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.703704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.81338 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 3.92 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.023287 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.122963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.21875 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.310369 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.397546 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.48 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.557454 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.62963 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.69625 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.757037 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.811712 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.860001 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.90162 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.936296 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.96375 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.983704 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 4.995879 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.00412 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.016296 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.03625 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.063704 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.09838 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.14 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.188287 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.242963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.30375 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.37037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.442546 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.52 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.602454 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.68963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.78125 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.877037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -3.976713 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.08 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.18662 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.296297 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.40875 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.523704 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.64088 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.76 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -4.880787 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.002963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.12625 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.25037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.375046 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.5 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.624954 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.74963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.87375 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -5.997037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.119212 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.239999 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.35912 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.476296 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.59125 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.703704 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.813379 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -6.920001 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.023287 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.122963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.21875 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.310369 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.397546 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.48 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.557454 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.62963 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.69625 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.757037 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.811712 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.860001 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.90162 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.936296 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.963749 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.983705 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -7.995878 0 0 1 0 0 0 0 1 1 0 0 5 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.99588 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.983704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.96375 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.936296 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.90162 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.86 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.811713 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.757037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.69625 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.62963 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.557454 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.48 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.397546 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.31037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.21875 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.122963 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 4.023287 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.92 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.81338 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.703704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.59125 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.476296 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.359121 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.24 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 3.119213 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.997037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.87375 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.749629 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.624954 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.5 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.375046 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.25037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.12625 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 2.002963 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.880787 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.76 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.64088 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.523704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.408751 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.296296 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.18662 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 1.08 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.9767127 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.877037 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.78125 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.6896305 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.6024537 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.52 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.4425464 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.3703704 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.3037496 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.2429628 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.1882877 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.1399994 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.09837961 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.06370354 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.03625011 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.01629639 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0.004120827 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 + + 0 0.004120349 0.01629626 0.03624999 0.06370371 0.09837961 0.14 0.188287 0.242963 0.30375 0.3703704 0.4425463 0.5200001 0.6024537 0.6896296 0.78125 0.8770372 0.976713 1.08 1.18662 1.296296 1.40875 1.523704 1.640879 1.76 1.880787 2.002963 2.12625 2.25037 2.375046 2.5 2.624954 2.74963 2.87375 2.997037 3.119213 3.24 3.35912 3.476296 3.591249 3.703704 3.81338 3.92 4.023287 4.122963 4.21875 4.310369 4.397546 4.48 4.557454 4.62963 4.69625 4.757037 4.811712 4.860001 4.90162 4.936296 4.96375 4.983704 4.995879 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4.99588 4.983704 4.96375 4.936296 4.90162 4.86 4.811713 4.757037 4.69625 4.62963 4.557454 4.48 4.397546 4.31037 4.21875 4.122963 4.023287 3.92 3.81338 3.703704 3.59125 3.476296 3.359121 3.24 3.119213 2.997037 2.87375 2.749629 2.624954 2.5 2.375046 2.25037 2.12625 2.002963 1.880787 1.76 1.64088 1.523704 1.408751 1.296296 1.18662 1.08 0.9767127 0.8770371 0.78125 0.6896305 0.6024537 0.52 0.4425464 0.3703704 0.3037496 0.2429628 0.1882877 0.1399993 0.09837961 0.06370353 0.03625011 0.01629638 0.004120826 0 - - + + - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - + - - - - + + + + - + - - - - - 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 7.541666 7.583333 7.625 7.666666 7.708333 7.75 7.791666 7.833333 7.875 7.916666 7.958333 8 8.041667 8.083333 8.125 8.166667 8.208333 8.25 8.291667 8.333333 8.375 8.416667 8.458333 8.5 8.541667 8.583333 8.625 8.666667 8.708333 8.75 8.791667 8.833333 8.875 8.916667 8.958333 9 9.041667 9.083333 9.125 9.166667 9.208333 9.25 9.291667 9.333333 9.375 9.416667 9.458333 9.5 9.541667 9.583333 9.625 9.666667 9.708333 9.75 9.791667 9.833333 9.875 9.916667 9.958333 10 10.04167 10.08333 10.125 10.16667 10.20833 10.25 10.29167 10.33333 10.375 10.41667 + + + 0 0.04166662 0.08333331 0.125 0.1666666 0.2083333 0.25 0.2916666 0.3333333 0.375 0.4166666 0.4583333 0.5 0.5416667 0.5833333 0.625 0.6666667 0.7083333 0.75 0.7916667 0.8333333 0.875 0.9166667 0.9583333 1 1.041667 1.083333 1.125 1.166667 1.208333 1.25 1.291667 1.333333 1.375 1.416667 1.458333 1.5 1.541667 1.583333 1.625 1.666667 1.708333 1.75 1.791667 1.833333 1.875 1.916667 1.958333 2 2.041667 2.083333 2.125 2.166667 2.208333 2.25 2.291667 2.333333 2.375 2.416667 2.458333 2.5 2.541667 2.583333 2.625 2.666667 2.708333 2.75 2.791667 2.833333 2.875 2.916667 2.958333 3 3.041667 3.083333 3.125 3.166667 3.208333 3.25 3.291667 3.333333 3.375 3.416667 3.458333 3.5 3.541667 3.583333 3.625 3.666667 3.708333 3.75 3.791667 3.833333 3.875 3.916667 3.958333 4 4.041666 4.083333 4.125 4.166666 4.208333 4.25 4.291666 4.333333 4.375 4.416666 4.458333 4.5 4.541666 4.583333 4.625 4.666666 4.708333 4.75 4.791666 4.833333 4.875 4.916666 4.958333 5 5.041666 5.083333 5.125 5.166666 5.208333 5.25 5.291666 5.333333 5.375 5.416666 5.458333 5.5 5.541666 5.583333 5.625 5.666666 5.708333 5.75 5.791666 5.833333 5.875 5.916666 5.958333 6 6.041666 6.083333 6.125 6.166666 6.208333 6.25 6.291666 6.333333 6.375 6.416666 6.458333 6.5 6.541666 6.583333 6.625 6.666666 6.708333 6.75 6.791666 6.833333 6.875 6.916666 6.958333 7 7.041666 7.083333 7.125 7.166666 7.208333 7.25 7.291666 7.333333 7.375 7.416666 7.458333 7.5 - + - - 0.9999992 0 0.001294199 0 0 1 0 0 -0.001294199 0 0.9999992 0 0 0 0 1 0.9999869 0 0.005118608 0 0 1 0 0 -0.005118608 0 0.9999869 0 0 0 0 1 0.9999352 0 0.0113858 0 0 1 0 0 -0.0113858 0 0.9999352 0 0 0 0 1 0.9997998 0 0.02000786 0 0 1 0 0 -0.02000786 0 0.9997998 0 0 0 0 1 0.9995226 0 0.0308959 0 0 1 0 0 -0.0308959 0 0.9995226 0 0 0 0 1 0.9990333 0 0.04395952 0 0 1 0 0 -0.04395952 0 0.9990333 0 0 0 0 1 0.9982517 0 0.05910606 0 0 1 0 0 -0.05910606 0 0.9982517 0 0 0 0 1 0.9970895 0 0.07624008 0 0 1 0 0 -0.07624008 0 0.9970895 0 0 0 0 1 0.9954522 0 0.09526252 0 0 1 0 0 -0.09526252 0 0.9954522 0 0 0 0 1 0.993241 0 0.1160703 0 0 1 0 0 -0.1160703 0 0.993241 0 0 0 0 1 0.9903547 0 0.1385556 0 0 1 0 0 -0.1385556 0 0.9903547 0 0 0 0 1 0.9866911 0 0.1626056 0 0 1 0 0 -0.1626056 0 0.9866911 0 0 0 0 1 0.9821495 0 0.1881021 0 0 1 0 0 -0.1881021 0 0.9821495 0 0 0 0 1 0.9766314 0 0.2149212 0 0 1 0 0 -0.2149212 0 0.9766314 0 0 0 0 1 0.9700429 0 0.2429336 0 0 1 0 0 -0.2429336 0 0.9700429 0 0 0 0 1 0.962296 0 0.2720045 0 0 1 0 0 -0.2720045 0 0.962296 0 0 0 0 1 0.9533099 0 0.3019937 0 0 1 0 0 -0.3019937 0 0.9533099 0 0 0 0 1 0.9430127 0 0.3327569 0 0 1 0 0 -0.3327569 0 0.9430127 0 0 0 0 1 0.9313422 0 0.3641452 0 0 1 0 0 -0.3641452 0 0.9313422 0 0 0 0 1 0.9182477 0 0.3960066 0 0 1 0 0 -0.3960066 0 0.9182477 0 0 0 0 1 0.9036903 0 0.4281866 0 0 1 0 0 -0.4281866 0 0.9036903 0 0 0 0 1 0.8876443 0 0.4605297 0 0 1 0 0 -0.4605297 0 0.8876443 0 0 0 0 1 0.8700973 0 0.49288 0 0 1 0 0 -0.49288 0 0.8700973 0 0 0 0 1 0.8510513 0 0.5250825 0 0 1 0 0 -0.5250825 0 0.8510513 0 0 0 0 1 0.8305226 0 0.5569849 0 0 1 0 0 -0.5569849 0 0.8305226 0 0 0 0 1 0.808542 0 0.5884385 0 0 1 0 0 -0.5884385 0 0.808542 0 0 0 0 1 0.7851548 0 0.6192997 0 0 1 0 0 -0.6192997 0 0.7851548 0 0 0 0 1 0.7604203 0 0.6494312 0 0 1 0 0 -0.6494312 0 0.7604203 0 0 0 0 1 0.7344118 0 0.6787041 0 0 1 0 0 -0.6787041 0 0.7344118 0 0 0 0 1 0.7072155 0 0.7069981 0 0 1 0 0 -0.7069981 0 0.7072155 0 0 0 0 1 0.67893 0 0.734203 0 0 1 0 0 -0.734203 0 0.67893 0 0 0 0 1 0.6496651 0 0.7602206 0 0 1 0 0 -0.7602206 0 0.6496651 0 0 0 0 1 0.619541 0 0.7849643 0 0 1 0 0 -0.7849643 0 0.619541 0 0 0 0 1 0.5886871 0 0.808361 0 0 1 0 0 -0.808361 0 0.5886871 0 0 0 0 1 0.5572402 0 0.8303513 0 0 1 0 0 -0.8303513 0 0.5572402 0 0 0 0 1 0.5253443 0 0.8508898 0 0 1 0 0 -0.8508898 0 0.5253443 0 0 0 0 1 0.4931476 0 0.8699456 0 0 1 0 0 -0.8699456 0 0.4931476 0 0 0 0 1 0.4608027 0 0.8875026 0 0 1 0 0 -0.8875026 0 0.4608027 0 0 0 0 1 0.4284647 0 0.9035585 0 0 1 0 0 -0.9035585 0 0.4284647 0 0 0 0 1 0.3962889 0 0.9181259 0 0 1 0 0 -0.9181259 0 0.3962889 0 0 0 0 1 0.3644315 0 0.9312302 0 0 1 0 0 -0.9312302 0 0.3644315 0 0 0 0 1 0.3330471 0 0.9429102 0 0 1 0 0 -0.9429102 0 0.3330471 0 0 0 0 1 0.3022869 0 0.953217 0 0 1 0 0 -0.953217 0 0.3022869 0 0 0 0 1 0.2723002 0 0.9622123 0 0 1 0 0 -0.9622123 0 0.2723002 0 0 0 0 1 0.2432317 0 0.9699682 0 0 1 0 0 -0.9699682 0 0.2432317 0 0 0 0 1 0.2152215 0 0.9765652 0 0 1 0 0 -0.9765652 0 0.2152215 0 0 0 0 1 0.188404 0 0.9820916 0 0 1 0 0 -0.9820916 0 0.188404 0 0 0 0 1 0.1629089 0 0.9866411 0 0 1 0 0 -0.9866411 0 0.1629089 0 0 0 0 1 0.13886 0 0.990312 0 0 1 0 0 -0.990312 0 0.13886 0 0 0 0 1 0.1163755 0 0.9932053 0 0 1 0 0 -0.9932053 0 0.1163755 0 0 0 0 1 0.09556845 0 0.9954228 0 0 1 0 0 -0.9954228 0 0.09556845 0 0 0 0 1 0.07654665 0 0.997066 0 0 1 0 0 -0.997066 0 0.07654665 0 0 0 0 1 0.05941283 0 0.9982335 0 0 1 0 0 -0.9982335 0 0.05941283 0 0 0 0 1 0.04426661 0 0.9990197 0 0 1 0 0 -0.9990197 0 0.04426661 0 0 0 0 1 0.03120329 0 0.999513 0 0 1 0 0 -0.999513 0 0.03120329 0 0 0 0 1 0.02031552 0 0.9997936 0 0 1 0 0 -0.9997936 0 0.02031552 0 0 0 0 1 0.01169329 0 0.9999316 0 0 1 0 0 -0.9999316 0 0.01169329 0 0 0 0 1 0.005425979 0 0.9999853 0 0 1 0 0 -0.9999853 0 0.005425979 0 0 0 0 1 0.001601771 0 0.9999987 0 0 1 0 0 -0.9999987 0 0.001601771 0 0 0 0 1 3.07516e-4 0 0.9999999 0 0 1 0 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07516e-4 0.001294091 0.9999991 0 -3.97954e-7 0.9999992 -0.001294091 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07512e-4 0.005118181 0.9999868 0 -1.57392e-6 0.9999869 -0.005118181 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07496e-4 0.01138485 0.9999352 0 -3.50103e-6 0.9999352 -0.01138485 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07455e-4 0.02000619 0.9997998 0 -6.15223e-6 0.9997998 -0.02000619 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07369e-4 0.03089333 0.9995226 0 -9.5002e-6 0.9995227 -0.03089333 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.07219e-4 0.04395586 0.9990335 0 -1.35171e-5 0.9990335 -0.04395586 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.06979e-4 0.05910115 0.998252 0 -1.81746e-5 0.998252 -0.05910114 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.06621e-4 0.07623373 0.9970899 0 -2.34431e-5 0.99709 -0.07623373 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.06118e-4 0.0952546 0.9954529 0 -2.92923e-5 0.9954529 -0.09525459 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.05438e-4 0.1160607 0.9932421 0 -3.56905e-5 0.9932421 -0.1160607 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.04551e-4 0.1385441 0.9903562 0 -4.26046e-5 0.9903563 -0.1385441 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.03424e-4 0.1625922 0.9866933 0 -4.99997e-5 0.9866934 -0.1625922 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.02028e-4 0.1880866 0.9821524 0 -5.78397e-5 0.9821525 -0.1880866 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.00331e-4 0.2149035 0.9766352 0 -6.60863e-5 0.9766353 -0.2149035 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.98306e-4 0.2429137 0.9700478 0 -7.46999e-5 0.9700479 -0.2429137 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.95924e-4 0.2719823 0.9623022 0 -8.3639e-5 0.9623023 -0.2719823 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.93161e-4 0.3019693 0.9533176 0 -9.28605e-5 0.9533176 -0.3019693 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.89995e-4 0.3327302 0.943022 0 -1.0232e-4 0.9430221 -0.3327302 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.86406e-4 0.3641162 0.9313534 0 -1.11972e-4 0.9313535 -0.3641162 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.8238e-4 0.3959754 0.9182611 0 -1.21769e-4 0.9182611 -0.3959754 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.77904e-4 0.4281533 0.9037061 0 -1.31664e-4 0.9037061 -0.4281533 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.72971e-4 0.4604944 0.8876626 0 -1.4161e-4 0.8876626 -0.4604943 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.67576e-4 0.4928425 0.8701185 0 -1.51557e-4 0.8701185 -0.4928425 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.6172e-4 0.5250433 0.8510755 0 -1.61459e-4 0.8510755 -0.5250432 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.55408e-4 0.556944 0.83055 0 -1.71269e-4 0.8305501 -0.556944 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.48649e-4 0.5883961 0.8085728 0 -1.80941e-4 0.8085729 -0.588396 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.41458e-4 0.6192559 0.7851892 0 -1.90431e-4 0.7851893 -0.6192558 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.33853e-4 0.6493865 0.7604585 0 -1.99697e-4 0.7604586 -0.6493864 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.25857e-4 0.6786584 0.734454 0 -2.08699e-4 0.734454 -0.6786584 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.17494e-4 0.7069517 0.7072618 0 -2.17399e-4 0.7072618 -0.7069517 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.08798e-4 0.7341564 0.6789804 0 -2.25765e-4 0.6789805 -0.7341563 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.99799e-4 0.7601737 0.6497198 0 -2.33766e-4 0.6497198 -0.7601737 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.90537e-4 0.7849176 0.6196001 0 -2.41375e-4 0.6196001 -0.7849176 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.8105e-4 0.8083148 0.5887505 0 -2.4857e-4 0.5887505 -0.8083147 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.71381e-4 0.8303057 0.5573082 0 -2.55333e-4 0.5573082 -0.8303056 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.61574e-4 0.8508453 0.5254163 0 -2.61649e-4 0.5254164 -0.8508452 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.51674e-4 0.8699023 0.4932241 0 -2.67509e-4 0.4932241 -0.8699022 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.41729e-4 0.8874606 0.4608836 0 -2.72909e-4 0.4608836 -0.8874605 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.31786e-4 0.9035183 0.4285496 0 -2.77847e-4 0.4285496 -0.9035182 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.21893e-4 0.9180874 0.396378 0 -2.82327e-4 0.396378 -0.9180874 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.12097e-4 0.9311937 0.3645246 0 -2.86357e-4 0.3645247 -0.9311937 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.02447e-4 0.942876 0.3331437 0 -2.8995e-4 0.3331437 -0.942876 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 9.29891e-5 0.9531851 0.3023875 0 -2.9312e-4 0.3023875 -0.953185 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 8.37687e-5 0.9621829 0.2724041 0 -2.95887e-4 0.2724041 -0.9621829 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 7.48307e-5 0.9699413 0.243339 0 -2.98273e-4 0.243339 -0.9699413 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 6.62181e-5 0.9765409 0.215332 0 -3.00302e-4 0.215332 -0.9765409 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 5.79721e-5 0.9820699 0.1885171 0 -3.02002e-4 0.1885171 -0.9820698 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 5.01327e-5 0.986622 0.1630247 0 -3.03402e-4 0.1630247 -0.9866219 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 4.27381e-5 0.9902954 0.1389783 0 -3.04532e-4 0.1389783 -0.9902954 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.58245e-5 0.9931911 0.1164962 0 -3.05422e-4 0.1164962 -0.9931911 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.94265e-5 0.9954111 0.09569103 0 -3.06105e-4 0.09569103 -0.995411 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 2.35776e-5 0.9970564 0.07667098 0 -3.06611e-4 0.07667098 -0.9970564 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.83092e-5 0.998226 0.05953897 0 -3.06971e-4 0.05953897 -0.9982259 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.36518e-5 0.9990141 0.0443938 0 -3.07213e-4 0.0443938 -0.9990141 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 9.63502e-6 0.999509 0.03133173 0 -3.07365e-4 0.03133173 -0.999509 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 6.28701e-6 0.999791 0.02044447 0 -3.07452e-4 0.02044448 -0.999791 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 3.63583e-6 0.9999301 0.01182322 0 -3.07495e-4 0.01182322 -0.9999301 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.70875e-6 0.9999846 0.00555663 0 -3.07512e-4 0.00555663 -0.9999845 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 5.32749e-7 0.9999985 0.001732424 0 -3.07516e-4 0.001732424 -0.9999985 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.34854e-7 0.9999999 4.38527e-4 0 -3.07516e-4 4.38527e-4 -0.9999999 0 -0.9999999 0 3.07516e-4 0 0 0 0 1 1.34854e-7 1 -2.08699e-4 0 -3.07516e-4 -2.08699e-4 -0.9999999 0 -0.9999999 1.99033e-7 3.07516e-4 0 0 0 0 1 1.34854e-7 0.9999977 -0.002121288 0 -3.07516e-4 -0.002121288 -0.9999977 0 -0.9999999 7.87184e-7 3.07515e-4 0 0 0 0 1 1.34854e-7 0.9999862 -0.005255586 0 -3.07516e-4 -0.005255586 -0.9999862 0 -0.9999999 1.75103e-6 3.07511e-4 0 0 0 0 1 1.34854e-7 0.9999542 -0.009567883 0 -3.07516e-4 -0.009567883 -0.9999542 0 -0.9999999 3.07713e-6 3.07501e-4 0 0 0 0 1 1.34854e-7 0.9998873 -0.01501434 0 -3.07516e-4 -0.01501434 -0.9998872 0 -0.9999999 4.75199e-6 3.0748e-4 0 0 0 0 1 1.34854e-7 0.9997678 -0.02155096 0 -3.07516e-4 -0.02155095 -0.9997677 0 -0.9999999 6.76209e-6 3.07442e-4 0 0 0 0 1 1.34854e-7 0.9995756 -0.02913341 0 -3.07516e-4 -0.02913341 -0.9995755 0 -0.9999999 9.09379e-6 3.07382e-4 0 0 0 0 1 1.34854e-7 0.9992884 -0.03771707 0 -3.07516e-4 -0.03771706 -0.9992884 0 -0.9999999 1.17334e-5 3.07292e-4 0 0 0 0 1 1.34854e-7 0.9988828 -0.04725681 0 -3.07516e-4 -0.04725681 -0.9988827 0 -0.9999999 1.46669e-5 3.07166e-4 0 0 0 0 1 1.34854e-7 0.9983336 -0.05770704 0 -3.07516e-4 -0.05770704 -0.9983335 0 -0.9999999 1.78805e-5 3.06996e-4 0 0 0 0 1 1.34854e-7 0.9976152 -0.06902157 0 -3.07516e-4 -0.06902156 -0.9976151 0 -0.9999999 2.13598e-5 3.06774e-4 0 0 0 0 1 1.34854e-7 0.9967016 -0.08115354 0 -3.07516e-4 -0.08115354 -0.9967015 0 -0.9999999 2.50904e-5 3.06491e-4 0 0 0 0 1 1.34854e-7 0.995567 -0.09405546 0 -3.07516e-4 -0.09405545 -0.9955669 0 -0.9999999 2.90578e-5 3.0614e-4 0 0 0 0 1 1.34854e-7 0.9941857 -0.1076791 0 -3.07516e-4 -0.1076791 -0.9941857 0 -0.9999999 3.32471e-5 3.05714e-4 0 0 0 0 1 1.34854e-7 0.9925331 -0.1219754 0 -3.07516e-4 -0.1219754 -0.9925331 0 -0.9999999 3.76433e-5 3.05204e-4 0 0 0 0 1 1.34854e-7 0.9905856 -0.1368949 0 -3.07516e-4 -0.1368949 -0.9905855 0 -0.9999999 4.2231e-5 3.04603e-4 0 0 0 0 1 1.34854e-7 0.9883209 -0.1523872 0 -3.07516e-4 -0.1523872 -0.9883208 0 -0.9999999 4.69948e-5 3.03904e-4 0 0 0 0 1 1.34854e-7 0.9857185 -0.1684012 0 -3.07516e-4 -0.1684012 -0.9857185 0 -0.9999999 5.1919e-5 3.03102e-4 0 0 0 0 1 1.34854e-7 0.9827601 -0.1848855 0 -3.07516e-4 -0.1848855 -0.98276 0 -0.9999999 5.69878e-5 3.0219e-4 0 0 0 0 1 1.34854e-7 0.9794292 -0.2017881 0 -3.07516e-4 -0.2017881 -0.9794292 0 -0.9999999 6.21852e-5 3.01163e-4 0 0 0 0 1 1.34854e-7 0.9757122 -0.2190565 0 -3.07516e-4 -0.2190565 -0.9757121 0 -0.9999999 6.7495e-5 3.00018e-4 0 0 0 0 1 1.34854e-7 0.9715979 -0.2366382 0 -3.07516e-4 -0.2366382 -0.9715978 0 -0.9999999 7.29011e-5 2.9875e-4 0 0 0 0 1 1.34854e-7 0.967078 -0.2544802 0 -3.07516e-4 -0.2544802 -0.9670779 0 -0.9999999 7.83872e-5 2.97358e-4 0 0 0 0 1 1.34854e-7 0.9621473 -0.27253 0 -3.07516e-4 -0.27253 -0.9621472 0 -0.9999999 8.39372e-5 2.95839e-4 0 0 0 0 1 1.34854e-7 0.9568037 -0.2907349 0 -3.07516e-4 -0.2907349 -0.9568036 0 -0.9999999 8.95347e-5 2.94193e-4 0 0 0 0 1 1.34854e-7 0.9510482 -0.3090426 0 -3.07516e-4 -0.3090426 -0.9510481 0 -0.9999999 9.51639e-5 2.92421e-4 0 0 0 0 1 1.34854e-7 0.9448854 -0.3274013 0 -3.07516e-4 -0.3274013 -0.9448853 0 -0.9999999 1.00809e-4 2.90523e-4 0 0 0 0 1 1.34854e-7 0.9383229 -0.3457602 0 -3.07516e-4 -0.3457602 -0.9383229 0 -0.9999999 1.06453e-4 2.88503e-4 0 0 0 0 1 1.34854e-7 0.931372 -0.3640688 0 -3.07516e-4 -0.3640688 -0.931372 0 -0.9999999 1.12083e-4 2.86363e-4 0 0 0 0 1 1.34854e-7 0.9240472 -0.3822783 0 -3.07516e-4 -0.3822782 -0.9240472 0 -0.9999999 1.17681e-4 2.84108e-4 0 0 0 0 1 1.34854e-7 0.9163665 -0.4003403 0 -3.07516e-4 -0.4003403 -0.9163665 0 -0.9999999 1.23235e-4 2.81744e-4 0 0 0 0 1 1.34854e-7 0.908351 -0.4182087 0 -3.07516e-4 -0.4182087 -0.9083509 0 -0.9999999 1.28728e-4 2.79276e-4 0 0 0 0 1 1.34854e-7 0.9000251 -0.435838 0 -3.07516e-4 -0.435838 -0.9000251 0 -0.9999999 1.34149e-4 2.76714e-4 0 0 0 0 1 1.34854e-7 0.8914165 -0.4531849 0 -3.07516e-4 -0.4531849 -0.8914165 0 -0.9999999 1.39482e-4 2.74064e-4 0 0 0 0 1 1.34854e-7 0.8825557 -0.4702079 0 -3.07516e-4 -0.4702079 -0.8825557 0 -0.9999999 1.44716e-4 2.71337e-4 0 0 0 0 1 1.34854e-7 0.873476 -0.4868672 0 -3.07516e-4 -0.4868672 -0.873476 0 -0.9999999 1.49837e-4 2.68542e-4 0 0 0 0 1 1.34854e-7 0.8642137 -0.5031249 0 -3.07516e-4 -0.5031249 -0.8642136 0 -0.9999999 1.54836e-4 2.65692e-4 0 0 0 0 1 1.34854e-7 0.8548073 -0.5189455 0 -3.07516e-4 -0.5189455 -0.8548073 0 -0.9999999 1.59699e-4 2.62797e-4 0 0 0 0 1 1.34854e-7 0.845298 -0.5342951 0 -3.07516e-4 -0.5342951 -0.8452979 0 -0.9999999 1.64418e-4 2.59871e-4 0 0 0 0 1 1.34854e-7 0.8357287 -0.5491425 0 -3.07516e-4 -0.5491425 -0.8357287 0 -0.9999999 1.68983e-4 2.56926e-4 0 0 0 0 1 1.34854e-7 0.8261446 -0.5634582 0 -3.07516e-4 -0.5634581 -0.8261445 0 -0.9999999 1.73384e-4 2.53977e-4 0 0 0 0 1 1.34854e-7 0.8165925 -0.5772147 0 -3.07516e-4 -0.5772147 -0.8165924 0 -0.9999999 1.77613e-4 2.51038e-4 0 0 0 0 1 1.34854e-7 0.8071204 -0.5903868 0 -3.07516e-4 -0.5903868 -0.8071204 0 -0.9999999 1.81662e-4 2.48123e-4 0 0 0 0 1 1.34854e-7 0.7977782 -0.602951 0 -3.07516e-4 -0.602951 -0.7977782 0 -0.9999999 1.85525e-4 2.45248e-4 0 0 0 0 1 1.34854e-7 0.7886162 -0.6148858 0 -3.07516e-4 -0.6148857 -0.7886161 0 -0.9999999 1.89194e-4 2.42429e-4 0 0 0 0 1 1.34854e-7 0.7796856 -0.6261713 0 -3.07516e-4 -0.6261712 -0.7796855 0 -0.9999999 1.92663e-4 2.39682e-4 0 0 0 0 1 1.34854e-7 0.7710382 -0.6367889 0 -3.07516e-4 -0.6367889 -0.7710382 0 -0.9999999 1.95927e-4 2.37021e-4 0 0 0 0 1 1.34854e-7 0.7627261 -0.6467217 0 -3.07516e-4 -0.6467216 -0.7627261 0 -0.9999999 1.9898e-4 2.34463e-4 0 0 0 0 1 1.34854e-7 0.7548016 -0.6559531 0 -3.07516e-4 -0.6559531 -0.7548016 0 -0.9999999 2.01818e-4 2.32025e-4 0 0 0 0 1 1.34854e-7 0.7473165 -0.6644683 0 -3.07516e-4 -0.6644682 -0.7473164 0 -0.9999999 2.04436e-4 2.29722e-4 0 0 0 0 1 1.34854e-7 0.7403222 -0.6722522 0 -3.07516e-4 -0.6722522 -0.7403222 0 -0.9999999 2.06828e-4 2.2757e-4 0 0 0 0 1 1.34854e-7 0.7338696 -0.6792904 0 -3.07516e-4 -0.6792904 -0.7338696 0 -0.9999999 2.08992e-4 2.25585e-4 0 0 0 0 1 1.34854e-7 0.7280086 -0.6855679 0 -3.07516e-4 -0.6855679 -0.7280086 0 -0.9999999 2.10921e-4 2.23782e-4 0 0 0 0 1 1.34854e-7 0.7227878 -0.6910701 0 -3.07516e-4 -0.69107 -0.7227877 0 -0.9999999 2.12613e-4 2.22176e-4 0 0 0 0 1 1.34854e-7 0.7182543 -0.6957807 0 -3.07516e-4 -0.6957806 -0.7182543 0 -0.9999999 2.14061e-4 2.20781e-4 0 0 0 0 1 1.34854e-7 0.7144539 -0.6996825 0 -3.07516e-4 -0.6996825 -0.7144539 0 -0.9999999 2.1526e-4 2.19612e-4 0 0 0 0 1 1.34854e-7 0.7114298 -0.7027572 0 -3.07516e-4 -0.7027572 -0.7114297 0 -0.9999999 2.16205e-4 2.18681e-4 0 0 0 0 1 1.34854e-7 0.7092237 -0.7049835 0 -3.07516e-4 -0.7049834 -0.7092237 0 -0.9999999 2.16889e-4 2.18003e-4 0 0 0 0 1 1.34854e-7 0.7078741 -0.7063386 0 -3.07516e-4 -0.7063386 -0.7078741 0 -0.9999999 2.17306e-4 2.17588e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 + + -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3.00412 -3.016296 -3.03625 -3.063704 -3.09838 -3.14 -3.188287 -3.242963 -3.30375 -3.37037 -3.442546 -3.52 -3.602454 -3.68963 -3.78125 -3.877037 -3.976713 -4.08 -4.18662 -4.296297 -4.40875 -4.523704 -4.64088 -4.76 -4.880787 -5.002963 -5.12625 -5.25037 -5.375046 -5.5 -5.624954 -5.74963 -5.87375 -5.997037 -6.119212 -6.239999 -6.35912 -6.476296 -6.59125 -6.703704 -6.813379 -6.920001 -7.023287 -7.122963 -7.21875 -7.310369 -7.397546 -7.48 -7.557454 -7.62963 -7.69625 -7.757037 -7.811712 -7.860001 -7.90162 -7.936295 -7.963749 -7.983705 -7.995878 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 - - + + - - LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR + + LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR - + - - - - + + + + - + - 1 0 0 0 0 1 0 -8 0 0 1 0 0 0 0 1 - + 1 1 1 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 0 -8 0 + - 0.5 0 0 0 0 0.5 0 3 0 0 0.5 0 0 0 0 1 - + 0.5 0.5 0.5 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 0 3 0 + - 1.34854e-7 0.7074168 -0.7067966 0 -3.07516e-4 -0.7067966 -0.7074168 0 -0.9999999 2.17447e-4 2.17447e-4 0 0 0 0 1 - + 1 1 1 + 0 0 1 -89.97488 + 0 1 0 89.98238 + 1 0 0 45 + 0 0 0 + diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.fbx b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.fbx index 71d5e581ccdad30c827af640183177d3f7cc7472..bf8e57fc32ae886f2afa554771fc362646198d4d 100644 GIT binary patch delta 10349 zcmaia2{@G9|NhL__v~v#A;c`PB7t&$}S31gWlB-s_A zvLu8;h=l*lNbmc8e_hxAT*mcW=kqzA=RWtjpR*^WQ($MoRSaM>F9-w@1%p6@KM)1s zN3Q38F-V`C@PznRE~SyD-^CDDeR@K^<-haIU7h{?T=b<0`62(xr!(^O@$n2kFv^k< ztp85We|y3}AWRZikd8bX0ph|`)0=}S*$93Xi~#Bc4{(Cf6X-uej!9!&WCw#W(I;lX z41|K9HzyC!G6Pa#?7-aToVF2e1qi1S6J0WSg ze_a1YRf7y6AY@nufI_(;bh4xf8nOTyDi0}=1)f6BLr%y6oUkNrbwXti-}x`PoaBgf zLAvDt1e_C6C6Y-Rm4mbXOY?gX%YmAD2)7FTzw2jebrciVYmn{RP~>CP+7PJ1$+AY>CY1! zMbwCFLGo3Bn^NZ>GpfKlK_n%SWNtMeS{en>Py^bec_8*`z=Sk6S1{ofM5qwLkILM` z$;H#pT@#$81~ACLPVgfR-Y-rt{(k>0a5SN7A+#7P@t?Dk4=^dm#k=)83h~SQ510aV z5*Xi8K#Y(TId$9fQ^0#66}~|VQBlwpi#9D{C}R5az@-jM$|Hb_JZumL^*_)v)Jf2r z)k)At)k)C5s{ai-GlB@6Qy+BzozP_*LLZaG9S8d4#CXF9)jDjR|Db)1B%xhK05BiPi+B zu1f*;m5)Nu`oNS85Bb#1yT^ekV{XW@CV;!e3!%^gVpKUGLpneVo)sNNcpI_)6$E*O zgW21oB{RT$R4eY{vdTBb-bQp6sKRwsnCz#O@<%?oNY8S4Rr6M?2W7m!6!`XR4V`ta zvG+oIj>pAdBR5M`H?u(Rj1t@G4i%Zwy2~H?5ceb=*ZIJnOPK@qPpVU)9Fc=w6+5hI ze!QEjg}bv~bfRp~@Ucmw)~VO|INMC$?^d2!b36U;?M>%!pd)qCfYZ8rC*Vm&=SQ9K zMG@OTn0eo7k%0IKuV3}(ch_W}LzV^#x#_dm%#JGSecy=fXj|??sl{E^IG- zMm9Qpv`at)4(?9|2%ER$w>W;y$9>x_q1p<$-_ae{XY)}9P3M8B-DKVzPHet9ALLdI zW;&_zmSU)~|&@%@ZhuT1ZB(oSnGbdD`N+`6}{b3e5=qub9Z|FW+$ zSM%$E5yzaGEm1$|rtG+(@4wP$_=-#)F5Q1(t-TwrqavDg|9FUR*s8Edx3B1_f~pb6 zmVp&s%Rq??p-X73_MN0=D6ppYQ^^()M^%@8GAq>9=IaaH+5Eev>%q}`7nkOjyf}>n zEONyIvm3tfx{*6YG(D2+S)y)n_r1kBBr&+of2Z6T5;|02cwTm|;N-=m0_S9hxj?e8 zC}y_JH?+iZ9>D+x$_E=fM zxUP2g)%>{6TPcVBu}+bJbYV?JzYNQj^o1vv99Z4*p^Rc7`86#(XgLFpfa{Z%PU7}O z3sDK3<=ZuK=rQ=f21Vs?PVA5;t9dk4BwJj=Qc-sjhBFXR?@FO+S(5G6AJ5@N`=ctF zduL%o(ct{lRRf1Y!=H$iX%N$t-hq182@+;7aE-8V^10}$u?a8HAV<`Sw5@5@|@&j+eCSfP;VY<#4D2L9N)R6JTR z882p#h%dK_$7dSG;J=z(!sBNG@eOA@@nrWL@ioAz1}FL_n-G3jm>W;4a|GXTi3-1+ zwu{^HUc%)ikK=^E-MG&FM%)l(87{0M5BIY-2}ijYg&VeT!gX!v;G`y?xE6j6+>@gH zw$H3@+vw__v`IZpYO@TnX{#6!YTF!`ZN0vh*&6BtZS4UUwMgoBH{TfU!PYHks)c^p zI`u;`7p-n(NspjWvqRV&xr=yJ^#)O6L5t+Jfg;Nr%#jxjqmj+)8OTqVawN2`9SM_} zL^{0OK^CghqvZK{QKjMHD4eDW3UTo?>NCU^b!plg)kqVKQc_GniIJtEGG=b0?1u_a zZat4tNv|=es%|W*vArD?Ti1(P$s9q=IH^veRM{3#qYqb6#hgD;DsZqyt}2CwGmJ)K zmz+Uk7JEeFiaDExb_b_M5eu&dqXNIiCR9+P{l{^Q?*K|mlrr059!jSVq?w$AXzK$p z7D|vHePC5Zl$F?q|4Ac;q%Mt&fq{n9rM=Myq)T`q%Y;&@9B5sG12yOnnw*NDhO?f& zu0B$P0K^VXnWTfJ;OO^(o|Kf7r!X!O+{fNaX-7e?x2!MJVkJ{8Xnbyy7k0nRt9k`q zV8z0_QMG4#CoGSt%$;>CS4;iy5Ely8qO1KDWCj}4H~IcFb{^XMisuG0*LPsU`j|>A zx*)-lM(@duU=Pp$dNXR9yl}VJ@_{(n0!3!EB69uVV(bTTibJye@YuA`Ixde@~z1?(7=!I=*w3deASt za+$HwL*aCzHRgI_bM2GH0Qf{B*&s#JzUr|i`byQNx2D!jCW7HjdWfVZyH9tTN*yYj zx?pWhD`y9rfVxjj6?#9KT$aeOxu+Siw{CJ`H*v?XW}{-*sR0>m;U!gU(Yz-10j(j{ z%GD}Lt!HrL4$Yg6TqWhuFc{eCPG`=09xcEURrt9msK%i(?v8^v)QD|0&$ z`)=|E)&QJ@rCLkEwz%KIYT2Y%{D6Cmvmr^7`GzD-zA_|fl33gSq^vU}O`5-a zFF?{H)QF@>Z6lH<-x?qA7X5Ec66RtgO$LxODcoUn@+z3GbG38lc5=jc|BVJUhoF_3 z=UOrnf`Z96A7);SzaGlX(giHV@{1L8*cgjc=$X7jy~>bG=rn-21vz?Fln8I{uQf-t z(0@M%7;n;?@|(X^%;uK<@x43a=vVIj`0*R)8hr|G{><2_ zci*HWx-LH5rfpdpxF%^PprRDl-GLkQSsN&2abyq9c`P*d%u^N1UWT||sq}I-Rbj^s zvQob6rR8_bIeXE!}CYx*}ut3WC2QEVb9+}G&zFo<6urqNwvdG5KL zJ|}lQha$nSWOdG8L1V-5oGx_cEf9*Y+f*%y-mKc61VFdKX0}W~*-lhoC>jJ}f1ll~ zeKMwqSJ5MEXMcRn48#f3iwl5Xm?V5pi8O_GuK9PqX*S(9+ zLloe3Xo~S>g%9vB>QcOpQW>5_ssg{iREdxBslxAI6F?h%T2A|+?U0Uc2 zNw{`rNWx7#LliEM+Q1BXY)YC&-pfp21IF$7A^E1HX{3lLVHzn-zJjndB}^iT52>ca zX(SnF1p&k`@IZ8}NgD5WxlK;eILHhD=W`SMxXg$u=ifYcAm~?wjfp=!@8jPpZw4&S zi=cIlZ?_+3l^Evbuzy=ny_gUtS(DsKH?t8wbFEP^nYcL>a67zz2 z7?t$0q2=Dj-rR=U?ftUJYrFx?l`1rqFNDvY(%`Uupfx&ms$TTUoxTA^oZ4le5H5zYcj->Lj)g)O`D z=bWm~>>mkzl?m_eiU&SeKVt0@pglf*wozcxetfNx;e^Bn6W%R)BP(FdB8;4Ah&x3x z7VR_50}U9=lx70hF?J_BpVpe7QtFE*17)&YTds+2IbCF1SR1*BmvY8mOLj??+7Q7? z))UMb6P%LyNVEq_@|(Oa z|FbpvTz+AnMbmUkeo6#bJvr+u=*s9%Rer(dQ`e`5cY0|Bo@MP;8A`8U)3Gk4o2XXB zLKg|^wo5vb+AY%Fyb*o(2FU6<-X)8<-0c5AkIu~Aqr(^)?y`QeonAS*RrF;`R$QhX zeRneEiGg{8m)Y>R`qfoN-wWc_eUeW#6h|m()HrFcaoW z^mtd__5yrLb3Zi%TW0F4Zu|8YYLjTDl3}O5+Nayor6n(@GOIUO{#D#K&wo zShy}CJI%;VwXtzZ)lhqwaZN-Nqxt4K`n$mBBPG|t)ESOhf2n~v`Om5FYG~04&y(@4 zbW?+FvK5LM6EyYq3f9ODD0iaQ?e(u|F^??x1-d<(=6m%KtR zM|NR4`V9g!0(8H;EUvQb!%+g4*l*n!65UK2`0~`#%3U#I4lwpy=Anlk30glf_h>mm z)3Cho3cZrd9>1E>1y|ZGb?sh>fHyLtxC`ekGh>!qBswM`@a}PwFIjgqt9rsuTWft_ z&)^i~{YZ#XDgER|hD`N7y z+Q(=C)XM}(sK8=w-?3i~;10T*Qd2gx5gObdzCMcUb0_=q-l%Hl19`o@V%p87+a8{s zA~Vj^8t@ZvsukN!3YFcHy%53_2z$Fmw_L`7bH9#~rF4Kw{fe`>Dp3RBs9t@QOp zbQwDv`C7zU=&dkajK98Glkrl)Jy(G+CXw$QA>#5woekU09Avyfr3(24?uA)v?}W@O zg=~(RJbE>19dTD3%I@P^c_Cp_=o~GXK*;&R-CUl}M=NIE4qY66l&tpI>q0*TF#jdu z(SVlol|$WKf~wramTdI1rzn%f9J&h@?7SK5h7-YeA>AI|9?g6z zV!0;F9=v}&tJ#Zz)9d?uolsu3zkAJxU9RQ9l$D;1tG|9+f-|LvH+Wpi9_8-YmYqu4 zqT|tF|0U1&Vt(q4+@4j(k96TXYpb8WDJj~l_tJA?oON!nLuWAaW_!&0JM53EO{5am z(KB;poB`o)J)snmLI=*ea~+om%vKH+$7YkO=gD#XTEa5N*P z{8k8;otfi+KwIZ%Gxga=D^f6iBYD;KisP&6mz6Y5<5SPD-RP-jD`e2|-c<3xLQ)lK zS=e{G+jn=Rrd!#VZT!!)a9uUxzkb>}Zq4>3#r&;Yro7<>rKle5+Fq_#0UD{p%;qD@ z1u9-t8(GRLOtsp5l)NXME2MLs<2yo?Pv_5ibY}=&*1Ay~QtDAM>HtT%B$2ngWm$Cq z*Iyu?$Ui=bK<`s^4_T20I|gggV5eeD9PC(#iv3U81}1HI$ptiu1W5x}zV+_`td3BO zuyjD#9*95u-_tb09wBL(=1rQWvA3I?yc);_nmlii{`OV61txt~3LW%Loqk+ORu%&l z%t=hI$h^Qfp2`w@%*L5zP%pH)&ZfFNHIz%gxW$DNQ(Svgz4i|FTX4jUoNpj)YHmgH z(~Fas`<_SPpU?r;8!M?$zfKd@UZy+Oy{LGP6{%iK5GaWb68km&fMLc9QR)#FruQNN z&0tHL=V)yxmEgZ3fZ57(j;Q747#ehs%6S#~(s3-3t6d^zk4IU}+fiWh2hN}p0-Jd) zIc2V3%Gj!Zq5>L__!4*_Iw2k{!DqB@KjY(iW{{F;rxR_wa%5^XQ>r_v{@RZY4n5VV z*V%?M%AM{!BmI$N;^EmcAEvqeTgu5Sqy~Wapd>^PyT zmNzf!$gN;iSK<)GMvr07?7B{MF7JhBa@=AaQSX%<;kfwxt(6yZ>!knwG~dIwg;#Yw z)@~$}UazF;MUU6oO+_am%Mj5V}f~h>ZbqL`)_b0W}11xd4nv zTLvL|ya?x5ydVTt+RP{3j->ZiJCfd)>`1E;A}jw%(-%lHwoUL0DU#q#?0*a1-JT?P zb;kpSpA)+DKQp#)LI?umpr^k#10(dziJO55nQ^7XRyX>r8)|x-ZF(M7)GYY8wq|(^v}86>W4(>V~%sH5nqGoL%rSQFF*9s3H2zF&?4|<42Rwyg@_F*;^T$VKTJwka@AN$V$~l;9 zQ^y)fNhV`C=y|8-#$rlU=xi#H)sd0*WTNvw^$QKtTIHdw1i)>`?Pgkk!PLT zd%hdyDawyFeJ1R^Q1{?k)0P^*TYGEo(W-)D+M6}r#Zg*^)2g+2_|_52ApjZ1JDbRN zR8Ic=4W>sn&si4c+&0*kW(4LlwZ2XHWLqKwFQPwJB9)sb_U9?0Zgcic^X~*$(>9;AQ%z#x$xtq>ZI>TOjvjhVLu=zK?ukpu zIiirfDIR2pkFYp}iT873y)|iFF&E_!1CaOpOR~PJFoAmVg_VIbyYj4AzeJrtX8)Wv3fd`ayapY@{-v+`0^i1vA zLK|PJgffQJD7sa(!ph|GV4*UaTQnnS%~$WDo7dSt$P1@_?uR~(ar-5ZRR>|wx^N)l zrR;GwFc118srzQ=e{Wz823=bo3tz3oQq>@ATvCxtv8+ zCwb#y7*lqJZOZIE-)Sh~yj1O)^yvPX($salq#&+b(%XI$m8|1ByiImlZG}3Pezlf9 z_%TD)j=BpO>eCub!}+G;rX$;fcCMcrv=(T7Ei`VxDLjCwVf|#N@Li1~4vz1>TW-PJ zj(pvVHTZD;cA(_kGgE_xZMKxB=9qXJ=GNT&BAenH^JgcRpA;WUHLoOlZ9E*{ z24v2Bb(U<5yi+G&ZwSjT3|rtU`yd~_m7VDu1QQHm!7$K!)nHv9 zuzM$Lz9>H!%`vp`zZ{{jFc% zpEb^}&i7LdpT>j-yR!s6r{>x9l=Pr_(;4V7VOh1R1qvQA^7yrYXV%B>AUJCGE0N_b zY|C$SiUEoM#>F!}BZW)V*EbO4Z)mre3}9^weiumH;-d?sZt=|p(wg^HCo^QznY8Bh zV@U)7f;fK2f-`B&8{|w{^MXJRok<5L6V3-KUTP$1#hc|x>OUEdBtl93r=bgBSBDSm zLhL*tGVYid{A&o!mdAn6$`6Eg?_i#gW^~fmlv2GnaN#?3Y&_$mT!?C z=gyrjjg9kIh)A&9bfkK{zG;k^P*%8_cDC#@o5gIGfJAp*t;Y9A3v~C(t93xmBVGfU z^)u)7B+eD6HeZU)^I5dOSaPb}^8DCcbGh=}plZi?dvCk>x|Qa;<2M(r^l&s>TWOy< zV@@ZSy{l?jJFvbmP~Fvj>~Qk zw;7q^?d5H+*)ZnDZD%VjA0&B{PXDBgX>X~Go^h0cj3*8BeBA}r?I^05Duv}^at3I9*#Z;#ihp&6js6W(wnNebu_`>l# z|8d!|mZ_SqvPmYL&+Ts-f0)rM6)R@1Scdj7!5&fv%c}`&3a^L;T|i%n6K33FSI>*` zNW(kzObhmYe?%c)m9u5nu1V={47KCqtCL(wAYujwpKVz<_hsu!j|9eJ)>nQi_n z#Ts}ysh%Io`=kHeFG{8759R`(uD|g0cs_v77)U$$;Y(GRJYGWI6=dRJCPPua^6bY7 zMPX|(%`F})#yj*sTLaO&Vd-Xg=CXN)duGb;yeV`KL$nvh=YW3l|2t1SY?&W~79z|O zmq4uhv6@IEhz^BZG}S;pW7R^A8R#INZ|EUs=?#&!NhZkR0CS{BttGO;%nn(p>x9g` z<%awu1A!Ej_~>}8}~N-VN_D;}vCnTU*JOGd)*sYs644CIpOZKMbM4pN8f zK2n{w7)ed`2i3T?i;f7?J9CvcpdpfcN6(Qc?+4e zy^TB;zk_5Q`-K$R+(lB4>>*<>?Gp-uQ2D=nKD_rKX`R!Tq;)M{qSnEx#H&TT5`hG# z--%As-_MV5w}^1K9h~nA%C43Kv$7HIF%a#9jsJu6;?QzE;reC2P89Pxylgy7KSvmfC$ z7$JvvLjtU6PMFz(OwJhoaU<3;`-}pZos8Wdl#P-Av+@xS%t;{*oy-Zlnjn`bE3HEh z;`!6xJgkEcJ&30PfAg@(C3ukNCGNqJJPv^l5G;YxU{;1d79t_pY0_XeGEl&8Y{VT{ zQmI3yLu~Lv58@K{ZyweThaSW=!QVV=;t3u^Y;wf0lH_rStu5eyL?|Km9}@q#5!)v_ zRUXVm_U-T`#DS9(;?U_3D1YEVRnUZfmUur8WcWWGHpI+72@>?@5kzs;$=fy9f*@SN z=T5p~Mx}W%D2Q;qjC9{(b|H n!$O?Au>@cy+F)U_dBTH$23R5cz8;t-+fENGn0-YLob>+yzIH=} literal 84236 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 j{jt|IpgH043#?b-Fu)gQ;LHdOn6=818Y diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf index 7927093bb..90a80390a 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.gltf @@ -20,7 +20,7 @@ "name" : "Rotating cube" }, { - "mesh" : 0, + "mesh" : 1, "name" : "Scaling cube", "translation" : [ 0, @@ -29,7 +29,7 @@ ] }, { - "mesh" : 0, + "mesh" : 2, "name" : "Translating cube", "translation" : [ 0, @@ -52,9 +52,9 @@ "name" : "Rotation animation", "samplers" : [ { - "input" : 4, + "input" : 10, "interpolation" : "LINEAR", - "output" : 5 + "output" : 11 } ] }, @@ -71,9 +71,9 @@ "name" : "Scaling animation", "samplers" : [ { - "input" : 4, + "input" : 10, "interpolation" : "LINEAR", - "output" : 6 + "output" : 12 } ] }, @@ -90,16 +90,16 @@ "name" : "Translation animation", "samplers" : [ { - "input" : 4, + "input" : 10, "interpolation" : "LINEAR", - "output" : 7 + "output" : 13 } ] } ], "meshes" : [ { - "name" : "Cube", + "name" : "Cube 1", "primitives" : [ { "attributes" : { @@ -110,6 +110,32 @@ "indices" : 3 } ] + }, + { + "name" : "Cube 2", + "primitives" : [ + { + "attributes" : { + "POSITION" : 4, + "NORMAL" : 5, + "TEXCOORD_0" : 6 + }, + "indices" : 3 + } + ] + }, + { + "name" : "Cube 3", + "primitives" : [ + { + "attributes" : { + "POSITION" : 7, + "NORMAL" : 8, + "TEXCOORD_0" : 9 + }, + "indices" : 3 + } + ] } ], "accessors" : [ @@ -150,6 +176,62 @@ { "bufferView" : 4, "componentType" : 5126, + "count" : 24, + "max" : [ + 1, + 1, + 1 + ], + "min" : [ + -1, + -1, + -1 + ], + "type" : "VEC3" + }, + { + "bufferView" : 5, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 6, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 7, + "componentType" : 5126, + "count" : 24, + "max" : [ + 1, + 1, + 1 + ], + "min" : [ + -1, + -1, + -1 + ], + "type" : "VEC3" + }, + { + "bufferView" : 8, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 9, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 10, + "componentType" : 5126, "count" : 181, "max" : [ 7.5 @@ -160,19 +242,19 @@ "type" : "SCALAR" }, { - "bufferView" : 5, + "bufferView" : 11, "componentType" : 5126, "count" : 181, "type" : "VEC4" }, { - "bufferView" : 6, + "bufferView" : 12, "componentType" : 5126, "count" : 181, "type" : "VEC3" }, { - "bufferView" : 7, + "bufferView" : 13, "componentType" : 5126, "count" : 181, "type" : "VEC3" @@ -201,29 +283,59 @@ }, { "buffer" : 0, - "byteLength" : 724, + "byteLength" : 288, "byteOffset" : 840 }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1128 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 1416 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1608 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 1896 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 2184 + }, + { + "buffer" : 0, + "byteLength" : 724, + "byteOffset" : 2376 + }, { "buffer" : 0, "byteLength" : 2896, - "byteOffset" : 1564 + "byteOffset" : 3100 }, { "buffer" : 0, "byteLength" : 2172, - "byteOffset" : 4460 + "byteOffset" : 5996 }, { "buffer" : 0, "byteLength" : 2172, - "byteOffset" : 6632 + "byteOffset" : 8168 } ], "buffers" : [ { - "byteLength" : 8804, - "uri" : "data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAAAAAAAKuqKj2rqqo9AAAAPquqKj5VVVU+AACAPlVVlT6rqqo+AADAPlVV1T6rquo+AAAAP6uqCj9VVRU/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" + "byteLength" : 10340, + "uri" : "data:application/octet-stream;base64,AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AAADAAkAAAAJAAYACAAKABUACAAVABMAFAAXABEAFAARAA4ADQAPAAQADQAEAAIABwASAAwABwAMAAEAFgALAAUAFgAFABAAAACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgL8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAPwAAgD8AAIC/AACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAvwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAvwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAvwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIA/AACAPwAAAAAAAACAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAAAAAAAAgL8AAACAAAAAAAAAAAAAAIC/AACAPwAAAAAAAACAAAAAAAAAAAAAAIC/AAAAAAAAgD8AAACAAACAPwAAAAAAAACAAADAPgAAgD8AAAA+AACAPgAAwD4AAAAAAAAgPwAAgD8AACA/AAAAAAAAYD8AAIA+AADAPgAAQD8AAAA+AAAAPwAAwD4AAEA/AAAgPwAAQD8AACA/AABAPwAAYD8AAAA/AADAPgAAgD4AAMA+AACAPgAAwD4AAIA+AAAgPwAAgD4AACA/AACAPgAAID8AAIA+AADAPgAAAD8AAMA+AAAAPwAAwD4AAAA/AAAgPwAAAD8AACA/AAAAPwAAID8AAAA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgL8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgD8AAIA/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgL8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAvwAAgD8AAIC/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgL8AAIA/AACAPwAAgD8AAIA/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" } ] } diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md new file mode 100644 index 000000000..f33fa5276 --- /dev/null +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md @@ -0,0 +1,23 @@ +# Exporting the animation files + +1. Open the `exported-animation.blend` file, make desired changes and save the blend + file. +2. Export to Collada: + - set *Forward Axis* to *Y* + - set *Up Axis* to *Z* + - in the *Anim* tab: + - enable *Include Animations* + - set *Key Type* to *Samples* + - overwrite the `exported-animation.dae` file +3. Export to FBX: + - set *Scale* to 0.01 + - enable *Bake Animation* +4. Export to glTF: + - set *Format* to *glTF Embedded (.gltf)* + - in the *Animation* field: + - enable *Animation* + - in the *Animation* field: + - enable *Always Sample Animations* +5. Verify the animation plays back correctly +6. Commit the updated `exported-animation.*` files, do a sanity check that the sizes + didn't change much. From c56079be4e090ef73dcd0c9c4b6170e5b8927f66 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Sun, 27 Jun 2021 22:53:13 +0200 Subject: [PATCH 28/29] AssimpImporter: oops --- .../AssimpImporter/Test/AssimpImporterTest.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index 20e8ad023..b100590e6 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -373,7 +373,7 @@ bool supportsAnimation(const Containers::StringView fileName) { const unsigned int version = aiGetVersionMajor()*100 + aiGetVersionMinor(); CORRADE_INTERNAL_ASSERT(fileName.hasSuffix(".dae") || fileName.hasSuffix(".fbx")); /* That's as far back as I checked, both Collada and FBX animations supported */ - return version > 302; + return version >= 302; } } @@ -482,9 +482,9 @@ void AssimpImporterTest::animation() { constexpr Vector3 rotationData[KeyCount]{ {0.0f, 0.0f, 0.0f}, - {0.0f, 0.0f, Float{Rad(-90.0_degf)}}, - {Float{Rad(90.0_degf)}, 0.0f, Float{Rad(-90.0_degf)}}, - {Float{Rad(135.0_degf)}, 0.0f, Float{Rad(-90.0_degf)}} + {0.0f, 0.0f, Float(Rad(-90.0_degf))}, + {Float(Rad(90.0_degf)), 0.0f, Float(Rad(-90.0_degf))}, + {Float(Rad(135.0_degf)), 0.0f, Float(Rad(-90.0_degf))} }; constexpr Vector3 scalingData[KeyCount]{ @@ -501,6 +501,8 @@ void AssimpImporterTest::animation() { for(UnsignedInt i = 0; i < Containers::arraySize(keys); i++) { player.advance(keys[i]); + for(AnimationNode& n : nodes) + data.correctAnimationNode(n); const Vector3 rotation{(nodes[0].rotation * initialRotation[0].inverted()).toEuler()}; /* For formats with non-zero initial rotation, we need to apply it to get the correct scale even though that object originally From ae5b7be7755ea1b9aca738c939d90800e19785ab Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Mon, 28 Jun 2021 02:26:11 +0200 Subject: [PATCH 29/29] AssimpImporter: test Collada rotation --- .../Test/AssimpImporterTest.cpp | 45 +++++++------------ .../AssimpImporter/Test/exported-animation.md | 6 ++- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp index b100590e6..2936c7578 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp +++ b/src/MagnumPlugins/AssimpImporter/Test/AssimpImporterTest.cpp @@ -157,14 +157,12 @@ void correctAnimationNodeDefault(AnimationNode&) { } void correctAnimationNodeCollada(AnimationNode& node) { /* Blender's Collada exporter doesn't seem to apply axis change - inside animations correctly. Flip it manually, consistent with + inside animations correctly. Do it manually, consistent with export up and forward axis (see exported-animation.md): y = z, z = -y */ - /** @todo try the Godot Collada exporter: - https://github.com/godotengine/collada-exporter */ - node.translation = Vector3{node.translation.x(), node.translation.z(), -node.translation.y()}; - /** @todo correct rotation, currently untested in animation() for Collada */ - node.scaling = Vector3{node.scaling.x(), node.scaling.z(), node.scaling.y()}; + const Quaternion correction = Quaternion::rotation(-90.0_degf, Vector3::xAxis()); + node.translation = correction.transformVector(node.translation); + node.rotation = correction * node.rotation; } constexpr struct { @@ -454,16 +452,17 @@ void AssimpImporterTest::animation() { animationData[i] = animation->release(); } - /* 4 keyframes at 0/60/120/180, exported at 24fps (60/24 = 2.5, etc.). */ + /* Check values at known keyframes: + 4 keyframes at 0/60/120/180, exported at 24fps (60/24 = 2.5, etc.). */ constexpr UnsignedInt KeyCount = 4; constexpr Float keys[KeyCount]{0.0f, 2.5f, 5.0f, 7.5f}; CORRADE_VERIFY(player.duration().contains({ keys[0], keys[Containers::arraySize(keys) - 1] })); player.play(0.0f); - /* Get initial rotation. Some formats (e.g. FBX) might have rotated meshes, - with nodes transformed to make up for it. We need this to check the rotation - from key 0 to key i. */ + /* Some Blender exporters (e.g. FBX) and our manual Collada correction + flip axes by adding a non-identity default rotation to all nodes. Store + them so we can later compare against the rotation from key 0 to key i. */ Quaternion initialRotation[Containers::arraySize(nodes)]; player.advance(keys[0]); @@ -472,49 +471,39 @@ void AssimpImporterTest::animation() { initialRotation[i] = nodes[i].rotation; } - /* Check values */ constexpr Vector3 translationData[KeyCount]{ {0.0f, 0.0f, 3.0f}, {5.0f, 0.0f, 3.0f}, {5.0f, 0.0f, 8.0f}, {0.0f, 0.0f, 8.0f} }; - constexpr Vector3 rotationData[KeyCount]{ {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, Float(Rad(-90.0_degf))}, {Float(Rad(90.0_degf)), 0.0f, Float(Rad(-90.0_degf))}, {Float(Rad(135.0_degf)), 0.0f, Float(Rad(-90.0_degf))} }; - constexpr Vector3 scalingData[KeyCount]{ {1.0f, 1.0f, 1.0f}, {5.0f, 1.0f, 1.0f}, {1.0f, 5.0f, 1.0f}, {0.5f, 0.5f, 0.5f} }; - - /* Be lenient when checking the interpolated output; resampling during - export can make things be off by quite a bit. */ - constexpr Vector3 Epsilon{0.05f}; - const bool isCollada = Containers::StringView{data.suffix}.hasSuffix(".dae"); - + for(UnsignedInt i = 0; i < Containers::arraySize(keys); i++) { player.advance(keys[i]); for(AnimationNode& n : nodes) data.correctAnimationNode(n); + + /* Rotation from initial to current key */ const Vector3 rotation{(nodes[0].rotation * initialRotation[0].inverted()).toEuler()}; - /* For formats with non-zero initial rotation, we need to apply it - to get the correct scale even though that object originally - has no rotation animation targetting it */ + /* Apply possible non-identity rotation to get the correct scale */ const Vector3 scaling = Math::abs(nodes[1].rotation.transformVector(nodes[1].scaling)); const Vector3& translation = nodes[2].translation; - { - /* I'm not sure how to correct the rotation to account for the axis swap. See - correctAnimationNodeCollada() for more info. */ - CORRADE_EXPECT_FAIL_IF(isCollada && i > 0, "Collada rotation values are wrong"); - CORRADE_VERIFY(Math::abs(rotation - rotationData[i]) < Epsilon); - } + + /* Be lenient, resampling during export takes its toll */ + constexpr Vector3 Epsilon{0.05f}; + CORRADE_VERIFY(Math::abs(rotation - rotationData[i]) < Epsilon); CORRADE_VERIFY(Math::abs(scaling - scalingData[i]) < Epsilon); CORRADE_VERIFY(Math::abs(translation - translationData[i]) < Epsilon); } diff --git a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md index f33fa5276..e3a1b0943 100644 --- a/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md +++ b/src/MagnumPlugins/AssimpImporter/Test/exported-animation.md @@ -8,16 +8,18 @@ - in the *Anim* tab: - enable *Include Animations* - set *Key Type* to *Samples* - - overwrite the `exported-animation.dae` file + - overwrite the `exported-animation.dae` file 3. Export to FBX: - set *Scale* to 0.01 - enable *Bake Animation* + - overwrite the `exported-animation.fbx` file 4. Export to glTF: - set *Format* to *glTF Embedded (.gltf)* - in the *Animation* field: - enable *Animation* - in the *Animation* field: - enable *Always Sample Animations* -5. Verify the animation plays back correctly + - overwrite the `exported-animation.gltf` file +5. Verify the animations play back correctly 6. Commit the updated `exported-animation.*` files, do a sanity check that the sizes didn't change much.